f0afc8ef57
server/tts/cartesia_tts.py wraps the raw Cartesia Sonic WebSocket API (wss://api.cartesia.ai/tts/websocket) — streaming PCM s16le, one voice (CARTESIA_VOICE_ID, D-006). server/tts/piper_tts.py wraps piper-tts self-hosted synthesis (R4 mitigation, open-weights). Both implement TTSProvider (synthesize streaming + synthesize_all). Both degrade gracefully (no audio, no crash) when the API key / voice model is absent. PRAXIS_TTS=cartesia|piper selects the adapter via the registry with no pipeline change (D-014). 7 unit tests pass (mock streams + env selection + graceful missing-key/model handling). ---ci--- phase: 1 milestone: v0.1 plan: 02 task: 02-02 status: execute persona: backend-engineer requirements: covered: [REQ-VOICE-02] ---/ci---