Split the book into narration/dialogue spans from its own quotation marks and ask the LLM only who speaks each dialogue span (POST /api/attribute-spans), so text can no longer be fused, dropped or duplicated and a novel takes ~10 min instead of ~4 h. Book 1 vs the hand-corrected reference: every-word-right 87.0% -> 92.3%, type agreement 93.6% -> 97.4%; Books 2/3 (not tuned on) 90.8% / 89.9%. - static/js/audiobook-spans.js (pure, unit-tested) + audiobook-cast-spans.js - core/attribution_spans.py, route, tests; scripts/score_attribution.py - default on; localStorage ab-span-mode=0 restores the classic engine - architecture/audiobook-attribution.md, Manual, CHANGELOG 1.32.0, TODO Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
129 lines
2.9 KiB
JSON
129 lines
2.9 KiB
JSON
{
|
|
"core": [
|
|
"voice-picker",
|
|
"benchmark-voice-picker",
|
|
"voice-inspector",
|
|
"seed-finder",
|
|
"voice-sources",
|
|
"fishaudio-browser",
|
|
"voice-cache",
|
|
"jobs",
|
|
"image-cache",
|
|
"integrations",
|
|
"routing",
|
|
"voice-clone",
|
|
"voice-library",
|
|
"tts-preview",
|
|
"generation",
|
|
"benchmark",
|
|
"stt",
|
|
"namespace"
|
|
],
|
|
"lazy": {
|
|
"s-rehearser": [
|
|
"rehearser-parse",
|
|
"rehearser-cast",
|
|
"rehearser-train",
|
|
"rehearser-training-ui",
|
|
"rehearser-voice-design",
|
|
"rehearser-io",
|
|
"rehearser-playback",
|
|
"rehearser-recording",
|
|
"rehearser",
|
|
"rehearser-library",
|
|
"rehearser-stage",
|
|
"rehearser-voice-picker"
|
|
],
|
|
"s-reader": [
|
|
"rehearser-parse",
|
|
"rehearser-cast",
|
|
"rehearser-train",
|
|
"rehearser-training-ui",
|
|
"rehearser-voice-design",
|
|
"rehearser-io",
|
|
"rehearser-playback",
|
|
"rehearser-recording",
|
|
"rehearser",
|
|
"rehearser-library",
|
|
"rehearser-stage",
|
|
"rehearser-voice-picker",
|
|
"characters-library",
|
|
"reader",
|
|
"audiobook/network",
|
|
"audiobook-parse",
|
|
"audiobook-segmentation",
|
|
"audiobook-spans",
|
|
"audiobook-cast",
|
|
"audiobook-pipeline",
|
|
"audiobook-cast-spans",
|
|
"audiobook-preview-export",
|
|
"audiobook",
|
|
"character-sheets"
|
|
],
|
|
"s-library": [
|
|
"rehearser-parse",
|
|
"rehearser-cast",
|
|
"rehearser-train",
|
|
"rehearser-training-ui",
|
|
"rehearser-voice-design",
|
|
"rehearser-io",
|
|
"rehearser-playback",
|
|
"rehearser-recording",
|
|
"rehearser",
|
|
"rehearser-library",
|
|
"rehearser-stage",
|
|
"rehearser-voice-picker",
|
|
"characters-library",
|
|
"reader",
|
|
"audiobook/network",
|
|
"audiobook-parse",
|
|
"audiobook-segmentation",
|
|
"audiobook-spans",
|
|
"audiobook-cast",
|
|
"audiobook-pipeline",
|
|
"audiobook-cast-spans",
|
|
"audiobook-preview-export",
|
|
"audiobook",
|
|
"character-sheets",
|
|
"library",
|
|
"character-columns",
|
|
"library-characters",
|
|
"sillytavern"
|
|
],
|
|
"s-caststudio": [
|
|
"rehearser-parse",
|
|
"rehearser-cast",
|
|
"rehearser-train",
|
|
"rehearser-training-ui",
|
|
"rehearser-voice-design",
|
|
"rehearser-io",
|
|
"rehearser-playback",
|
|
"rehearser-recording",
|
|
"rehearser",
|
|
"rehearser-library",
|
|
"rehearser-stage",
|
|
"rehearser-voice-picker",
|
|
"characters-library",
|
|
"reader",
|
|
"audiobook/network",
|
|
"audiobook-parse",
|
|
"audiobook-segmentation",
|
|
"audiobook-spans",
|
|
"audiobook-cast",
|
|
"audiobook-pipeline",
|
|
"audiobook-cast-spans",
|
|
"audiobook-preview-export",
|
|
"audiobook",
|
|
"character-sheets",
|
|
"library",
|
|
"character-columns",
|
|
"library-characters",
|
|
"sillytavern",
|
|
"studio"
|
|
],
|
|
"s-magazine": [
|
|
"magazine"
|
|
]
|
|
}
|
|
}
|