README
LM Studio plugin that prepares clean, structured text for the VibeVoice TTS engine. Does NOT generate audio — formats text for optimal speech output.
VibeVoice TTS has no SSML support. This plugin provides two tools:
format — Basic text cleaning + multi-speaker script formattingprepare — Full podcast script preparation pipeline with pause markers, chunking, and TTS recommendations| Tool |
|---|
| Description |
|---|
format | Clean and format text for VibeVoice TTS with multi-speaker support, emotion mapping, and JSON input |
prepare | Full podcast preparation: abbreviation expansion, pause markers, direction tags, paragraph splitting, script chunking, TTS recommendations |
Speaker N: or S1: prefixes; falls back to single-speaker mode[emotion]/(emotion) annotations route lines to mapped speaker slots; tags are stripped from outputneutral/calm to 1, happy/sad to 2, angry/excited to 3thoughtful, whisper, serious, energetic, warm, cold, mysterious, dramatic[{ "speaker": 1, "text": "..." }] for structured dataplain (cleaned text), script (Speaker N: format), json (structured array)e.g. becomes for example, AI becomes A I (first occurrence only)[emphasis], [slower], [faster], [whisper], [louder], [softer] extracted as metadata hints[pause 1s] becomes empty lines (VibeVoice interprets empty lines as natural pauses)For broadcast-quality podcast production with VibeVoice:
{ "tool": "prepare", "params": { "text": "Your full podcast script here...\n\nSpeaker 1: Welcome to the show.\n\n[pause 1s]\n\nSpeaker 2: Today we're discussing AI.", "chunkSize": 500, "paragraphPauses": true, "sentencePauses": false, "maxSentencesPerParagraph": 3, "expandAbbreviations": true, "preserveDirections": true, "output": "script" } }
The prepare tool returns chunks of ~500 words each. Generate audio for each chunk separately to avoid quality degradation on long inputs.
VibeVoice interprets empty lines as natural pauses. The prepare tool converts explicit pause markers:
| Marker | Use Case |
|---|---|
[pause 0.3s] | Between sentences |
[pause 0.5s] | Between paragraphs |
[pause 1s] | Between sections |
Example input:
Speaker 1: Welcome to the show.[pause 0.5s] Speaker 2: Today we're discussing AI.[pause 1s] Speaker 1: Let's begin.
Direction tags are metadata hints — NOT sent to VibeVoice. They guide the human operator on TTS parameter adjustments:
| Tag | Suggested Adjustment |
|---|---|
[emphasis] | Slightly increase volume or speed |
[slower] | Reduce speed to 0.85x |
[faster] | Increase speed to 1.05x |
[whisper] | Use whisper voice reference |
[louder] | Increase volume |
[softer] | Decrease volume |
Example:
Speaker 1: [emphasis]This is the most important point of the episode. Speaker 2: [slower]Let me explain this carefully...
The prepare tool returns recommendations based on script analysis:
| Content Type | Temperature | Speed | WPM |
|---|---|---|---|
| Narration | 0.6-0.7 | 0.95x | 155 |
| Dialogue/Storytelling | 0.8-0.9 | 0.95x | 160 |
VibeVoice controls emotion through voice reference audio clips assigned to speaker slots — never through inline tags.
[calm] The evening was quiet. [happy] What a wonderful surprise! [angry] This is unacceptable!
Becomes:
Speaker 1: The evening was quiet. Speaker 2: What a wonderful surprise! Speaker 3: This is unacceptable!
Assign the same voice to slots 1-3 with different emotional reference clips for dynamic emotion.
neutral, happy, sad, angry, excited, calm, thoughtful, whisper, serious, energetic, warm, cold, mysterious, dramatic
{ "tool": "format", "params": { "text": "[happy] Hello world!", "mode": "auto", "speakers": 3, "voices": ["Alice", "Bob", "Charlie"], "emotions": ["calm", "happy", "angry"], "clean": true, "output": "script", "emotion_map": { "happy": 2, "angry": 3 } } }
{ "tool": "prepare", "params": { "text": "Speaker 1: Welcome to today's episode about AI.\n\n[pause 0.5s]\n\nSpeaker 2: [thoughtful]I've been thinking about this for a while...", "chunkSize": 500, "paragraphPauses": true, "sentencePauses": true, "maxSentencesPerParagraph": 3, "expandAbbreviations": true, "preserveDirections": true, "output": "script" } }
Common abbreviations are expanded on first use for TTS clarity:
| Abbreviation | Expansion |
|---|---|
e.g. | for example |
i.e. | that is |
etc. | et cetera |
vs. | versus |
Mr. | Mister |
Dr. | Doctor |
AI | A I |
TTS | text to speech |
API | A P I |
URL | U R L |
JSON | jay son |
npm install npm run build lms dev
schemas/formatting.schema.json — Schema for the format toolschemas/prepare.schema.json — Schema for the prepare tool