Гайд · TNWS AI
Как настроить streaming в Deepgram API без потери финальных реплик
WebSocket-транскрибация Deepgram: параметры кодека, interim_results, is_final, завершение потока, сбор финального текста и тест на обрыв.
Что решает этот материал
Статья отвечает на запрос «как настроить streaming Deepgram API». Параметры и ограничения сверены 12 сентября 2026 года с первичной документацией Deepgram. Цель — получить воспроизводимый результат на контрольном аудио и доказать его пригодность, а не принять любой HTTP 200 за успех.
Применимость и версия
Потоковое распознавание Nova-3 через WebSocket. Формат, encoding, sample_rate и channels должны описывать реальные байты источника; для контейнеризированного аудио часть параметров определяется автоматически.
Перед запуском проверьте страницу Models and Languages: доступные языки, голоса и сочетания функций меняются. Зафиксируйте endpoint, model id, язык, формат входа и версию SDK в журнале теста. Постоянный ключ храните только на backend как DEEPGRAM_API_KEY; не помещайте его в браузер, мобильный пакет, репозиторий или скриншот.
Факты из официальной документации
- Поток подключается к WebSocket endpoint
/v1/listen, а аудиобайты отправляются бинарными сообщениями. - Промежуточные результаты нельзя безусловно записывать в итог: для фиксации сегмента проверяют
is_final. - Для незакрытого живого потока предусмотрены keep-alive и явные сообщения завершения/финализации.
- Неправильные encoding или sample_rate дают DATA/NET ошибки либо бессмысленный текст даже при успешном соединении.
Эти параметры решают разные задачи. Модель распознаёт речь, formatter меняет представление текста, diarization присваивает словам номера говорящих, а utterances формирует смысловые сегменты. Включение одной функции не означает автоматическое включение остальных, кроме явно документированных связей.
Подготовка контрольных данных
- Сделайте короткую синтетическую запись без персональных данных. Запишите точный эталон текста и ожидаемые границы реплик.
- Измерьте реальный контейнер, кодек, sample rate и число каналов через
ffprobe; расширение файла само по себе ничего не гарантирует. - Для сравнения функций используйте один и тот же файл. Меняйте ровно один query parameter, иначе нельзя объяснить разницу.
- Определите машинные проверки до запроса: непустое поле, допустимый язык, отсутствие секрета, множество speaker id или совпадение ключевого термина.
- Храните исходный JSON целиком вместе с request id. Производный TXT или субтитры не заменяют ответ API.
Пример карточки входа:
file: control.wav
container: wav
codec: pcm_s16le
sample_rate: 16000
channels: 1
expected_phrase: "контрольная фраза"
contains_real_personal_data: false
Не копируйте характеристики этого шаблона вслепую: значения обязаны совпадать с вашим файлом. Для streaming добавьте размер audio chunk, частоту отправки и момент намеренного разрыва соединения.
Пошаговая настройка
- Создайте отдельный ключ для тестовой среды и экспортируйте
DEEPGRAM_API_KEY. Не выводите переменную командой, которая попадёт в общие логи. - Сверьте поддержку функции для выбранных модели, языка и batch/streaming режима. Особенно внимательно проверяйте языковые ограничения intelligence и redaction.
- Выполните минимальный запрос ниже без собственных retry и middleware. Так видны исходные HTTP-код, заголовки и тело ошибки.
- Проверьте Content-Type входа и фактический формат байтов. Для URL-входа удостоверьтесь, что ссылка доступна серверу и отдаёт именно медиа.
- Разберите документированное поле ответа; не ищите текст рекурсивно и не подставляйте пустую строку вместо отсутствующего объекта.
- Сравните результат с эталоном: Во время фразы появляются interim-события, но итоговая строка содержит каждый подтверждённый сегмент ровно один раз; после закрытия приходит финальный результат, а клиент освобождает WebSocket.
- Проведите отрицательный тест: испорченный ключ, неподдерживаемая комбинация, неверный формат либо контрольный секрет. Ожидаемая ошибка должна быть обработана явно.
Рабочий шаблон
# Псевдокод обработчика сообщений WebSocket
final_parts = []
for event in deepgram_events:
alt = event['channel']['alternatives'][0]
if event.get('is_final') and alt.get('transcript'):
final_parts.append(alt['transcript'])
final_text = ' '.join(final_parts)
assert final_text.strip()
# После последнего audio chunk отправьте документированное сообщение CloseStream.
Шаблон не содержит настоящего ключа. Файлы и model id должны быть проверены в текущей документации. Команда jq -e важна: она завершает сценарий ошибкой, когда бизнес-условие ложно, даже если транспортный запрос прошёл.
Контрольный вход и ожидаемый результат
Используйте запись с заранее известным текстом, а не случайный подкаст. Для терминов подготовьте несколько произнесений разными дикторами; для diarization — известный порядок двух голосов; для redaction — только синтетические номера. Оценка на одном красивом примере не показывает устойчивость.
Ожидаемый результат: Во время фразы появляются interim-события, но итоговая строка содержит каждый подтверждённый сегмент ровно один раз; после закрытия приходит финальный результат, а клиент освобождает WebSocket.
Для распознавания посчитайте word error rate или хотя бы долю совпавших обязательных фраз. Для сегментации проверьте временной порядок и потерянные слова. Для TTS техническая валидность файла не заменяет прослушивание. Для summary отдельно проверяйте факты: модель может создать связный, но неточный пересказ.
Критерии приёмки
- формат источника измерен
- is_final обработан
- дубли исключены
- закрытие явное
- обрыв воспроизведён
Также сохраняйте HTTP-код, request id, model metadata, длительность исходного аудио и время обработки. Порог качества определяйте на своей размеченной выборке. Универсальное число confidence не гарантирует правильности бренда, суммы или фамилии.
Типичные ошибки и что не делать
- Добавлять interim transcript в итог и получать дубли.
- Заявлять linear16, отправляя Opus или контейнер WebM.
- Молча переподключаться после обрыва без учёта уже подтверждённых сегментов.
Не включайте сразу все параметры. Сначала получите baseline, затем добавляйте diarization, utterances, formatting или intelligence по одному. Иначе регрессия не локализуется. Не повторяйте запросы с ошибкой 400: это ошибка конфигурации, а не временный сбой. Для 429 и 5xx используйте ограниченный backoff с jitter и сохраняйте идемпотентность собственной обработки.
Нельзя считать номер спикера личностью, автоматически публиковать низкоуверенные имена или полагаться на redaction как на единственный уровень защиты. Минимизируйте исходные данные до передачи, ограничивайте доступ к аудио и удаляйте временные файлы по своей политике хранения.
Готовый промпт для аудита результата
Ты проверяешь результат Deepgram для сценария «как настроить streaming Deepgram API».
Используй только приложенные: эталон, параметры запроса и JSON-ответ.
Верни таблицу: проверка | ожидается | фактически | PASS/FAIL | исправление.
Не восстанавливай отсутствующие слова. Отдельно отметь низкий confidence,
несовместимость model/language/feature и любое появление контрольного секрета.
HTTP 200 сам по себе не является PASS.
Перед отправкой JSON в другую модель удалите ключи, реальные персональные данные и лишние фрагменты разговора. Итоговый PASS должен вычисляться кодом по заданным правилам, а не мнением второго генератора.
Проверка на серии реальных данных
Соберите 20–50 обезличенных примеров из целевого канала: тихая и шумная запись, разные микрофоны, короткая пауза, перебивание, редкий термин и пустой звук. Храните эталон отдельно от ответа API. После смены model id, языка, форматтера или SDK прогоняйте весь набор заново.
Отдельно измеряйте технический успех и содержательный: долю HTTP 200, долю валидных JSON, полноту финальных сегментов и точность обязательных полей. Полезная метрика — стоимость и задержка одного принятого результата с учётом повторов и ручной проверки, а не скорость одного удачного запроса.
FAQ
Достаточно ли HTTP 200?
Нет. Нужно проверить структуру JSON или аудиофайл и конкретное бизнес-условие.
Можно ли ориентироваться только на confidence?
Нет. Калибруйте порог на собственной размеченной выборке и отдельно проверяйте критичные сущности.
Где хранить API-ключ?
В backend-секрете или менеджере секретов; не в клиентском коде и не в публикации.
Нужно ли фиксировать model id?
Да. Иначе смена значения по умолчанию может незаметно изменить качество и формат результата.
Официальный источник
Частые вопросы
Достаточно ли HTTP 200?
Нет, проверьте структуру и бизнес-условие.
Можно ли хранить ключ в браузере?
Нет, постоянный ключ хранится на backend.
Нужно ли тестировать один и тот же файл?
Да, для A/B меняйте ровно один параметр.
Где проверять совместимость?
В актуальной официальной документации Deepgram.
Читайте также
Как определить язык аудио в Deepgram и проверить language_confidence
detect_language=true для предзаписанного и streaming-аудио: detected_language, confidence, многоканальные записи и отличие от multilingual.
Как озвучить текст через Deepgram TTS и сохранить корректный аудиофайл
POST /v1/speak, Aura-2, MP3 или WAV, Content-Type, потоковый ответ, fail-with-body и техническая проверка файла через ffprobe.
Как получить summary аудио в Deepgram и не ошибиться с языком
Summarization v2 в Deepgram: английский язык, поля result и short, обработка warnings при detect_language и проверка краткого содержания по фактам.
Комментарии
Пока тихо. Скажите первое слово