AI-инжиниринг
Speech-to-Text: Whisper, Deepgram, Browser API - распознавание речи в production
Цели урока
- Понять разницу между batch STT (Whisper) и streaming STT (Deepgram) и выбрать подходящий для задачи
- Научиться транскрибировать аудио через OpenAI Whisper API с timestamps и субтитрами
- Реализовать real-time транскрипцию через Deepgram WebSocket API с interim/final results
- Построить NestJS endpoint для загрузки аудио с валидацией формата и размера
- Оптимизировать точность STT через language hints, prompts, audio preprocessing и LLM post-processing
Whisper от OpenAI (сентябрь 2022) обогнал Google Speech по WER на большинстве языков - и вышел open-source. Это не просто API. Это конец эпохи когда STT стоил `0.024 USD/мин` и требовал enterprise-контракт. За несколько месяцев цена упала в 4 раза, качество выросло, а барьер входа исчез. Deepgram Nova-2 ответил: `0.0059 USD/мин`, 300ms latency, streaming из коробки. Рынок STT перекроился за год.
- Telegram транскрибирует голосовые сообщения для Premium-пользователей - миллионы запросов в день через собственную STT-инфраструктуру
- Zoom генерирует live captions и meeting summaries - streaming STT с speaker diarization в реальном времени
- Otter.ai и Notion AI транскрибируют встречи с автоматическим summarization через LLM pipeline - batch Whisper + GPT-4o-mini пост-обработка
- AssemblyAI строит на Whisper продукт с PII redaction, sentiment analysis, speaker labels - всё отдельные задачи поверх базовой транскрипции
От Dragon к Whisper: 30 лет распознавания речи
**1990-е**: Dragon NaturallySpeaking - первый массовый STT, `150 USD` за лицензию, требовал часы обучения на голос пользователя, работал только на настольных ПК. **2012**: Google Speech API - первый облачный STT, REST API, но платный и с ограничениями. **2016**: Google запускает публичный Speech-to-Text API - `0.024 USD/мин`, enterprise-tier. **2019-2021**: AWS Transcribe, Azure Speech - аналогичная цена, разные языки. **Сентябрь 2022**: OpenAI выпускает Whisper на GitHub (чекпоинт large-v3 выходит позже, в ноябре 2023). Apache 2.0. Лучший WER в классе. Бесплатно для self-hosted. Hosted API - `0.006/мин`. Рынок STT перестал быть enterprise-монополией за один день.
Предварительные знания
STT-ландшафт: от Whisper до облачных сервисов
2022 год. Google Speech-to-Text - лидер рынка, `0.024 USD` за минуту, enterprise-контракт для нормального WER. AWS Transcribe - `0.024 USD.` Microsoft Azure - аналогично. Барьер входа реальный: хочешь распознавание речи в продукте - плати или строй своё.
Сентябрь 2022. OpenAI публикует Whisper - и кладёт его на GitHub. Open-source, Apache 2.0. WER (word error rate) на большинстве языков лучше, чем у Google. И 0 долларов за лицензию. За несколько месяцев Whisper стал стандартом - не потому что маркетинг, а потому что в бенчмарках он побеждал.
| Провайдер | Модель | Latency | Цена за минуту | Streaming |
|---|---|---|---|---|
| OpenAI | Whisper large-v3 | Batch (2-10 сек) | 0.006/мин | Нет |
| Deepgram | Nova-2 | Real-time (~300ms) | 0.0059/мин | Да (WebSocket) |
| Google Cloud | Chirp 2 | Real-time (~500ms) | 0.012/мин | Да (gRPC) |
| AWS Transcribe | Custom | Real-time (~800ms) | 0.024/мин | Да (WebSocket) |
| AssemblyAI | Universal-2 | Batch или RT | 0.0065/мин | Да (WebSocket) |
| Whisper (self-hosted) | large-v3 | Зависит от GPU | Только GPU cost | С доработками |
Главный разрыв в таблице - не цена, а архитектура. Два принципиально разных подхода:
**Whisper - не API, а модель.** OpenAI Whisper - open-source модель, которую можно запустить локально на GPU. OpenAI Whisper API - hosted-версия на серверах OpenAI. Deepgram Nova-2, Google Chirp - собственные модели этих компаний, не связанные с Whisper.
Для голосового ассистента, который должен реагировать на речь в реальном времени (latency < 500ms), какой подход STT подходит?
OpenAI Whisper API: транскрипция и перевод
OpenAI Whisper API - самый простой способ добавить STT в приложение. Два endpoint-а: `/audio/transcriptions` (распознавание речи) и `/audio/translations` (перевод любого языка на английский). Поддерживаемые форматы: mp3, mp4, mpeg, mpga, m4a, wav, webm. Максимальный размер файла - 25 MB.
**SRT/VTT субтитры за один вызов.** Whisper API может вернуть готовые субтитры: `response_format: 'srt'` или `response_format: 'vtt'`. Не нужно парсить timestamps вручную - формат готов для использования в video-плеерах.
Аудиозапись часовой встречи (180 MB, mp3). Как транскрибировать через Whisper API?
Real-time STT: Deepgram streaming через WebSocket
Deepgram Nova-2 - специализированный STT-провайдер с WebSocket API для real-time транскрипции. Аудио отправляется непрерывным потоком, а текст возвращается с задержкой ~300ms. Ключевая особенность - interim results: предварительный текст, который обновляется по мере поступления аудио.
VAD (voice activity detection) - встроенный детектор речевой активности. Deepgram сам определяет, когда началась фраза и когда закончилась. Не нужно реализовывать паузодетекцию вручную - `utterance_end_ms` задаёт порог тишины для границы фразы.
**Interim vs Final results.** Interim results - предварительная транскрипция, которая обновляется с каждым чанком аудио. Использовать interim для отображения в UI (как live captions), но для обработки (поиск, сохранение, отправка LLM) - только final results. Иначе текст будет содержать дубли и ошибки.
В streaming STT (Deepgram), какие результаты следует использовать для отправки текста в LLM?
NestJS: endpoint для загрузки и транскрипции аудио
Production-ready audio endpoint должен: 1. принимать файлы через multipart/form-data 2. валидировать формат и размер 3. транскрибировать через STT API 4. возвращать результат. Для больших файлов - обработка через очередь с WebSocket-уведомлением о завершении.
**`toFile()` из openai SDK.** Whisper API принимает файл, а не Buffer. Функция `toFile()` из пакета `openai` конвертирует Buffer в объект, совместимый с API. Без неё придётся сохранять Buffer на диск и передавать `fs.createReadStream()`.
При загрузке аудио через multipart/form-data в NestJS, почему нельзя вручную указывать Content-Type на клиенте?
Повышение точности: language hints, prompts, пост-обработка
Whisper large-v3 даёт WER ~5% на чистой английской речи. Звучит отлично - до первой записи с реального митинга. Офисный шум, акцент, "NestJS" транскрибированный как "нест джей эс", mixed-language код-ревью где половина слов английские. WER легко прыгает до 15-25% без оптимизации.
Три рычага - и каждый бесплатный или почти бесплатный относительно стоимости самой транскрипции:
| Оптимизация | Эффект на WER | Стоимость |
|---|---|---|
| Language hint | −10-15% ошибок | Бесплатно |
| Prompt с терминами | −5-20% ошибок на domain-терминах | Бесплатно |
| Audio preprocessing | −5-10% ошибок на шумных записях | CPU time |
| LLM post-processing | −15-30% ошибок, пунктуация | 0.001-0.005 за запрос |
| Speaker diarization | Разделение спикеров (не точность) | +0.01/мин |
**WER (Word Error Rate)** - стандартная метрика качества STT. WER = (замены + вставки + удаления) / всего слов. Whisper large-v3 даёт WER ~5% на чистой английской речи, ~8-12% на русской. На реальных данных с шумом WER может быть 15-25% без оптимизации.
Что даёт наибольший прирост точности STT при распознавании технических митингов с доменной терминологией?
STT просто конвертирует речь в текст
Базовая транскрипция - это один слой. Punctuation restoration, speaker diarization, language detection, PII redaction, sentiment analysis - каждая из этих задач решается отдельно поверх raw transcript
Whisper возвращает текст без знаков препинания или с минимальными. Deepgram smart_format добавляет пунктуацию отдельным постпроцессингом. Speaker diarization (кто говорил) - отдельная ML-задача: AssemblyAI берёт за неё +`0.01/мин`. Language detection - ещё одна. VAD (voice activity detection) - ещё одна. Production voice pipeline - это стек из 5-7 отдельных компонентов, не один вызов API.
Итоги
- Batch STT (Whisper API) - загрузка файла, ожидание 2-10 сек, высокая точность. Streaming STT (Deepgram Nova-2) - непрерывный поток аудио, текст за ~300ms
- Whisper API: модель whisper-1, лимит 25 MB, форматы ответа json/srt/vtt, опции language и prompt для точности
- Deepgram streaming: WebSocket-соединение, interim results для UI, final results для обработки, VAD для определения пауз
- NestJS audio endpoint: FileInterceptor + Multer, валидация mimetype и размера, openai.toFile() для Buffer → File
- Оптимизация точности: language hint (−10-15% WER), prompt с терминами, audio preprocessing (16kHz mono), LLM post-processing через gpt-4o-mini
- WER (Word Error Rate) - метрика качества. Whisper: ~5% EN, ~10% RU на чистом аудио, 15-25% на шумных реальных данных
- STT - не один компонент: punctuation restoration, speaker diarization, language detection, VAD - отдельные задачи
Вопросы для размышления
- Почему streaming STT (Deepgram) стоит 0.0059 USD/мин, тогда как batch Whisper API - 0.006 USD/мин, хотя streaming технически сложнее? Что в этом парадоксально?
- Speaker diarization (определение кто говорил) стоит +0.01/мин у AssemblyAI - это дороже самой транскрипции. Почему это отдельная сложная задача, а не часть базового STT?
- Если Whisper large-v3 - open-source и лучший по WER, зачем платить Deepgram 0.0059/мин вместо self-hosted Whisper? Какие trade-offs?
Что дальше
Speech-to-Text - входная точка voice interface. Следующий шаг - обратное преобразование: Text-to-Speech для генерации голосовых ответов. Вместе STT и TTS образуют voice pipeline для AI-ассистентов.
- Text-to-Speech: синтез речи — STT → обработка текста → TTS - полный voice pipeline для голосовых ассистентов
- Multimodal AI — STT - один из multimodal inputs наряду с vision и документами
- Real-time AI — Streaming STT + streaming LLM + streaming TTS = real-time voice conversation
Связанные уроки
- aie-05-api-integration — STT-провайдеры используются через их API
- aie-08-streaming — Потоковая транскрипция использует чанковый стриминг
- aie-25-multimodal — Речь это один из входов мультимодальной системы
- aie-43-realtime-ai — Потоковый STT питает реалтайм-голосовые пайплайны
- dsp-20-audio-ai — Фронтенд STT опирается на цифровую обработку аудиосигналов
- ml-30-rnn-lstm — Транскрипция последовательностей похожа на seq2seq моделирование
- ml-29-cnn