Реалізація ідентифікації промовця (Speaker Identification) Speaker Identification — визначення особистості промовця з бази відомих голосів. На відміну від діаризації («хто говорив колись»), тут треба відповісти «хто ця людина». Застосовується в системах автентифікації, персоналізованих помічників, моніторингу ефіру. ### Архітектура системи```
Audio → VAD → Speaker Encoder → Embedding → Similarity Search → Identity
(ECAPA-TDNN) (d-vector) (cosine / ANN)
### Вилучення speaker embeddingspython
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 # сохраняем в базу
### Пошук по базі голосівpython
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"







