Реализация идентификации говорящего (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 недели.







