Реализация диаризации говорящих (Speaker Diarization)
Диаризация — задача «кто говорил когда» без предварительного знания голосов. Необходима для транскрипции совещаний, интервью, судебных заседаний — везде, где нужно атрибутировать каждую реплику конкретному говорящему.
Современный стек
pyannote.audio 3.x — state-of-the-art open-source решение с DER (Diarization Error Rate) 7–12% на стандартных датасетах:
from pyannote.audio import Pipeline
import torch
pipeline = Pipeline.from_pretrained(
"pyannote/speaker-diarization-3.1",
use_auth_token="HF_TOKEN"
)
pipeline.to(torch.device("cuda"))
diarization = pipeline(
"meeting.wav",
min_speakers=2,
max_speakers=6
)
for segment, track, speaker in diarization.itertracks(yield_label=True):
print(f"[{segment.start:.2f}s → {segment.end:.2f}s] {speaker}")
Слияние диаризации с транскрипцией
from faster_whisper import WhisperModel
def transcribe_with_diarization(audio_path: str) -> list[dict]:
# 1. Транскрибируем
whisper = WhisperModel("large-v3", device="cuda")
segments, _ = whisper.transcribe(audio_path, word_timestamps=True)
# 2. Диаризуем
diarization = pipeline(audio_path)
# 3. Сопоставляем по временным меткам
result = []
for seg in segments:
seg_midpoint = (seg.start + seg.end) / 2
speaker = "UNKNOWN"
for turn, _, spk in diarization.itertracks(yield_label=True):
if turn.start <= seg_midpoint <= turn.end:
speaker = spk
break
result.append({
"speaker": speaker,
"start": seg.start,
"end": seg.end,
"text": seg.text
})
return result
Качество по числу говорящих
| Число говорящих | DER (pyannote 3.1) |
|---|---|
| 2 | 5–8% |
| 4 | 8–12% |
| 6 | 12–18% |
| 8+ | 15–25% |
Облачные альтернативы
- AssemblyAI Diarization: $0.012/мин, до 10 спикеров
- Google STT: $0.008/мин, до 6 спикеров
- AWS Transcribe: $0.029/мин, до 10 спикеров
Сроки: интеграция pyannote + Whisper — 3–5 дней. Оптимизация под конкретный тип записи — до 2 недель.







