Разработка AI-системы голосовой биометрии для верификации клиента
Голосовая биометрия заменяет секретные вопросы и PIN-коды для идентификации клиента. Пользователь просто говорит — система сравнивает голос с эталоном в базе. Применяется в банках, колл-центрах, мобильных приложениях.
Архитектура системы голосовой биометрии
from dataclasses import dataclass
import torch
from speechbrain.pretrained import SpeakerRecognition
@dataclass
class BiometricProfile:
customer_id: str
voice_embeddings: list # несколько записей для надёжности
enrollment_date: str
last_updated: str
enrollment_quality: float # 0-1
class VoiceBiometricSystem:
def __init__(self):
self.model = SpeakerRecognition.from_hparams(
source="speechbrain/spkrec-ecapa-voxceleb",
savedir="tmp_biometric"
)
self.db = BiometricDatabase()
self.anti_spoofing = AntiSpoofingModel()
async def enroll_customer(
self,
customer_id: str,
audio_samples: list[bytes] # 3–5 записей по 5–15 сек
) -> BiometricProfile:
"""Регистрируем голосовой профиль клиента"""
embeddings = []
quality_scores = []
for audio in audio_samples:
# Проверка качества записи
quality = self.assess_audio_quality(audio)
if quality < 0.5:
raise ValueError(f"Низкое качество записи: SNR={quality:.2f}")
embedding = self.extract_embedding(audio)
embeddings.append(embedding)
quality_scores.append(quality)
profile = BiometricProfile(
customer_id=customer_id,
voice_embeddings=embeddings,
enrollment_date=datetime.utcnow().isoformat(),
last_updated=datetime.utcnow().isoformat(),
enrollment_quality=sum(quality_scores) / len(quality_scores)
)
await self.db.save_profile(profile)
return profile
async def verify_customer(
self,
customer_id: str,
audio: bytes,
threshold: float = 0.75
) -> dict:
"""Верифицируем клиента по голосу"""
# 1. Anti-spoofing проверка
is_genuine = await self.anti_spoofing.check(audio)
if not is_genuine:
return {
"verified": False,
"reason": "synthetic_voice_detected",
"score": 0
}
# 2. Загружаем профиль
profile = await self.db.get_profile(customer_id)
if not profile:
return {"verified": False, "reason": "no_profile", "score": 0}
# 3. Сравниваем с каждым образцом в профиле
test_embedding = self.extract_embedding(audio)
scores = []
for enrolled_embedding in profile.voice_embeddings:
score = self.cosine_similarity(test_embedding, enrolled_embedding)
scores.append(score)
max_score = max(scores)
avg_score = sum(scores) / len(scores)
final_score = max_score * 0.6 + avg_score * 0.4
return {
"verified": final_score >= threshold,
"score": round(final_score, 4),
"threshold": threshold,
"confidence": "high" if final_score > 0.85 else "medium" if final_score > 0.75 else "low"
}
Пассивная vs активная биометрия
Активная — клиент произносит заданную фразу («Мой голос — мой пароль»): EER 0.5–1.5%, высокая надёжность.
Пассивная — клиент говорит что угодно (разговор с оператором): EER 2–5%, более удобна, но ниже безопасность.
Требования к минимальной длительности аудио
MINIMUM_AUDIO_REQUIREMENTS = {
"enrollment": 5.0, # секунд минимум на каждый образец
"verification": 3.0, # секунд для надёжной верификации
"passive_verification": 8.0 # при пассивном режиме
}
Соответствие требованиям
152-ФЗ «О персональных данных»: голосовые биометрические данные — специальная категория. Требуется явное согласие клиента, раздельное хранение, право на удаление.
Сроки: биометрическая система верификации — 6–8 недель. С anti-spoofing и compliance — 3–4 месяца.







