← БлогБлог · STT

Groq Whisper отдаёт 502 на кусках длинного аудио: причина в таймстемпах

Короткий ответ: когда длинную запись режут на куски через ffmpeg -f segment в OGG, каждый кусок, кроме первого, несёт ненулевой стартовый таймстемп, и на таких кусках мы наблюдали зависание на ~120 секунд и 502 service_unavailable от Groq. Лечится одной строкой — флагом -reset_timestamps 1 в команде нарезки.

Опубликовано Автор: Stanislav Shupilkin4 мин чтения

Лесенка: с какого смещения куска Groq перестаёт отвечать

Куски по 60 секунд, по 0,16 МБ каждый, нарезаны ffmpeg -f segment без сброса таймстемпов. Смещение — это время, с которого кусок «думает», что начинается (start_time в ffprobe).

Смещение начала кускаОтвет APIТело ошибкиСколько ждали ответа
0 с200—0,62–1,1 с
60 с200—0,58 с
120 с502service_unavailable120,12 с
180 с502service_unavailable120,12 с
240 с502service_unavailable120,12 с
300 с502service_unavailable120,12 с
480 с502service_unavailable120,12 с

Строка «0 с» — нулевой кусок из такой же нарезки по 300 секунд: в лесенке по 60 секунд его отдельно не записали. Полное тело ответа не сохранили, только код ошибки.

До
# до: куски 1..N уходят со сквозным смещением → 502
ffmpeg -i input.opus -vn -c:a libopus -b:a 24k -ac 1 -ar 16000 \
  -f segment -segment_time 900 -segment_format ogg chunk_%04d.ogg
После
# после: каждый кусок начинается с нуля → 200
ffmpeg -i input.opus -vn -c:a libopus -b:a 24k -ac 1 -ar 16000 \
  -f segment -segment_time 900 -segment_format ogg \
  -reset_timestamps 1 chunk_%04d.ogg

Как мы на это вышли

Бот @smolevich_voice_bot расшифровывает голосовые и аудиофайлы через Groq — это облако, которое крутит открытую модель whisper-large-v3-turbo. Длинное аудио приходится резать: у Groq лимит 25 МБ на файл на бесплатном тарифе.

Картина была стабильная и обидная — первый кусок проходит, все остальные падают. Ежедневный пробник два месяца почти каждый день писал 1 успешный кусок из 6, и мы честно считали, что Groq просто не умеет в длинное. В разборе по очереди отмели ретраи, другой IP, другую модель и новое HTTP-соединение — всё мимо.

Решающий тест оказался простым: взяли один и тот же отрезок звука и нарезали его двумя способами. Сегмент №1 из -f segment (смещение 300 с) — 502 через 120 секунд. Тот же отрезок через -ss 300 -t 300 (смещение 0, размер тот же, 0,80 МБ) — 200 за 0,74 секунды. Байты звука одинаковые, разница только в таймстемпе. То есть «первый кусок всегда проходит» и «у первого куска всегда нулевое смещение» — это одно и то же наблюдение.

Как воспроизвести

  1. Нарежьте любую запись длиннее 3 минут командой «до», поставив -segment_time 60.
  2. Посмотрите смещения: ffprobe -v error -show_entries format=start_time -of csv=p=0 chunk_0002.ogg — будет около 120.
  3. Отправьте chunk_0001.ogg и chunk_0002.ogg в POST https://api.groq.com/openai/v1/audio/transcriptions с моделью whisper-large-v3-turbo. У нас первый вернул 200, второй — 502.
  4. Перережьте с -reset_timestamps 1 — start_time у всех кусков станет около 0.

В боте нарезка сейчас ровно такая, как в блоке «после»: куски по 900 секунд, OGG/Opus 24 kbps, моно 16 кГц, с -reset_timestamps 1. В общем, два месяца мы чинили не тот компонент

Вопросы

Groq Whisper отдаёт 502 из-за размера файла?

В нашей проверке нет. Куски по 0,16 МБ со смещением падали так же, как по 2,4 МБ, а WAV на 9,16 МБ прошёл. Порог был по смещению — где-то между 60 и 120 секундами, точнее не искали.

Помогут ли ретраи?

Нет. Один и тот же кусок со смещением падал пять раз — в разных процессах, с разных IP, на whisper-large-v3 и на turbo, с интервалами в минуты. Ретраи только добавляют по 2 минуты ожидания на каждую попытку.

Можно обойтись без -reset_timestamps?

У нас сработала нарезка в MP3 или WAV без флага: куски проходили. Цена — размер: MP3 32 kbps вышел 1,14 МБ на 5 минут против 0,80 МБ у Opus, WAV — 9,16 МБ. Флаг проще. Заодно он чинит длительность кусков в ffprobe: без него она показывает время конца куска в исходнике, а не его длину, и таймкоды в склеенной расшифровке съезжают.

Как проверяли
  • Дата: 4 августа 2026 года.
  • Модель: whisper-large-v3-turbo через https://api.groq.com/openai/v1/audio/transcriptions; whisper-large-v3 проверяли только на одном куске со смещением (тоже 502).
  • Формат: OGG/Opus 24 kbps, моно, 16 кГц, нарезка ffmpeg -f segment.
  • Главный прогон: запись 2 ч 45 мин (9897 с), куски по 900 с с -reset_timestamps 1 — 11 из 11 ответили 200, 0 ошибок, 17,5 с на API суммарно. Все 10 швов просмотрели вручную: без дублей и провалов.
  • Лесенка: куски по 60 с, смещения 60/120/180/240/300/480 с.
  • Сколько запросов: 67 за всю проверку.
  • Документация ffmpeg: опция reset_timestamps сегментного мьюксера — «сбрасывает таймстемпы в начале каждого сегмента».
  • Оговорка: проверено на одной длинной записи и на дату проверки. Почему Groq так реагирует на смещение, мы не знаем — описано только то, что наблюдали. Поведение API могло измениться.