Реализация идентификации говорящего (Speaker Identification)

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Реализация идентификации говорящего (Speaker Identification)
Средняя
от 1 недели до 3 месяцев
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

Реализация идентификации говорящего (Speaker Identification)

Speaker Identification — определение личности говорящего из базы известных голосов. В отличие от диаризации («кто говорил когда»), здесь нужно ответить «кто этот человек». Применяется в системах аутентификации, персонализированных ассистентах, мониторинге эфира.

Архитектура системы

Audio → VAD → Speaker Encoder → Embedding → Similarity Search → Identity
                  (ECAPA-TDNN)    (d-vector)    (cosine / ANN)

Извлечение 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"

Производительность

EER (Equal Error Rate) ECAPA-TDNN на VoxCeleb1: 0.87% — промышленный уровень. При использовании 10+ секунд записи для регистрации: точность >95% при threshold 0.8.

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

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