memory: TTS streaming play-as-it-arrives shipped (7856ec5) + autoplay unlock
This commit is contained in:
+12
-5
@@ -92,11 +92,18 @@ Contract `docs/contracts/donut_voiced_interview.contract.md`. **NOT pushed** (op
|
|||||||
#382/#383 both closed. **Native tool is strictly better than the bridge** (in-turn, provenance packets, server-side
|
#382/#383 both closed. **Native tool is strictly better than the bridge** (in-turn, provenance packets, server-side
|
||||||
grounding rule, fail-soft, no separate consult). FOOT-GUN (#381): freshly-ingested content needs the
|
grounding rule, fail-soft, no separate consult). FOOT-GUN (#381): freshly-ingested content needs the
|
||||||
restart-after-ingest runbook to be Tier-3-recallable.
|
restart-after-ingest runbook to be Tier-3-recallable.
|
||||||
- **✅ Zonos WAV-header fix (`6c3c08b`) — operator-reported "browser wants wav, zonos sends pcm."** The gateway
|
- **✅ TTS is now STREAMING play-as-it-arrives (`7856ec5`, supersedes the buffered `6c3c08b`).** operator wanted
|
||||||
emits a STREAMING wav header (RIFF size @4 + data size both `0xFFFFFFFF` = unknown length); a browser `<audio>`
|
no wait-for-the-whole-clip; infra-ops confirmed the Zonos gateway ALREADY streams (chunked int16 WAV, TTFB
|
||||||
can't play a finite blob with an unknown-length header. `tts.py:_finalize_wav_header` rewrites both size fields
|
~0.44s, placeholder `0xFFFFFFFF` sizes DESIGNED for progressive `<audio src>`) — the buffering was all in OUR
|
||||||
with the real byte counts (clip is buffered server-side). Live-verified: `wave.open` decodes it (1ch/16bit/44.1kHz).
|
proxy, and `_finalize_wav_header` FORCED it. Fix: `tts.py` `tts_stream` (async-gen over the gateway's chunked
|
||||||
Booth: `http://10.100.10.50:8090/b/donut-voiced/` (donut-wav-fixed.wav).
|
resp, pass-through, no buffer/rewrite) + `gateway_body`; `/api/tts` is now **GET** → chunked `StreamingResponse`
|
||||||
|
(peek-first-chunk for a 503-on-bad-open; serialize lock across the stream; PAD via p/a query floats); `index.html`
|
||||||
|
`speakOnDone` sets `<audio src="/api/tts?...">`. **AUTOPLAY was the real "no audio" cause** — `play()` fires ~15s
|
||||||
|
after the keypress (past the transient-activation window) → blocked; `_unlockTtsAudio()` plays a silent WAV within
|
||||||
|
the toggle/submit gesture → persistent element may-play flag. Live-verified: GET is `transfer-encoding: chunked`
|
||||||
|
TTFB 0.46s; Playwright w/ restrictive autoplay → streaming `<audio src>` plays progressively (currentTime advances,
|
||||||
|
no decode error, no MSE) 6.5s post-gesture. FOOT-GUN: text rides the GET query → capped ~2000 chars (truncate at
|
||||||
|
word boundary); `_TTS_MAX_TEXT_CHARS=2000`. TTS is GET now, not POST.
|
||||||
|
|
||||||
**✅ SHIPPED + PUSHED since v0.22.0 (origin at `14bbc2b`):** the worldtree-sdk cutover (#20, **v0.22.0**, 7 slices,
|
**✅ SHIPPED + PUSHED since v0.22.0 (origin at `14bbc2b`):** the worldtree-sdk cutover (#20, **v0.22.0**, 7 slices,
|
||||||
494 green — the big one) + **bifrost 1.1.5** (`3ef3a5e`, **v0.22.1**) + **worldtree-sdk 1.0.0→1.1.1→1.1.2**
|
494 green — the big one) + **bifrost 1.1.5** (`3ef3a5e`, **v0.22.1**) + **worldtree-sdk 1.0.0→1.1.1→1.1.2**
|
||||||
|
|||||||
Reference in New Issue
Block a user