Режим на детекторе речи вместо диаризации

Диаризация занимала 79 % времени, а её метку мы не используем: на записи
с одним микрофоном голоса не расходятся, роли расставляет LLM по смыслу.
Silero VAD решает единственную нужную задачу и делает это вчетверо быстрее.

Замер на 205 минутах: x16 -> x60, слов на 1,8 % меньше. Семь записей
из восьми в пределах +-4 %, на одной теряется 19 %.

Отдельно найдено: max_speech_duration у Silero по умолчанию 20 с, и на
таких кусках распознавание теряет текст. Снижение до 6 с даёт 6-8 п.п.
полноты бесплатно. Диаризация сохранена настройкой diarize.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Vladimir Bryzgalov
2026-08-17 13:36:01 +05:00
co-authored by Claude Opus 5
parent b2bad9d8e6
commit 5d576dd3c4
7 changed files with 132 additions and 14 deletions
+11
View File
@@ -52,6 +52,15 @@ threads = 0
# в очередь вместо параллельной работы. Каждый процесс держит свою копию
# моделей, это около 1 ГБ памяти на процесс.
workers = 1
# Разделять ли запись по голосам (pyannote). На записи с одним микрофоном
# на столе голоса не расходятся: метка говорящего оказывается случайной
# в семи случаях из восьми. Роли всё равно расставляет LLM по смыслу текста,
# поэтому по умолчанию работает только детектор речи.
# Замер на 205 минутах реальных записей: без диаризации в 4,3 раза быстрее
# (x16 -> x60), слов на 1,8 % меньше. Семь записей из восьми в пределах
# +-4 %, на одной теряется 19 % - там голоса очень тихие. true - если такие
# записи для вас типичны или нужны метки говорящих.
diarize = false
# Ожидаемое число говорящих в записи. 0 = определять автоматически
# (на реальных звонках работает плохо, для диалога ставьте 2).
speakers = 2
@@ -106,6 +115,7 @@ class Settings:
workers: int = 0
speakers: int = 2
normalize: bool = True
diarize: bool = False
recover_gaps: bool = True
max_upload_mb: int = 500
keep_results_hours: float = 72.0
@@ -193,6 +203,7 @@ def load_settings(config_path: Path | None = None) -> Settings:
workers=int(proc.get("workers", 1)),
speakers=int(proc.get("speakers", 2)),
normalize=bool(proc.get("normalize", True)),
diarize=bool(proc.get("diarize", False)),
recover_gaps=bool(proc.get("recover_gaps", True)),
max_upload_mb=int(proc.get("max_upload_mb", 500)),
keep_results_hours=float(proc.get("keep_results_hours", 72)),