0xsline/voice
| Text-to-Speech (TTS), voiceover, narration placement/sync, and custom sound effects (SFX) generator. Use when the user wants generated speech from text, wants to add/replace/align narration or voiceover for an existing video/timeline, wants to keep existing voiceover synced after visual retiming edits, needs voice audition/selection, or explicitly wants a newly generated/custom sound effect that is not available in the Sound Effects library.
npx skills add https://github.com/0xsline/OpenChatCut --skill voice
Generate voiceovers (TTS) and sound effects. For TTS, choose a concrete
provider and voice before calling submit_voice.
screen recording, slide animation, product demo, B-roll edit, MG explainer, or
other visual sequence
down, moving, reordering, or replacing the visuals it describes
If the current request has an existing visual target and the user wants
narration, voiceover, dubbing, or replacement speech for that target, read
references/video-sync.md before drafting new
narration, using existing narration text to generate TTS, or placing audio. Do
this even when the user did not explicitly say "sync" or "match the visuals";
the existence of a visual target means narration timing and meaning may need to
follow on-screen content. Use the normal standalone TTS path only when there is
no visual target or the user just wants an audio asset from text.
Also read references/video-sync.md when the timeline
already has narration/voiceover and the user asks to change the visuals while
keeping that voiceover aligned. This is a sync maintenance task even if no new
TTS is needed.
Use submit_voice to create a TTS audio asset. The current MCP tool contract is:
provider is required: doubao (Chinese-optimized), elevenlabs (English /multilingual), or minimax (MiniMax TTS — see
references/minimax-tts.md).
voiceId is required and provider-specific. The only exception is MiniMaxtimbreWeights mixing, where voiceId must be empty. Do not mix catalogs.
submit_voice creates an audio asset only. Timeline placement, replacement,trimming, and alignment happen later with timeline tools.
submit_voice calls can be useful: split atnatural pauses, sentence groups, or script beat boundaries when the workflow
benefits from separately timed or placed voice clips, such as storyboard beats,
scene-level ad segments, or a user request for separate assets.
speedRatio, loudnessRatio, pitch, emotion,emotionScale, performancePrompt, and explicitDialect are supported
knobs, but not every Doubao voice supports every expressive control. Check
the voiceId guide or references/voices.md before
using them.
seed, output formats, normalization, pronunciation dictionaries, continuity
text/request IDs, and logging/latency query controls. For eleven_v3, inline audio tags are available for expressive
delivery such as emotion, tone, nonverbal cues, accent hints, pauses, or
local pacing.
Doubao control support for current curated voices:
vivi, xiaohe, yunzhou, xiaotian, naiqimengwa, yingtaowanzi,wenroumama, zhixingnv, dayi, jitangnv, liuchang, ruyayichen,
morgan, qingcang, huiben, popo, yuanboxiaoshu, baqiqingshu, and
tangseng support explicit emotion / emotionScale,
performancePrompt, and ASMR-style prompt directions.
shuanglangshaonian supports performancePrompt and COT/QA-styleinstruction following, but does not support explicit emotion /
emotionScale or ASMR-style control.
explicitDialect is only supported by vivi and can be dongbei,shaanxi, or sichuan.
ElevenLabs control support for current curated voices:
amelia, brittney, hope, jessica, arabella, jane, maria,mark, frederick, peter, james, jon, sully, david, and alex
all support the same request-level controls; model-specific support is still
validated by ElevenLabs.
Use the preset tags/samples to pick a naturally suitable voice, then use the
controls for moderate delivery changes.
eleven_v3, inline audio tags are available when the userasks for expressive delivery such as emotion, tone, nonverbal cues, accent
hints, or local pacing. Official examples fit these useful TTS categories:
emotion/tone tags such as [happy], [sad], [angry], [excited],
[curious], [sarcastic], [crying], [annoyed], [appalled],
[thoughtful], [surprised], and [mischievously]; vocal delivery and
nonverbal cue tags such as [whispers], [laughs], [sighs], [exhales],
[inhales deeply], [clears throat], [snorts], [swallows],
[wheezing], and [coughs];
pacing/pause/local speed tags such as [slowly], [pause],
[short pause], [long pause], [rushed], and [drawn out]; and
accent/special-performance tags such as
[strong X accent], for example [strong French accent], plus [sings],
[singing], [woo], and [pirate voice]. Official examples are
non-exhaustive; similar auditory tags can be tried when the user explicitly
asks for that delivery and the tag describes how the voice should sound, not
a visual action. Write tags directly in text, close to the short phrase
they should affect. Treat tags as local guidance, not paragraph-wide controls.
eleven_v3, use punctuation, text structure,shorter generated segments, or local audio tags such as [short pause] and
[slowly] when needed.
// English / multilingual via ElevenLabs
submit_voice({
provider: "elevenlabs",
text: "Hello world",
voiceId: "peter",
});
// Chinese via Doubao
submit_voice({
provider: "doubao",
text: "你好世界",
voiceId: "liuchang",
});
// With speed adjustment (Doubao only)
submit_voice({
provider: "doubao",
text: "这是一段稍快的中文旁白。",
voiceId: "liuchang",
speedRatio: 1.5,
});
// With expressive Doubao controls
submit_voice({
provider: "doubao",
text: "这次事故提醒我们,安全永远不能侥幸。",
voiceId: "liuchang",
emotion: "sad",
emotionScale: 3,
performancePrompt: "痛心但克制,语速稍慢,像新闻专题旁白",
pitch: -1,
speedRatio: 0.92,
});
// With ElevenLabs delivery controls
submit_voice({
provider: "elevenlabs",
text: "The launch changed how teams plan their daily work.",
voiceId: "peter",
speed: 0.95,
stability: 0.4,
similarityBoost: 0.8,
outputFormat: "wav_44100",
});
// MiniMax TTS (when configured) — see references/minimax-tts.md
submit_voice({
provider: "minimax",
text: "欢迎使用视频编辑助手。",
voiceId: "female-yujie",
speed: 1,
name: "VO · welcome",
});
When the user needs TTS and has not already chosen a concrete preset, treat
broad words like "middle-aged male", "warm female", or "professional" as
requirements for filtering candidate voices.
Before recommending, rendering, or submitting any TTS voice option, read
references/voices.md. Use that file as the preset
source for preset ids / voiceId, provider choice, display labels, tags, and
sample URLs. Do not create voice options from memory, translated names, or
broad user descriptions.
First determine two separate languages:
this for the surrounding reply, form-visual label, visual-option name,
and summary.
this only to choose provider and voice catalog.
The audition widget's submit button is fixed to the default label in this build
(submitLabel is accepted but not rendered); keep the question label and option
labels in the user conversation language, not the target narration language. For example:
English users see submit_label="Submit", Chinese users see
submit_label="提交", and Spanish users see submit_label="Enviar".
"help me generate ... voice over in Chinese" is an English conversation asking
for Chinese narration, so the audition widget copy stays in English while the
voice candidates come from Doubao.
Instead:
references/voices.md by target narration language / provider andthe user's explicit requirements such as gender, age range, tone, and use
case.
and offer the closest supported presets with a clear caveat.
widget-forms, then call ask_followup_questions with voice optionsand audio samples.
submit_voice with the selected preset id as voiceId.For each audition option, keep value, display label, media, and summary
tied to the same preset row from references/voices.md. Use sample= URLs
from the submit_voice voiceId guide. They are editor static files under
/voice-samples/.... Keep value as the preset id and media as the matching
sample URL. Write name and summary in the user's conversation language. The
target narration language only decides the provider/voice catalog. For example,
if the user asks in English for a Chinese voiceover, keep the widget copy in
English and use English-friendly voice names/tags. If the user's message itself
is Chinese, use Chinese widget copy and Doubao's official Chinese display
names. For known /voice-samples/... presets, the editor can fill display text
only when name/summary are omitted; authored widget text is the normal path
for arbitrary languages. After the user submits, map the submitted display name
back to the preset id from the same candidate list.
English request for Chinese narration:
<widget submit_label="Submit">
<form-visual
id="voiceId"
label="For Chinese voiceover, I recommend a few voices to try:"
required="true"
>
<visual-option
value="vivi"
name="Vivi"
media="/voice-samples/doubao-vivi.mp3"
aspect-ratio="16:5"
summary="Female / young / friendly, general"
/>
<visual-option
value="xiaohe"
name="Xiaohe"
media="/voice-samples/doubao-xiaohe.mp3"
aspect-ratio="16:5"
summary="Female / young / soft, clear"
/>
<visual-option
value="yunzhou"
name="Yunzhou"
media="/voice-samples/doubao-yunzhou.mp3"
aspect-ratio="16:5"
summary="Male / young / neutral, business"
/>
</form-visual>
</widget>
Chinese request for Chinese narration:
<widget submit_label="提交">
<form-visual
id="voiceId"
label="我推荐这几个中文旁白音色,先试听一下:"
required="true"
>
<visual-option
value="morgan"
name="Morgan"
media="/voice-samples/doubao-morgan.mp3"
aspect-ratio="16:5"
summary="男 / 中年 / 低沉知识解说"
/>
<visual-option
value="zhixingnv"
name="知性女声"
media="/voice-samples/doubao-zhixingnv.mp3"
aspect-ratio="16:5"
summary="女 / 中年 / 冷静知识讲解"
/>
<visual-option
value="vivi"
name="Vivi"
media="/voice-samples/doubao-vivi.mp3"
aspect-ratio="16:5"
summary="女 / 年轻 / 亲切通用口播"
/>
</form-visual>
</widget>
For ordinary editing sound effects (SFX), do not generate first. Use the
built-in Sound Effects library before generating:
browse_library with category:"sound-effects" and a query such as"whoosh", "camera shutter", "notification", "censor beep", or
"record scratch".
library:sound:<id>.edit_item, using fromFrame as the sound'sanchor/editorial moment frame:
browse_library({
category: "sound-effects",
query: "short whoosh transition",
});
edit_item({
adds: [
{
type: "audio",
assetId: "library:sound:whoosh-short",
fromFrame: 120,
trackId: "A1",
},
],
});
Only generate sound effects from text descriptions with submit_sound when:
browse_library({ category:"sound-effects", query }) returns no suitablematch.
// Custom/generated sound effect after the library has no suitable match
submit_sound({ prompt: "A dog barking in the distance" });
// With custom duration (0.5-22 seconds)
submit_sound({
prompt: "Thunder and heavy rain",
durationSeconds: 15,
});
// High prompt adherence
submit_sound({
prompt: "Sci-fi laser gun firing",
promptInfluence: 0.8,
});
Tips for better results:
| Field | Description | Notes |
| ------------ | -------------------------------------- | --------------- |
| provider | TTS provider: doubao, elevenlabs, or minimax | Required |
| text | Text to synthesize | Required |
| voiceId | Curated preset id or provider voice id | Required |
| speedRatio | Speech speed | Doubao only |
| modelId | ElevenLabs model id | ElevenLabs only |
| stability | ElevenLabs stability | ElevenLabs only |
| speed | ElevenLabs speech speed | ElevenLabs only |
| name | Asset name | Optional |
| Field | Description | Notes |
| ----------------- | ----------------- | -------------- |
| prompt | Sound description | Required |
| durationSeconds | Duration | 0.5-22 seconds |
| promptInfluence | Prompt adherence | 0-1 |
| name | Asset name | Optional |
Use the submit_voice voiceId guide and
references/voices.md for the current curated preset
list, display labels, tags, and sample URLs.
ElevenLabs, Doubao, and MiniMax have separate voice catalogs. vivi / dayi
are only Doubao; mark / amelia / james are only ElevenLabs; MiniMax system
voices (e.g. female-yujie) are only for provider: "minimax".
If you need a specific voice and a particular language:
provider: "doubao" (or minimax when thatis the configured / requested vendor) with a matching catalog voiceId.
provider: "elevenlabs" and an ElevenLabspreset.
not confirmed a concrete preset.
references/voices.md.
duration controls; the current tool does not expose those as reliable fields.
Take 0xsline/voice from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.