dreamteam PR jphein/dreamteam#30 added an engine-fallback chain to its speak seam: engines are tried in order, stopping at the first that exits 0. The seam contract it documents: the engine must honor SPEECH_ENGINE/PIPER_VOICE env and exit non-zero on synthesis failure.
Current behavior found while testing: tts.py exits 1 on missing creds, but on cloud-unreachable it returns None and still exits 0 — so a network drop looks like success and the fallback hop (e.g. to a local piper engine) never fires.
Two asks:
- Exit non-zero whenever no audio was produced (incl. cloud-unreachable), so downstream fallback chains can react.
- (Related, larger) local TTS/STT engine support — piper was the working assumption on the dreamteam side; its half is merged-ready and dormant behind config
.speech.fallback=["piper"].
Context: jphein/dreamteam#17 (the dreamteam-side issue), jphein/dreamteam#30 (the ready-and-waiting consumer).
🤖 Generated with Claude Code
dreamteam PR jphein/dreamteam#30 added an engine-fallback chain to its speak seam: engines are tried in order, stopping at the first that exits 0. The seam contract it documents: the engine must honor
SPEECH_ENGINE/PIPER_VOICEenv and exit non-zero on synthesis failure.Current behavior found while testing:
tts.pyexits 1 on missing creds, but on cloud-unreachable it returns None and still exits 0 — so a network drop looks like success and the fallback hop (e.g. to a local piper engine) never fires.Two asks:
.speech.fallback=["piper"].Context: jphein/dreamteam#17 (the dreamteam-side issue), jphein/dreamteam#30 (the ready-and-waiting consumer).
🤖 Generated with Claude Code