Project Files
README.md
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 |
format Toolprepare Tool (Podcast Pipeline)For broadcast-quality podcast production with VibeVoice:
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:
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:
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.
Becomes:
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
format Toolprepare ToolCommon 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 |
schemas/formatting.schema.json — Schema for the format toolschemas/prepare.schema.json — Schema for the prepare toolSpeaker 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){
"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"
}
}
Speaker 1: Welcome to the show.[pause 0.5s]
Speaker 2: Today we're discussing AI.[pause 1s]
Speaker 1: Let's begin.
Speaker 1: [emphasis]This is the most important point of the episode.
Speaker 2: [slower]Let me explain this carefully...
[calm] The evening was quiet.
[happy] What a wonderful surprise!
[angry] This is unacceptable!
Speaker 1: The evening was quiet.
Speaker 2: What a wonderful surprise!
Speaker 3: This is unacceptable!
{
"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"
}
}
npm install
npm run build
lms dev