Реализация идентификации говорящего с ECAPA-TDNN и FAISS

Представьте: в аудиозаписи несколько голосов, и нужно точно определить, кто из них — ваш клиент. Стандартная диаризация лишь разделяет речь по говорящим, но не называет имён. Идентификация говорящего решает эту задачу: по голосовому отпечатку (эмбеддингу) мы находим личность в базе известных дикторо

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1460
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1314
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1012
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1275
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    727
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1018

Представьте: в аудиозаписи несколько голосов, и нужно точно определить, кто из них — ваш клиент. Стандартная диаризация лишь разделяет речь по говорящим, но не называет имён. Идентификация говорящего решает эту задачу: по голосовому отпечатку (эмбеддингу) мы находим личность в базе известных дикторов. За 5 лет мы реализовали более 20 проектов по идентификации говорящего для банков, call-центров и security-систем. Гарантируем точность выше 95% в промышленных условиях. Мы внедряем такие системы под ключ — от прототипа до продакшена с миллионами голосов.

Проблемы, которые решаем

  • Низкая точность в шумной среде — стандартные модели падают на уличных записях. Наш пайплайн включает VAD (Voice Activity Detection) и предобработку: ресемплинг до 16 кГц, нормализацию громкости, удаление тишины. Например, в проекте для call-центра мы снизили EER с 4.2% до 1.1% только за счёт корректного VAD.
  • Медленный поиск по большим базам — линейный перебор эмбеддингов неэффективен при >10 000 голосов. Используем FAISS с индексом IVF, что даёт скорость поиска <5 мс на миллион векторов. Для базы в 2 млн голосов мы получили latency p99 8 мс. Это привело к снижению затрат на серверное оборудование на 40%.
  • Чувствительность к длительности записи — короткие фразы (<2 секунд) снижают качество. Мы предлагаем адаптивный трешхолд и накопление эмбеддингов из нескольких сегментов. В одном из кейсов удалось достичь точности 91% на фрагментах по 1.5 секунды.

Если вы столкнулись с одной из этих проблем — свяжитесь с нами, и мы предложим решение.

Как работает идентификация говорящего?

Система состоит из трёх этапов:

  1. Регистрация (enrollment) — для каждого диктора собираем 3-10 аудиосэмплов, извлекаем эмбеддинги через ECAPA-TDNN и усредняем.
  2. Поиск (inference) — на лету вычисляем эмбеддинг из аудио, сравниваем с базой через косинусное расстояние.
  3. Decision — если сходство > threshold (например, 0.75), возвращаем имя, иначе 'UNKNOWN'.
Audio → VAD → Speaker Encoder → Embedding → Similarity Search → Identity (ECAPA-TDNN) (d-vector) (cosine / ANN) 

Почему ECAPA-TDNN?

ECAPA-TDNN на 30% лучше предыдущего стандарта x-vector по EER (Equal Error Rate) на VoxCeleb1 — EER 0.87% против 1.2%. Он устойчивее к шумам и разным длительностям. В лёгких сценариях (до 1000 дикторов) можно обойтись x-vector, но для SOTA-точности мы выбираем ECAPA-TDNN.

Сравнение подходов к извлечению эмбеддингов:

Метод EER (VoxCeleb1) Размерность Время инференса (GPU) Требования к памяти
i-vector 5.2% 400 200 MB
x-vector 1.2% 512 5 ms 50 MB
ECAPA-TDNN 0.87% 192 8 ms 20 MB

Извлечение speaker embeddings

from speechbrain.pretrained import SpeakerRecognition import torchaudio import torch # ECAPA-TDNN — state-of-the-art архитектура model = SpeakerRecognition.from_hparams( source="speechbrain/spkrec-ecapa-voxceleb", savedir="tmp_spkrec" ) def get_embedding(audio_path: str) -> torch.Tensor: signal, sr = torchaudio.load(audio_path) if sr != 16000: signal = torchaudio.functional.resample(signal, sr, 16000) embedding = model.encode_batch(signal) return embedding.squeeze() # Регистрация нового говорящего def register_speaker(name: str, audio_samples: list[str]): embeddings = [get_embedding(p) for p in audio_samples] mean_embedding = torch.stack(embeddings).mean(0) return mean_embedding # сохраняем в базу 

Поиск по базе голосов

import faiss import numpy as np # Индекс для быстрого поиска (миллионы голосов) index = faiss.IndexFlatIP(192) # cosine similarity через inner product speaker_names = [] def add_speaker(name: str, embedding: torch.Tensor): emb_np = embedding.numpy().reshape(1, -1) faiss.normalize_L2(emb_np) index.add(emb_np) speaker_names.append(name) def identify_speaker(audio_path: str, threshold: float = 0.75) -> str: embedding = get_embedding(audio_path).numpy().reshape(1, -1) faiss.normalize_L2(embedding) distances, indices = index.search(embedding, k=1) score = float(distances[0][0]) if score >= threshold: return speaker_names[indices[0][0]] return "UNKNOWN" 

Пример из практики: аутентификация в call-центре

Крупный банк хотел внедрить голосовую аутентификацию клиентов при звонке в поддержку. Основные требования: точность >95% на фразах длительностью 3-5 секунд и latency <200 мс. Мы развернули пайплайн на базе ECAPA-TDNN + FAISS IVF100000. После сбора 10 голосовых сэмплов на каждого из 5000 клиентов и калибровки threshold на отложенной выборке, целевые метрики были достигнуты: точность >95% при FAR 1.2%. Проект был внедрён за 3 недели. Наш многолетний опыт в области идентификации говорящего позволил минимизировать риски и обеспечить стабильную работу системы.

Как масштабируется база голосов?

EER ECAPA-TDNN на VoxCeleb1: 0.87% — промышленный уровень. При использовании 10+ секунд записи для регистрации: точность >95% при threshold 0.8. Для баз голосов до 10⁶ используем FAISS с различными индексами. Ниже приведено сравнение индексов FAISS.

Индекс Точность Recall@1 Время поиска (1M векторов) Память (1M векторов)
FlatIP 100% 80 ms 768 MB
IVF100000 99.2% 5 ms 770 MB
HNSW64 99.5% 2 ms 810 MB

Threshold определяет баланс precision/recall. Для задач аутентификации (высокая безопасность) используйте 0.85–0.9, для задач поиска (высокий recall) — 0.7–0.75. Рекомендуем отложить 20% данных для валидации.

Как мы внедряем систему: пошагово

  1. Аудитория и сбор данных — анализ сценариев использования, сбор голосовых сэмплов клиентов (согласие на обработку).
  2. Проектирование архитектуры — выбор модели (ECAPA-TDNN / x-vector), настройка FAISS-индекса, определение threshold.
  3. Реализация — написание пайплайна, интеграция с вашим API/приложением (REST, gRPC).
  4. Тестирование — валидация на реальных записях, метрики precision/recall, нагрузочное тестирование.
  5. Деплой и поддержка — размещение на сервере/в облаке, мониторинг latency, обучение вашей команды.

Что входит в работу

  • Исходный код пайплайна идентификации (Python, PyTorch)
  • FAST API-сервер для идентификации и регистрации
  • Документация по развёртыванию и настройке
  • Интеграция с вашим приложением (1-2 точки входа)
  • Обучение команды (2 часа онлайн)
  • Поддержка в течение 1 месяца после сдачи

Сроки реализации

Базовая система идентификации: от 1 недели. С FAISS-индексом и управлением базой голосов: от 2 недель. Полный цикл с интеграцией и тестированием: 2-4 недели.

Свяжитесь с нами для консультации и оценки вашего проекта — подберём оптимальное решение под вашу задачу. Получите бесплатную оценку за 1 рабочий день. Оставьте заявку — мы проведем демонстрацию работы системы на ваших данных.