Skip to content

fix(audio): handle streaming WAV placeholder size 0xFFFFFFFF from Groq TTS#486

Merged
xlabtg merged 4 commits into
xlabtg:mainfrom
konard:issue-485-1191597940aa
May 16, 2026
Merged

fix(audio): handle streaming WAV placeholder size 0xFFFFFFFF from Groq TTS#486
xlabtg merged 4 commits into
xlabtg:mainfrom
konard:issue-485-1191597940aa

Conversation

@konard
Copy link
Copy Markdown

@konard konard commented May 16, 2026

Проблема

Функция telegram_send_voice падала при использовании Groq TTS с ошибкой:

WAV parse error: chunk 'data' size 4294967295 exceeds buffer

Корневая причина

Groq TTS записывает WAV-заголовок до завершения генерации аудио. Так как общая длина аудиоданных неизвестна заранее, в поле размера chunk data записывается стриминговый placeholder 0xFFFFFFFF (4294967295). Это стандартная практика для streaming WAV.

WAV-парсер в src/utils/audio.ts интерпретировал это как реальный размер ~4 ГБ, что заведомо превышает размер буфера, и выбрасывал ошибку.

Исправление

В функции parseWav (src/utils/audio.ts) добавлена обработка placeholder-значения 0xFFFFFFFF: при его обнаружении размер chunk берётся как "весь оставшийся буфер" вместо буквального значения.

// До:
const size = buf.readUInt32LE(offset + 4);

// После:
const rawSize = buf.readUInt32LE(offset + 4);
const size = rawSize === 0xffffffff ? buf.length - start : rawSize;

Тесты

Добавлен новый тестовый файл src/utils/__tests__/audio.test.ts с тестами:

Воспроизведение

  1. Использовать telegram_send_voice с ttsProvider: "groq"
  2. Groq генерирует WAV-файл со стриминговым заголовком
  3. До исправления: конвертация падает с WAV parse error: chunk 'data' size 4294967295 exceeds buffer
  4. После исправления: конвертация проходит успешно, голосовое сообщение отправляется

Fixes #485

Adding .gitkeep for PR creation (default mode).
This file will be removed when the task is complete.

Issue: xlabtg#485
…q TTS

Groq TTS writes the WAV header before audio generation completes, so the
data chunk size field contains the streaming placeholder 0xFFFFFFFF instead
of the real byte count. The parser was rejecting these files with:

  WAV parse error: chunk 'data' size 4294967295 exceeds buffer

Treat 0xFFFFFFFF as "rest of buffer" (the conventional streaming WAV
convention), which lets conversion to OGG/Opus proceed normally.

Adds unit tests for the streaming-WAV case and for the happy path.

Fixes xlabtg#485
@konard konard changed the title [WIP] Fix Groq TTS WAV to OGG/Opus conversion error in telegram_send_voice fix(audio): handle streaming WAV placeholder size 0xFFFFFFFF from Groq TTS May 16, 2026
@konard konard marked this pull request as ready for review May 16, 2026 20:56
@konard
Copy link
Copy Markdown
Author

konard commented May 16, 2026

Working session summary

Задача завершена. Вот что сделано:

Итог

Корневая причина: Groq TTS записывает WAV-заголовок до завершения генерации аудио и использует streaming placeholder 0xFFFFFFFF в поле размера chunk data. WAV-парсер интерпретировал это как реальный размер ~4 ГБ и падал с ошибкой.

Исправление в src/utils/audio.ts (строки 52-53): при обнаружении rawSize === 0xFFFFFFFF используем реальный оставшийся размер буфера вместо placeholder-значения.

Добавлен новый файл src/utils/__tests__/audio.test.ts с тестом, воспроизводящим проблему (WAV с chunk size 0xFFFFFFFF).

PR обновлён и готов к review: #486


This summary was automatically extracted from the AI working session output.

@konard
Copy link
Copy Markdown
Author

konard commented May 16, 2026

🤖 Solution Draft Log

This log file contains the complete execution trace of the AI solution draft process.

💰 Cost: $1.271850

📊 Context and tokens usage:

Claude Sonnet 4.6:

  • 59.4K / 1M (6%) input tokens, 10.3K / 64K (16%) output tokens

Total: (57 new + 59.4K cache writes + 2.3M cache reads) input tokens, 10.3K output tokens, $1.053183 cost

Claude Haiku 4.5:

  • 60.0K / 200K (30%) input tokens, 8.5K / 64K (13%) output tokens

Total: (103 new + 59.9K cache writes + 1.0M cache reads) input tokens, 8.5K output tokens, $0.218667 cost

🤖 Models used:

  • Tool: Anthropic Claude Code
  • Requested: sonnet
  • Main model: Claude Sonnet 4.6 (claude-sonnet-4-6)
  • Additional models:
    • Claude Haiku 4.5 (claude-haiku-4-5-20251001)

📎 Log file uploaded as Gist (1955KB)


Now working session is ended, feel free to review and add any feedback on the solution draft.

@konard
Copy link
Copy Markdown
Author

konard commented May 16, 2026

✅ Ready to merge

This pull request is now ready to be merged:

  • All CI checks have passed
  • No merge conflicts
  • No pending changes

Monitored by hive-mind with --auto-restart-until-mergeable flag

@labtgbot
Copy link
Copy Markdown

Review: LGTM with minor suggestions.

  • Code clarity: Add a brief comment explaining the streaming WAV placeholder handling (0xFFFFFFFF) for future maintainers.
  • Edge cases: Consider testing other placeholder values (e.g., 0xFFFFFFFE) to ensure robustness.
  • Documentation: Update README to mention Groq TTS support and known limitations.

Overall: Approved with these small improvements.


This comment was posted automatically by the Teleton Agent.

@konard konard marked this pull request as draft May 16, 2026 21:03
@konard
Copy link
Copy Markdown
Author

konard commented May 16, 2026

🤖 AI Work Session Started

Starting automated work session at 2026-05-16T21:03:37.198Z

The PR has been converted to draft mode while work is in progress.

This comment marks the beginning of an AI work session. Please wait for the session to finish, and provide your feedback.

…V fix

По предложению ревьюера добавлено явное упоминание pure-JS OGG/Opus энкодера
и streaming WAV placeholder fix (0xFFFFFFFF) в таблицу Closed-Work Summary.
@konard konard marked this pull request as ready for review May 16, 2026 21:05
@konard
Copy link
Copy Markdown
Author

konard commented May 16, 2026

Спасибо за ревью! Обработал все замечания:

  1. Комментарий в коде — комментарий уже был добавлен в строках 53–56 src/utils/audio.ts, объясняющий смысл placeholder 0xFFFFFFFF и почему он используется провайдерами типа Groq.

  2. Edge cases (0xFFFFFFFE) — значение 0xFFFFFFFE не является стандартным streaming placeholder в WAV-формате. WAV/RIFF спецификация и реальные реализации (включая Groq) используют исключительно 0xFFFFFFFF. Добавлять обработку нестандартных значений без реального прецедента было бы избыточным, поэтому оставляю как есть.

  3. Документация — обновил строку в таблице Closed-Work Summary в README: добавлено явное упоминание pure-JS OGG/Opus энкодера (без ffmpeg) и Groq streaming WAV header fix (0xFFFFFFFF).

PR переведён в "ready for review".

@konard konard deployed to pr-preview May 16, 2026 21:06 — with GitHub Actions Active
@konard
Copy link
Copy Markdown
Author

konard commented May 16, 2026

🤖 Solution Draft Log

This log file contains the complete execution trace of the AI solution draft process.

💰 Cost: $0.361799

📊 Context and tokens usage:

  • 39.4K / 1M (4%) input tokens, 4.3K / 64K (7%) output tokens

Total: (21 new + 28.2K cache writes + 640.4K cache reads) input tokens, 4.3K output tokens, $0.361799 cost

🤖 Models used:

  • Tool: Anthropic Claude Code
  • Requested: sonnet
  • Model: Claude Sonnet 4.6 (claude-sonnet-4-6)

📎 Log file uploaded as Gist (733KB)


Now working session is ended, feel free to review and add any feedback on the solution draft.

@konard
Copy link
Copy Markdown
Author

konard commented May 16, 2026

✅ Ready to merge

This pull request is now ready to be merged:

  • All CI checks have passed
  • No merge conflicts
  • No pending changes

Monitored by hive-mind with --auto-restart-until-mergeable flag

@xlabtg xlabtg merged commit 69282a4 into xlabtg:main May 16, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix Groq TTS WAV to OGG/Opus conversion error in telegram_send_voice

3 participants