Представьте: в аудиозаписи несколько голосов, и нужно точно определить, кто из них — ваш клиент. Стандартная диаризация лишь разделяет речь по говорящим, но не называет имён. Идентификация говорящего решает эту задачу: по голосовому отпечатку (эмбеддингу) мы находим личность в базе известных дикторов. За 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 секунды.
Если вы столкнулись с одной из этих проблем — свяжитесь с нами, и мы предложим решение.
Как работает идентификация говорящего?
Система состоит из трёх этапов:
- Регистрация (enrollment) — для каждого диктора собираем 3-10 аудиосэмплов, извлекаем эмбеддинги через ECAPA-TDNN и усредняем.
- Поиск (inference) — на лету вычисляем эмбеддинг из аудио, сравниваем с базой через косинусное расстояние.
- 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% данных для валидации.
Как мы внедряем систему: пошагово
- Аудитория и сбор данных — анализ сценариев использования, сбор голосовых сэмплов клиентов (согласие на обработку).
- Проектирование архитектуры — выбор модели (ECAPA-TDNN / x-vector), настройка FAISS-индекса, определение threshold.
- Реализация — написание пайплайна, интеграция с вашим API/приложением (REST, gRPC).
- Тестирование — валидация на реальных записях, метрики precision/recall, нагрузочное тестирование.
- Деплой и поддержка — размещение на сервере/в облаке, мониторинг latency, обучение вашей команды.
Что входит в работу
- Исходный код пайплайна идентификации (Python, PyTorch)
- FAST API-сервер для идентификации и регистрации
- Документация по развёртыванию и настройке
- Интеграция с вашим приложением (1-2 точки входа)
- Обучение команды (2 часа онлайн)
- Поддержка в течение 1 месяца после сдачи
Сроки реализации
Базовая система идентификации: от 1 недели. С FAISS-индексом и управлением базой голосов: от 2 недель. Полный цикл с интеграцией и тестированием: 2-4 недели.
Свяжитесь с нами для консультации и оценки вашего проекта — подберём оптимальное решение под вашу задачу. Получите бесплатную оценку за 1 рабочий день. Оставьте заявку — мы проведем демонстрацию работы системы на ваших данных.







