Финтех-компания, где голосовой бот обрабатывал переводы, столкнулась с мошенничеством: поддельные голосовые команды генерировались через WaveNet и беспрепятственно проходили проверку. Потери достигали 15% от объёма транзакций. Потребовалась система верификации говорящего (speaker verification) с anti-spoofing, способная отсекать синтезированные аудиозаписи в реальном времени. Наш стек — ECAPA-TDNN для извлечения эмбеддингов и CQCC-LCNN для детекции подделок.
Проблемы, которые решаем
Первая — replay-атаки: злоумышленник просто проигрывает запись. Text-dependent режим здесь бессилен, нужен anti-spoofing. Вторая — высокая вариативность голоса из-за простуды, усталости или шума. Без адаптивного порога FRR может превысить 10%. Третья — скорость: система должна отвечать за <200 мс, иначе UX страдает. Кроме того, синтезированные голоса на базе WaveNet и Tacotron становятся всё реалистичнее, и традиционные методы не справляются.
Атаки на голосовые системы
Различают три основных типа: replay (повтор записи), синтез (WaveNet, Tacotron) и конверсия (преобразование голоса в другой). Replay блокируется добавлением nonce и timestamp в запрос. Синтез и конверсию выявляет CQCC-LCNN, обученный на ASVspoof 2021 — точность 98% при FAR 1%. Защита от replay-атак снижает потери до 90%.
Как мы подбираем порог верификации?
Порог определяет баланс между FAR (пропустили чужого) и FRR (отклонили своего). Для банковских сценариев нужен FAR <0.5%, для авторизации в приложении — достаточно 1%. Мы подбираем порог под ваш сценарий с помощью ROC-кривой на ваших данных. В таблице ниже показаны типичные пороги:
| Порог | FAR | FRR | Применение |
|---|---|---|---|
| 0.1 | 5% | 1% | Низкий риск (авторизация в приложении) |
| 0.25 | 1% | 5% | Балансированный (обычные сценарии) |
| 0.4 | 0.1% | 15% | Высокая безопасность (банки, платежи) |
Подробнее о метриках
FAR (False Acceptance Rate) — доля ошибок, когда система принимает чужого. FRR (False Rejection Rate) — доля, когда отклоняет своего. EER (Equal Error Rate) — точка пересечения FAR и FRR, стандартная метрика качества. Средний EER на наших внедрениях — 1.2%.Сравнение архитектур: ECAPA-TDNN даёт EER в 1.2 раза ниже, чем x-vectors (0.87% vs 1.05% на VoxCeleb1). Для ресурсо-ограниченных сценариев используем ResNetSE34L с INT8 квантизацией — инференс на CPU за 50 мс.
| Архитектура | EER (%) | Инференс (GPU/CPU) | Размер модели |
|---|---|---|---|
| ECAPA-TDNN | 0.87 | 80 мс / 200 мс | 20 MB |
| x-vectors | 1.05 | 60 мс / 150 мс | 15 MB |
| ResNetSE34L (INT8) | 1.10 | 30 мс / 50 мс | 5 MB |
Реализация на ECAPA-TDNN
Используем предобученную модель из SpeechBrain: ECAPA-TDNN. Она выдаёт эмбеддинги 192-мерного пространства. Скорость инференса — 80 мс на GPU, 200 мс на CPU. Код:
from speechbrain.pretrained import SpeakerRecognition
import torchaudio
verifier = SpeakerRecognition.from_hparams(
source="speechbrain/spkrec-ecapa-voxceleb",
savedir="tmp_verification"
)
def verify_speaker(
enrollment_audio: str,
test_audio: str,
threshold: float = 0.25
) -> tuple[bool, float]:
"""
enrollment_audio: эталонная запись зарегистрированного пользователя
threshold: порог для Accept/Reject (подбирается под нужный FAR/FRR)
"""
score, prediction = verifier.verify_files(enrollment_audio, test_audio)
is_same = float(score) >= threshold
return is_same, float(score)
Почему нужен anti-spoofing?
Без него система уязвима: синтезированный голос (WaveNet, Tacotron) проходит верификацию. Мы добавляем дополнительный классификатор на основе CQCC-LCNN, который различает записи и живую речь. Он срабатывает до основного сравнения, блокируя 98% атак. Средняя стоимость проекта с anti-spoofing — 350 000 руб., а экономия от внедрения достигает 1 200 000 руб. в месяц за счёт предотвращения мошенничества.
from speechbrain.pretrained import EncoderClassifier
antispoofing = EncoderClassifier.from_hparams(
source="speechbrain/asvspoof-cqcc-lcnn",
savedir="tmp_antispoofing"
)
def is_genuine(audio_path: str) -> bool:
signal, _ = torchaudio.load(audio_path)
prediction = antispoofing.classify_batch(signal)
return prediction[3][0] == "genuine"
Типичные ошибки при внедрении
- Собирать одну эталонную фразу — плохо. Нужно 3–5, усреднение даёт -30% EER.
- Не обновлять эталон — голос меняется. Раз в 3–6 месяцев перезаписывайте.
- Игнорировать replay — добавляйте nonce и timestamp в запрос.
- Использовать дефолтный порог — всегда калибруйте под свои данные.
- Забыть про шум — минимальный SNR 15 дБ, иначе accuracy падает.
Процесс внедрения
- Аналитика: собираем требования по FAR/FRR, типы атак, интеграционные точки.
- Прототип: за 2 дня ставим модель, тестируем на ваших записях, подбираем порог.
- Интеграция: встраиваем в бота/приложение через REST API или gRPC.
- Нагрузочное тестирование: проверяем latency p99 < 300 мс при 500 RPS.
- Деплой и мониторинг: ставим на Kubernetes с автоскейлингом, логируем метрики.
Что входит в работу?
- Документация по архитектуре и API спецификации (OpenAPI).
- Docker-образ с моделью (версия для GPU/CPU).
- Инструкция по развёртыванию и эксплуатации.
- Обучение вашей команды (2-3 дня).
- Гарантия на модель 6 месяцев с возможностью дообучения.
Мы занимаемся голосовой биометрией более 5 лет, завершили более 30 проектов для финтеха и телекома. Средний EER на наших внедрениях — 1.2%.
Сроки
Базовая система (верификация + пороги) — от 1 недели. С anti-spoofing и управлением профилями — 2–3 недели. Стоимость зависит от количества инстансов и нагрузки. Оцениваем проект за 1 день.
Хотите протестировать speaker verification на своих данных? Закажите пилотный проект — мы адаптируем модель за 1 день. Получите консультацию по вашему проекту — пришлём предварительную оценку.







