T058 — Render audio-tts widgets (US2: Italian native-speaker persona)
Status: Blocked on an upstream decision — parked here so it isn't lost.
What's blocked
The audio-tts widget renderer is the final open item from US2 (the Italian native-speaker dialog persona). It cannot be completed until the TTS provider is selected, because the renderer's voice catalog, voice enum, and audio-pipeline contract all depend on that choice.
Where the decision lives
~/dev/prd/scratch/chiron_tts_provider_selection_2026-04-29.md — defines the decision criteria and candidate matrix (Gemini, ElevenLabs, Azure, OpenAI, Coqui, Piper, Hume) and proposes a TtsProvider interface.
Current state (provisional, not complete)
A provisional renderAudioTts() exists in skill/lib/widget-renderer.ts (authored 2026-04-29). It emits HTML only — it assumes an upstream pipeline already produced an MP3 at spec.audioPath and just points an <audio> element at it, with a collapsible transcript, an error fallback, and a chiron:audio-ended event. It is intentionally not wired to any provider.
Contract gaps to close once a provider is chosen
AudioTtsWidgetSchema currently defines only { type, transcript, voice }. The renderer also reads (as optional structural fields, pending a schema PR):
audioPath — required for HTML rendering
speaker? — required for multi-persona lessons (Alice / Bob / Native-Speaker)
language? — required for lang= accessibility
voice should become an enum sourced from the chosen provider's voice catalog (currently a free-form string)
Acceptance criteria (when unblocked)
Blocks
- T059 (production wire-up)
- US2 audio path
Spec: specs/001-chiron-v1/tasks.md T058.
T058 — Render
audio-ttswidgets (US2: Italian native-speaker persona)Status: Blocked on an upstream decision — parked here so it isn't lost.
What's blocked
The
audio-ttswidget renderer is the final open item from US2 (the Italian native-speaker dialog persona). It cannot be completed until the TTS provider is selected, because the renderer's voice catalog,voiceenum, and audio-pipeline contract all depend on that choice.Where the decision lives
~/dev/prd/scratch/chiron_tts_provider_selection_2026-04-29.md— defines the decision criteria and candidate matrix (Gemini, ElevenLabs, Azure, OpenAI, Coqui, Piper, Hume) and proposes aTtsProviderinterface.Current state (provisional, not complete)
A provisional
renderAudioTts()exists inskill/lib/widget-renderer.ts(authored 2026-04-29). It emits HTML only — it assumes an upstream pipeline already produced an MP3 atspec.audioPathand just points an<audio>element at it, with a collapsible transcript, an error fallback, and achiron:audio-endedevent. It is intentionally not wired to any provider.Contract gaps to close once a provider is chosen
AudioTtsWidgetSchemacurrently defines only{ type, transcript, voice }. The renderer also reads (as optional structural fields, pending a schema PR):audioPath— required for HTML renderingspeaker?— required for multi-persona lessons (Alice / Bob / Native-Speaker)language?— required forlang=accessibilityvoiceshould become an enum sourced from the chosen provider's voice catalog (currently a free-form string)Acceptance criteria (when unblocked)
TtsProviderinterface implemented; pipeline emits MP3s to<lesson-output-dir>/audio/AudioTtsWidgetSchematightened (audioPath,speaker?,language?,voiceenum)renderAudioTts()finalized against the tightened schemaBlocks
Spec:
specs/001-chiron-v1/tasks.mdT058.