Project Files
INSTRUCTIONS.md
This plugin prepares text for the VibeVoice TTS engine. It does NOT generate audio — it formats text so VibeVoice can produce the best possible speech output.
Key fact: VibeVoice does NOT support SSML or inline emotion tags. Emotion is controlled by the voice reference audio sample you provide per speaker slot.
format Tool| Parameter | Type | Default | Description |
|---|---|---|---|
text | string (req) | — | Input text to format. Plain text, "Speaker N:" format, or JSON array |
mode | string | "auto" | "single", "multi", or "auto" (detect speaker prefixes) |
speakers | number | 1 | Number of speakers (1–4). Used for voice/emotion array |
voices | string[] | — | Voice names per speaker, e.g. ["Alice", "Frank"] |
emotions | string[] | — | Emotion labels per speaker: neutral, happy, sad, angry, excited, calm |
clean | boolean | true | Apply the text-cleaning pipeline |
output | string | "script" | "plain" (no prefixes), "script" ("Speaker N:" format), "json" (structured) |
emotion_map | object | see below | Maps emotion labels to speaker slots (PsiPi method), e.g. {"happy": 2, "angry": 3} |
clean: true)| Step | What |
|---|---|
| Smart quotes | "..." '...' → "..." '...' |
| Chinese quotes | 「」『』《》 → removed |
| Emoji | 😊 😡 → stripped |
| HTML tags | <br/> <p> → stripped |
| Non-speech annotations | [laughs] (sarcastically) → removed (emotion tags [happy] etc. are kept) |
| Ellipsis | … → ... |
| URLs | https://... → [URL] |
| Whitespace | Tabs → spaces, collapse multiple spaces, trim lines |
S1: or S 1: also worksVibeVoice has no inline emotion tags. Emotion is set by the voice reference audio sample you choose:
| Emotion Label | Suggested Voice Reference Type |
|---|---|
neutral | Default reading voice |
happy | Voice sample with happy delivery |
sad | Voice sample with sad delivery |
angry | Voice sample with angry/shouting delivery |
excited | Voice sample with excited/passionate delivery |
calm | Voice sample with calm/soothing delivery |
PsiPi Method: Create 4 different voice reference files of the same speaker at different emotion levels, then assign each to a different Speaker slot.
[emotion])Write [emotion] or (emotion) at the start of a line to route that line to the
speaker slot mapped to the emotion. The tag is stripped from the output —
VibeVoice never sees it; it only controls which speaker slot delivers the line.
With the default map this becomes:
Default emotion_map: neutral→1, calm→1, happy→2, sad→2, angry→3, excited→3.
Assign the same voice to slots 1–3 with different emotional reference clips (calm read, cheerful read, angry read) to get one speaker with dynamic emotion. Emotions missing from the map keep their original speaker slot; the tag is still removed from the output.
mode: "single" or mode: "auto".voices and emotions arrays are documentation annotations — they don't change the text. They tell YOU which voice reference audio to select for each VibeVoice speaker slot."json" output format when you want to programmatically process the speaker structure.{
"original": "Speaker 1: Hello world!",
"cleaned": "Speaker 1: Hello world!",
"script": "Speaker 1: Hello world!",
"speakers": [{ "id": 1, "voice": "Alice", "emotion": "happy", "lines": 1 }],
"warnings": []
}
Speaker 1: Hello, how are you?
Speaker 2: I'm doing great!
Speaker 1: That's wonderful to hear.
[calm] The evening was quiet and still.
[happy] What a wonderful surprise!
[angry] This is unacceptable!
Speaker 1: The evening was quiet and still.
Speaker 2: What a wonderful surprise!
Speaker 3: This is unacceptable!
[
{ "speaker": 1, "text": "Hello!" },
{ "speaker": 2, "text": "Hi there!" }
]