skald/migrations
Kayos c9bd38034c multi-voice: per-character dialogue rendering
Schema: characters.voice_id + characters.slug (migration 0007).
voice_id is FK to voices(id); slug is the stable lowercase token
the narrate_prep pass uses inside [voice:slug]...[/voice].

Forge::narrate_prep takes &[CharacterSpeaker]. System prompt
expanded to instruct the author to wrap dialogue lines in voice
tags based on a roster supplied in the user prompt (slug + name +
short hint from key_facts). Unattributed dialogue stays unwrapped
and inherits the narrator voice.

skald narrate substitutes [voice:<character-slug>] →
[voice:<kokoro-voice-name>] right before sending to Kokoro, using
characters.voice_id JOIN voices.reference_path as the map. Slugs
with no voice or no character row fall back to the narrator voice
defensively (logged as warn).

kokoro_server.py v0.4: splitter recognises [voice:X]...[/voice]
blocks at the paragraph level. Each text node carries an optional
voice attribution; renderer feeds it to Kokoro per-segment. Outside
voice blocks the request's default voice is used. voices_used is
reported back so callers can verify multi-voice actually ran.

Only kokoro-routed renders pre-process voice tags; F5 paths leave
the tags in place (F5 multi-voice not implemented). Defensive
fallback: orphan/unclosed [/voice] markers are silently absorbed
rather than failing the render.
2026-05-14 08:35:33 -07:00
..
0001_init.sql scaffold v0.1: postgres+pgvector inside-container, schema, markdown ingest, CLI 2026-05-13 09:04:28 -07:00
0002_voices_and_pronunciation.sql schema: voices + pronunciation_overrides + narration_runs (v0.2 prep) 2026-05-13 10:07:32 -07:00
0003_narration_findings.sql schema: narration_findings — audio-layer audit table 2026-05-13 10:10:04 -07:00
0004_authors.sql v0.3 step 1: migration 0004 + authors module + web form panels 2026-05-13 12:01:29 -07:00
0005_chapter_body_md_tts.sql migration 0005: idempotent ADD COLUMN IF NOT EXISTS 2026-05-13 20:32:41 -07:00
0006_generation_runs_narrate_prep.sql migration 0006: extend generation_runs.kind to allow narrate_prep 2026-05-13 20:28:59 -07:00
0007_characters_voice.sql multi-voice: per-character dialogue rendering 2026-05-14 08:35:33 -07:00