Two new things working together: 1. Migration 0005 adds chapters.body_md_tts (nullable). Narrate path prefers it over body_md when present — that's the annotated-for- audiobook variant. Falls back to body_md if not set. 2. New Forge::narrate_prep pass: author (or House) annotates prose with [breath] / [pause:Xs] / [scene] beat markers AND occasional humanizing narrator stumbles (em-dash repetition, self-correction, hesitation — sparingly, 1-3 per chapter). Apart from stumbles, the prose is verbatim. Author voice threads through. 3. New CLI: 'skald prepare-narration --chapter <uuid> [--author slug] [--overwrite]'. Records as generation_runs row kind=narrate_prep. 4. skald narrate now routes by voice.source — kokoro_* voices hit KOKORO_URL (Apache 2.0 stack, audiobook-tuned with the v0.2 render- and-stitch server), everything else hits F5_TTS_URL (voice-cloning path). Voice DB row carries source as the dispatch key. Why no new tag for narrator stumbles: em-dash repetition and self- correction are just prose patterns Kokoro reads correctly because of its punctuation cues. No new server-side machinery.
15 lines
748 B
SQL
15 lines
748 B
SQL
-- Annotated TTS variant of each chapter's prose. NULL = not yet
|
|
-- generated; renderers fall back to body_md when this is NULL.
|
|
-- Otherwise this column carries the same prose with control tags
|
|
-- inline: [pause:Xs] / [breath] / [scene] — the kokoro server
|
|
-- interprets these into silence beats during synth.
|
|
--
|
|
-- Why a separate column instead of mutating body_md: the human-
|
|
-- readable version stays clean for web inspection + future plain-
|
|
-- text export. The TTS version is production output, regeneratable
|
|
-- whenever the author's beat-placement taste shifts.
|
|
ALTER TABLE chapters
|
|
ADD COLUMN body_md_tts text;
|
|
|
|
-- generation_runs.kind already accepts any string; no check
|
|
-- constraint to update. The new pass kind is 'narrate_prep'.
|