{"repo":"NousResearch/hermes-agent","public_id":"4248","display_label":"TTS audio format and voice bubble delivery issues","summary":"These issues and fixes concern TTS output being delivered in wrong audio formats (MP3 instead of OGG/Opus) across Telegram, Matrix, Feishu, and DingTalk, causing broken voice bubbles or silent fallbacks. Related work involves transcoding pipelines, flood-control gaps, and notification delivery for voice replies.","subsystem":"agent","counts":{"members":39,"open_issues":2,"open_issues_distinct":2,"open_prs":2,"closed_issues":12,"merged_prs":3,"attempt_prs":22},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":28504},"resolution":{"state":"partially_resolved","by":"pr-73508"},"freshness":{"state":"verified","last_verified_at":"2026-07-28T18:55:49+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.04923076923076922},"fix_edges":[{"issue_number":14841,"pr_number":73508,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":16524,"pr_number":73508,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":18818,"pr_number":73508,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":23983,"pr_number":73508,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":27970,"pr_number":28504,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":32029,"pr_number":73508,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":36685,"pr_number":73508,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":45557,"pr_number":73508,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":51867,"pr_number":73508,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":54589,"pr_number":73072,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":57049,"pr_number":73508,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":4248,"title":"[Bug]: Telegram send_voice falls back to text \"🔊 Audio: /path\" instead of sending voice bubble","url":null,"state":"closed"},{"kind":"issue","number":7564,"title":"[Bug][DingTalk] Media upload failure silently degrades to placeholder text","url":null,"state":"closed"},{"kind":"issue","number":14841,"title":"Matrix voice replies sent as mp3 instead of ogg/opus — render as broken attachments","url":null,"state":"closed"},{"kind":"issue","number":26355,"title":"Telegram: TTS voice bubbles not delivered despite valid OGG Opus +","url":null,"state":"closed"},{"kind":"issue","number":27970,"title":"[Bug]: Telegram auto voice replies can fall back to MP3 attachments and silent final notifications","url":null,"state":"closed"},{"kind":"issue","number":36685,"title":"Telegram gateway auto-replies force MP3 for Opus-capable TTS providers","url":null,"state":"closed"},{"kind":"issue","number":45557,"title":"minimax TTS on Feishu sends mp3 as file attachment instead of voice bubble","url":null,"state":"closed"},{"kind":"issue","number":54589,"title":"[Bug]: OpenAI-compatible TTS backends without opus support fail on voice bubbles (_generate_openai_tts hardcodes response_format=\"opus\" for .ogg)","url":null,"state":"closed"},{"kind":"issue","number":57049,"title":"Base platform adapter's auto-TTS voice reply defaults to .mp3 on Telegram (no native voice bubble) — session-platform detection unavailable in that code path","url":null,"state":"closed"},{"kind":"issue","number":57213,"title":"[Bug]: xAI TTS also writes MP3 bytes into .ogg voice files — Telegram voice bubbles broken (same class as #57048/#54589, xai provider not covered by existing fixes)","url":null,"state":"closed"},{"kind":"issue","number":58715,"title":"[Bug]: Matrix TTS voice replies sent as non-Opus audio — Element X voice bubble renders but won't play","url":null,"state":"closed"},{"kind":"issue","number":60556,"title":"[Bug]: Telegram streaming + [[audio_as_voice]] causes TTS to render as plain audio attachment, not voice bubble","url":null,"state":"closed"},{"kind":"issue","number":62079,"title":"[Bug]: Telegram MEDIA document upload failures fall through to generic attachment warning without retry/recovery","url":null,"state":"open"},{"kind":"issue","number":64137,"title":"[Bug]: send_document (Telegram) has no flood-control retry, silently degrades to text apology","url":null,"state":"open"},{"kind":"pr","number":14900,"title":"fix: send voice replies as Opus/OGG on Matrix","url":null,"state":"closed","close_reason":{"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":20182,"title":"fix(gateway): use OGG for Telegram auto TTS","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#41644","number":41644}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":28107,"title":"fix(gateway): mark final voice reply as notify-worthy so Telegram delivers it audibly","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#28504","number":28504}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":28504,"title":"fix(gateway): mark final voice reply as notify-worthy so Telegram delivers it audibly","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/run.py","tests/gateway/test_send_voice_reply_notify.py","tests/gateway/test_voice_command.py"]},{"kind":"pr","number":36686,"title":"fix(tts): preserve Telegram Opus output for native providers","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"f440a44753","number":0},{"kind":"pr","value":"#73508","number":73508},{"kind":"pr","value":"#62040","number":62040},{"kind":"pr","value":"#73508","number":73508}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":45555,"title":"fix(tts): include feishu in want_opus platforms","url":null,"state":"closed","close_reason":{"category":"silent_close","implication":"active"},"merged":false},{"kind":"pr","number":45637,"title":"fix(tts): include feishu in want_opus guard for native voice delivery","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#45555","number":45555}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":45712,"title":"fix(tts): extend opus conversion to Feishu for voice bubbles (#45557)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#45555","number":45555},{"kind":"pr","value":"#45557","number":45557},{"kind":"pr","value":"#45555","number":45555},{"kind":"pr","value":"#45637","number":45637}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":45761,"title":"fix(tts): include feishu in want_opus platforms","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"f440a44753","number":0},{"kind":"pr","value":"#73508","number":73508},{"kind":"pr","value":"#62040","number":62040},{"kind":"pr","value":"#73508","number":73508}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":54597,"title":"fix(tools): transcode to OGG/Opus for OpenAI-compatible TTS backends without opus (#54589)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#54589","number":54589},{"kind":"pr","value":"#37337","number":37337},{"kind":"pr","value":"#54488","number":54488}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":55278,"title":"fix(tts): synthesize mp3 then transcode to opus for .ogg targets","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#54597","number":54597}],"category":"wontfix_bydesign","implication":"wontfix"},"merged":false},{"kind":"pr","number":56777,"title":"fix(tts): transcode OpenAI-compatible speech to Opus for .ogg targets (#54589)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#54589","number":54589},{"kind":"pr","value":"#54597","number":54597},{"kind":"pr","value":"#55278","number":55278}],"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":56873,"title":"fix(tts): transcode OpenAI-compatible TTS to OGG/Opus when backend lacks opus","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#73072","number":73072}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":57071,"title":"fix(gateway): pass explicit .ogg output_path for Telegram auto-TTS","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"f440a44753","number":0},{"kind":"pr","value":"#73508","number":73508},{"kind":"pr","value":"#62040","number":62040},{"kind":"pr","value":"#73508","number":73508}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":57084,"title":"fix(gateway): request OGG for Telegram auto TTS","url":null,"state":"closed","close_reason":{"category":"stale_abandoned","implication":"active"},"merged":false},{"kind":"pr","number":57184,"title":"fix(tts): transcode openai voice output to opus","url":null,"state":"open","close_reason":{"refs":[{"kind":"commit","value":"70db671fac","number":0},{"kind":"commit","value":"fae29c841","number":0},{"kind":"commit","value":"045a9b463e","number":0},{"kind":"pr","value":"#73470","number":73470},{"kind":"pr","value":"#73482","number":73482},{"kind":"pr","value":"#73482","number":73482}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":57222,"title":"fix(tts): transcode xAI ogg requests to Opus","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#73072","number":73072}],"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":57250,"title":"fix(tts): transcode xai ogg output paths","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#57222","number":57222}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":57518,"title":"fix(tts): transcode xAI TTS output to Opus when .ogg requested (#57213)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#57222","number":57222},{"kind":"pr","value":"#57222","number":57222},{"kind":"pr","value":"#57250","number":57250},{"kind":"pr","value":"#57222","number":57222}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":58716,"title":"fix(gateway): use OGG/Opus for Matrix voice replies","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#14900","number":14900},{"kind":"pr","value":"#14900","number":14900}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":60580,"title":"fix(gateway/streaming): deliver [[audio_as_voice]] via send_voice during streaming","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"f58902818d9302fcdd4b30cc29cf2b9bc5f9f5f4","number":0}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":64145,"title":"fix(telegram): retry native media sends on flood control instead of giving up","url":null,"state":"open","close_reason":{"refs":[{"kind":"commit","value":"40ce9604723a","number":0},{"kind":"pr","value":"#64145","number":64145},{"kind":"pr","value":"#64137","number":64137},{"kind":"pr","value":"#64145","number":64145},{"kind":"pr","value":"#64145","number":64145},{"kind":"pr","value":"#374151","number":374151},{"kind":"pr","value":"#64137","number":64137},{"kind":"pr","value":"#64145","number":64145}],"category":"partial_fix","implication":"needs_llm"},"merged":false},{"kind":"pr","number":68063,"title":"fix: Matrix voice as Ogg/Opus — direct TTS path + non-blocking metadata (completes #54488)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"f440a44753","number":0},{"kind":"pr","value":"#73508","number":73508}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":73072,"title":"fix(tts): class-level .ogg container repair + multi-platform Opus voice detection","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["tests/tools/test_tts_container_repair.py","tools/tts_tool.py"]},{"kind":"pr","number":73508,"title":"fix(gateway): platform-aware auto-TTS voice delivery (opus platforms, streamed/global gap, captions)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["contributors/emails/[redacted:email]","contributors/emails/[redacted:email]","contributors/emails/[redacted:email]","gateway/platforms/base.py","gateway/run.py","plugins/platforms/feishu/adapter.py","plugins/platforms/matrix/adapter.py","plugins/platforms/telegram/adapter.py","tests/gateway/test_auto_voice_reply_format.py","tests/gateway/test_base_auto_tts_output_format.py","tests/gateway/test_matrix_voice.py","tests/gateway/test_telegram_voice_caption_markdown.py","tests/gateway/test_voice_command.py","tests/tools/test_tts_opus_routing.py","tools/tts_tool.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}