feat(voice): real TTS fallback chain and whisper-compatible STT
- TTS providers: cloud (OpenAI-compatible /audio/speech, e.g. Bailian
compatible mode with cosyvoice), local self-hosted HTTP server,
edge-tts CLI, espeak CLI, silent — ordered by TTS_PROVIDER list,
skipping providers whose binary/config is missing
- STT: whisper-compatible /audio/transcriptions endpoint (cloud or
self-hosted faster-whisper), replacing the empty dashscope stub
- config: TTS_CLOUD_URL/KEY/MODEL/VOICE, TTS_LOCAL_URL, STT_API_URL/
KEY/MODEL; cloud keys fall back to DASHSCOPE_API_KEY
- gateway /voice/tts now returns real audio/mpeg bytes instead of a
byte count
- tests: cloud/local/whisper round-trips via httptest, chain skip
behavior, fallback order; kept and adapted prior service tests