fae29c8410
Root-cause fix for the 'TTS voice bubble broken' issue family (#57048, #54589, #57213, #58845, #14841, #45557, #57049). Two class-level defects: 1. Several backends silently write MP3/WAV bytes into a .ogg output path (Edge only emits MP3, Piper writes WAV, xAI writes MP3, some OpenAI-compatible servers ignore response_format=opus). Platforms that need real Ogg/Opus render 0-second/broken voice bubbles. Instead of per-provider patches, text_to_speech_tool now sniffs magic bytes once after synthesis (_sniff_audio_container) and repairs the container centrally (_repair_ogg_container): ffmpeg transcode in place, or rename to the honest extension when ffmpeg is unavailable. Covers every current and future provider, including command providers and plugins. 2. want_opus only recognized Telegram, so Matrix/Feishu/WhatsApp/Signal auto-TTS voice replies were synthesized as MP3 and delivered as broken attachments. New OPUS_VOICE_PLATFORMS set covers all voice-bubble platforms. _convert_to_opus refactored onto a shared _ffmpeg_transcode_to_opus that supports safe in-place transcodes (-f ogg forced muxer, temp file + os.replace). Tests: tests/tools/test_tts_container_repair.py (13 tests incl. a live ffmpeg round-trip); full TTS suite green (153 + 187 passed).