Перейти к основному содержимому

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 от noiseControlled channel
Classical features + linear headПрозрачный baselineОграниченная capacityУчебный KWS, edge CPU
Small CNN/DS-CNNЛучше локальные patternsTraining/runtime сложнееДостаточно labeled audio
Full ASR + text ruleПереиспользует ASRБольше latency/costOpen 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

Затем:

  1. Измените frame/hop и измерьте число windows.
  2. Добавьте sine noise к synthetic waveform; проверьте finite features.
  3. Постройте FAR/FRR для thresholds 0.3, 0.5, 0.8.
  4. Добавьте 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: