Ідентифікація мовця з ECAPA-TDNN та FAISS

Уявіть: в аудіозаписі кілька голосів, і потрібно точно визначити, хто з них — ваш клієнт. Стандартна діаризація лише розділяє мовлення за мовцями, але не називає імен. Ідентифікація мовця вирішує це завдання: за голосовим відбитком (ембеддингом) ми знаходимо особу в базі відомих дикторів. За 5 років

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1439
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    997
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1264
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1002

Уявіть: в аудіозаписі кілька голосів, і потрібно точно визначити, хто з них — ваш клієнт. Стандартна діаризація лише розділяє мовлення за мовцями, але не називає імен. Ідентифікація мовця вирішує це завдання: за голосовим відбитком (ембеддингом) ми знаходимо особу в базі відомих дикторів. За 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 робочий день. Залиште заявку — ми проведемо демонстрацію роботи системи на ваших даних.