docs(tts): record the arm A engine decision and the loopback-publish law
Frank heard every audition pair and passed it, so likeness stopped being the tiebreak and the engine was picked on the live-output criterion: arm A qwentts.cpp 5916bf7, resident tts-server, 1.7 B talker, llama-tts-cli kept as the rollback. Records the discriminators (first audio byte, warm RTF, spread), the three consequences that are configuration (boot-warm every voice, no cpuset pin, WAV-only registration), the two follow-ups left open on purpose, and the corrected addressing law: a host-loopback publish is unreachable from a bridge container, so the pair shares one quadlet network.
This commit is contained in:
@@ -2311,3 +2311,48 @@ every restart since the cutover.
|
||||
Kokoro-enum-only — so "the agent talks in my voice" needs that provider row or
|
||||
a `pi.registerProvider` extension, decided in phase 2.
|
||||
|
||||
## 2026-10-18 — TTS engine picked: arm A `qwentts.cpp`, on the live-output criterion
|
||||
|
||||
- Frank listened to the four audition pairs (`qwentts-*.mp3` against their
|
||||
`armB-*.mp3` mainline partners) and **passed every clone**. That deleted the
|
||||
only axis the A/B could not measure, and the question was reframed: **which
|
||||
engine is better for live output**. On that criterion RTF only has to stay
|
||||
under 1.0 with margin — the discriminators are time-to-first-audio and
|
||||
run-to-run spread, because an arm whose RTF can cross 1.0 stalls a live
|
||||
stream mid-sentence.
|
||||
- **Chosen: arm A `qwentts.cpp` @ `5916bf7`, the resident `tts-server`, 1.7 B
|
||||
talker Q4_K_M + Q8_0 tokenizer, in a `frank-tts-engine` container on 8880.**
|
||||
The `TTS_BACKEND=llama-tts-cli` path in `scripts/frank-tts.env` stays in the
|
||||
repo as the rollback. The numbers that carried it: first audio byte 86–451 ms
|
||||
against a per-request model load, warm RTF 0.55–0.67 against 0.93–0.99, spread
|
||||
±0.01 against ±0.25, and a native `/v1/audio/speech` against no HTTP path at
|
||||
all. Three consequences are configuration, not preference: boot-warm every
|
||||
voice, do not pin a cpuset (threads are `hardware_concurrency()/2`), register
|
||||
every pack with its WAV (a lone embedding is rejected).
|
||||
- Two follow-ups deliberately **not** decided: the **0.6 B talker** (0.44 RTF,
|
||||
3.4 GiB, never auditioned — every clip is 1.7 B) and **ICL vs
|
||||
embedding-only** conditioning. Embedding-only is the shipped default because
|
||||
it is cheaper and needs no `ref_text`, which this fleet cannot transcribe
|
||||
honestly; `.spk` + `.rvq` still ride in every pack, so ICL remains a per-voice
|
||||
opt-in for batch work where total time beats first byte.
|
||||
- **Addressing law corrected** in
|
||||
[[Local TTS and Voice Cloning]]: the pair may not meet at a host-loopback
|
||||
publish. netavark DNATs published ports only and a bridge container cannot
|
||||
reach a host `127.0.0.1` bind — the lesson that 502'd hermes — so
|
||||
`host.containers.internal:8880`, which `scripts/frank-tts.env` documents, is
|
||||
correct only for a routable bind. The deployed pair shares one quadlet network
|
||||
and the façade addresses the engine by container name.
|
||||
- **PR #12** (`feat/open-notebook-podcast` @ `114dd7a`, 8 commits, 403 tests,
|
||||
mergeable) is open: open-notebook + SurrealDB quadlets on the private bridge
|
||||
`10.89.4.0/24`, API published on **5056** because seerr holds
|
||||
`127.0.0.1:5055`, and `ESPERANTO_TTS_TIMEOUT` moved 600 → **660** to sit one
|
||||
round-trip outside frank-tts's own `SHIM_TIMEOUT`. Stated in its body: it is
|
||||
**not runnable end to end** — nothing listens on 7772 until the voice stack
|
||||
lands, and the episode destination (`/home/dank/media/podcasts`) is interim
|
||||
pending Gitea #7.
|
||||
- Still in flight, not in this branch: `feat/frank-tts-engine` — the arm A
|
||||
image build, the quadlet pair on one network, the boot-warm step, deployer /
|
||||
planner / `test-changed.sh` routing, homepage and docs. Whoever merges second
|
||||
among the open branches resolves the overlap: `log.md`, `index.md`,
|
||||
`deploy-remote.sh`, `deploy-plan.py`, `test-changed.sh`.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user