Speech ML
Результат главы
После главы вы сможете:
- различить VAD, keyword spotting, ASR и endpointing;
- объяснить, как waveform превращается в overlapping log-mel windows;
- корректно моделировать
silence,unknownи target keywords; - выбрать threshold через FAR/FRR и product cost;
- разложить streaming voice latency и failure recovery.
Voice agent — несколько систем, не одна модель
| Компонент | Вопрос | Типичный output |
|---|---|---|
| VAD | Есть ли сейчас речь? | speech probability / segment |
| KWS | Произнесено ли ограниченное ключевое слово? | keyword + confidence |
| Endpointing | Пользователь закончил turn? | end-of-turn event |
| ASR | Какие слова произнесены? | transcript + timestamps |
| NLU/agent | Что это значит и что делать? | intent/tool/final decision |
| TTS | Как озвучить ответ? | audio stream |
Смешивание этих задач создаёт плохие метрики. Word error rate ASR не объясняет false wakeups KWS; точный transcript не гарантирует хороший endpoint и наоборот.
Sampling, windows и streaming
Waveform — последовательность amplitude samples. При 16 kHz за секунду приходит 16 000 значений. Модель обычно не ждёт бесконечный stream: runtime режет его на overlapping windows.
window = 25 ms = 400 samples at 16 kHz
hop = 10 ms = 160 samples
overlap = 240 samples
Overlap сохраняет события на границах, но повторяет compute. Большой hop дешевле, однако ухудшает temporal resolution.
streaming_windows хранит хвост предыдущего chunk и создаёт те же полные frames, что contiguous framing. Это важный regression contract: network chunk boundaries не должны менять features.
Log-mel features
Упрощённый pipeline:
Mel scale сжимает frequency axis ближе к человеческому восприятию; log сжимает dynamic range. Важнее формулы operational parity:
- одинаковые sample rate/channel policy;
- одинаковые window/hop/n_fft/n_mels;
- одинаковое normalization;
- одинаковое handling коротких clips;
- versioned preprocessing рядом с model artifact.
Helios lab читает mono/stereo WAV, нормализует integer PCM и строит log-mel matrix без тяжёлого speech framework.
silence и unknown — обязательные classes
Наивная KWS dataset содержит только target words. Тогда любая музыка, кашель или незнакомое слово вынуждены стать одним из keywords.
Минимальная taxonomy:
- target keywords: например
stop,operator,confirm; silence: background/room noise без речи;unknown: речь или звук, не являющиеся target keyword.
Нужно также hard-negative data: похожие слова, разные speakers, microphones, compression, overlapping speech. Просто добавить один zero waveform как silence недостаточно.
FAR, FRR и threshold
Для одного keyword:
FAR = false accepts / actual negatives
FRR = false rejects / actual positives
False accept для operator создаёт лишний handoff; для confirm payment может быть недопустим. False reject заставляет повторить слово или перейти к кнопке. Threshold выбирается по product cost и slice metrics, а не по максимальной общей accuracy.
Проверяйте:
- FAR на час background audio, не только на balanced clips;
- FRR по speakers/accents/noise/device;
- detection latency;
- repeated trigger suppression;
- calibration/threshold drift после смены microphone pipeline.
Endpointing и latency budget
Voice turn latency складывается:
audio buffering
+ VAD/endpoint delay
+ ASR partial/final delay
+ model/tool latency
+ TTS first-byte latency
Уменьшить один компонент недостаточно, если endpoint ждёт лишнюю секунду. Streaming partials позволяют начать retrieval раньше, но provisional transcript может измениться. Effectful tool нельзя commit’ить по нестабильному partial без final intent/policy check.
Data augmentation
Полезные преобразования:
- room/background noise;
- gain variation;
- small time shift;
- reverberation;
- codec/resampling artifacts;
- speed perturbation в допустимом диапазоне.
Каждая augmentation должна моделировать ожидаемый channel. Слишком сильная augmentation меняет label; один и тот же исходный clip и его варианты должны оставаться в одном group split.
Варианты модели
| Подход | Плюсы | Минусы | Когда |
|---|---|---|---|
| Energy/rule VAD | Малый latency/compute | Плохо отделяет speech от noise | Controlled channel |
| Classical features + linear head | Прозрачный baseline | Ограниченная capacity | Учебный KWS, edge CPU |
| Small CNN/DS-CNN | Лучше локальные patterns | Training/runtime сложнее | Достаточно labeled audio |
| Full ASR + text rule | Переиспользует ASR | Больше latency/cost | Open vocabulary уже нужен |
Лабораторный KeywordSpotter — sklearn head над заранее подготовленными features. Он показывает contract и не претендует на production SOTA.
Helios и telehealth-аналог
Helios voice support использует VAD/endpointing для turn boundary, ASR для open question и KWS operator как быстрый escalation signal. В telehealth KWS не диагностирует заболевание: он может обнаружить ограниченное emergency phrase и перевести в safety workflow, где policy и человек принимают решение.
Failure recovery:
- низкая confidence → переспрос/кнопка;
- repeated false wakeups → временно отключить KWS и оставить manual control;
- ASR outage → DTMF/text fallback;
- noisy channel → human handoff;
- latency budget exceeded → shorter response/degraded route.
Public Speech Commands
Google Speech Commands — полезный benchmark limited-vocabulary recognition и распространяется по CC BY 4.0. Он англоязычный и не является доказательством качества для вашего языка, акцентов, медицинской лексики или телефонного codec.
cd examples/helios_ml
uv run --frozen python scripts/fetch_public_data.py speech-commands
Downloader сохраняет archive и provenance metadata, но не распаковывает недоверенный tar автоматически.
Лабораторный CLI обучается на отдельном synthetic train split и сообщает только evaluation_accuracy, evaluation_false_accept_rate и evaluation_false_reject_rate на held-out evaluation split. Эти числа помечены synthetic-held-out-lab: разделение исправляет очевидную утечку, но маленькая fixture не становится production-оценкой речи, акцентов и шума.
Лаборатория
cd examples/helios_ml
uv run --frozen pytest tests/test_speech.py
uv run --frozen python scripts/train_keyword_spotter.py
Затем:
- Измените frame/hop и измерьте число windows.
- Добавьте sine noise к synthetic waveform; проверьте finite features.
- Постройте FAR/FRR для thresholds
0.3,0.5,0.8. - Добавьте
unknown, похожий на target; почему balanced accuracy не заменяет false accepts per hour?
Self-check
- Какой компонент определяет конец turn?
- Network chunks меняют framing?
- Есть silence, unknown и hard negatives?
- Split изолирует speaker/original clip?
- Threshold отражает цену false action?
- Offline и serving preprocessing идентичны?
- Какой fallback доступен без audio model?
Источники
Проверено 2026-08-30: