You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 20f36d3
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: scripts/audiobook/DIALOGUE_GUIDE.md
+67-25Lines changed: 67 additions & 25 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,10 +7,10 @@ The committed script is `website/audio/dialogue/<id>.json`; the audio lags it.
7
7
8
8
The two hosts are the book's historic podcast personas.
9
9
10
-
| Role | Persona | Voice | Job |
11
-
| --- | --- | --- | --- |
12
-
|`alex`| Kore — instructor |`Kore` (`config.speakers.alex`) | Clear, measured, pedagogical: guides the listener, explains what to do and why, and turns each figure or code block into the idea it carries. |
13
-
|`sam`| Charon — senior engineer |`Charon` (`config.speakers.sam`) | Thoughtful: asks the clarifying question peers would ask, connects to production, challenges over-claims, **restates each beat's takeaway in their own words**. |
|`alex`| Kore — instructor |`Kore` (`config.speakers.alex`) | Clear, measured, pedagogical: guides the listener, explains what to do and why, and turns each figure or code block into the idea it carries.|
13
+
|`sam`| Charon — senior engineer |`Charon` (`config.speakers.sam`) | Thoughtful: asks the clarifying question peers would ask, connects to production, challenges over-claims, **restates each beat's takeaway in their own words**. |
14
14
15
15
Roles are epistemic, not a naive-questioner act: Sam never fakes ignorance.
16
16
Voices are bound to roles in `config.ts`, never in the script, so a script is voice-agnostic.
- Write for the ear: short clauses, no visual deixis ("this diagram", "below"); contractions per
51
-
"Authoring voice".
51
+
"Authoring voice". **Enforced (hard):**`lint` fails any turn that references an on-page visual —
52
+
the listener has no page, so the only fix is re-voicing the idea. Vocabulary: `AUDIO_CONFIG.deixis`.
52
53
- Preserve precision: repeat exact identifiers and numbers; never paraphrase a critical term away.
54
+
-**Declared critical terms (per chapter).** The term gate only auto-classifies numbers, all-caps acronyms and identifiers, so a plain word the argument turns on — a named example like _strawberry_ — is invisible to it and a paraphrase can silently drop it. Declare it as `declaredCriticalTerms: [{ "term": "<exact source word>", "reason": "<why it must be spoken>" }]`; the gate then requires it verbatim in the turns (and in the ASR transcript). Each entry must name a real source word, carry a reason, and not restate an auto-classified term, or lint fails instead of ignoring it. `audio:dialogue:source` prints the effective required set (auto + declared).
55
+
-**Described literals (rare exemption).** An arbitrary example literal — e.g. a random hash inside a quoted benchmark prompt — may be described ("a short random prefix") instead of spelled aloud: the book text keeps the literal, only the ear is spared. Declare it in the script as `describedLiterals: [{ "term": "<exact literal>", "reason": "<why it is arbitrary>" }]`. Never for semantic numbers, identifiers or flags (scores, versions, model names, CLI flags): those stay spoken verbatim. Lint exempts a declared term from the spoken-critical-term requirement, but fails the chapter when a declared term is not a critical term of the source or its reason is empty — so the field cannot hide a term that matters.
53
56
-**Coverage is enforced (hard fail).**`audio:dialogue:lint`, `audio:build` and `audio:verify` all
54
57
refuse a chapter whose turns leave any source prose section, figure or code block uncovered, or any
55
58
critical term unsaid. Author from `audio:dialogue:source` output, not from memory.
0 commit comments