From chatcut
Generates text-to-speech voiceovers, narration, and custom sound effects for videos. Syncs narration with visual timelines and offers voice auditioning.
How this skill is triggered — by the user, by Claude, or both
Slash command
/chatcut:voiceThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generate voiceovers (TTS) and sound effects. For TTS, choose a concrete
Generate voiceovers (TTS) and sound effects. For TTS, choose a concrete
provider and voice before calling submit_voice.
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. Use doubao for Chinese-optimized narration and
elevenlabs for English or multilingual narration.voiceId is required and provider-specific. 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 at
natural 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.modelId, speed, and stability are the supported voice
knobs. 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-style
instruction 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: modelId, speed, and
stability.eleven_v3, inline audio tags are available when the user
asks 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
mcp__skill__submit_voice({
provider: "elevenlabs",
text: "Hello world",
voiceId: "peter",
});
// Chinese via Doubao
mcp__skill__submit_voice({
provider: "doubao",
text: "你好世界",
voiceId: "liuchang",
});
// With speed adjustment (Doubao only)
mcp__skill__submit_voice({
provider: "doubao",
text: "这是一段稍快的中文旁白。",
voiceId: "liuchang",
speedRatio: 1.5,
});
// With expressive Doubao controls
mcp__skill__submit_voice({
provider: "doubao",
text: "这次事故提醒我们,安全永远不能侥幸。",
voiceId: "liuchang",
emotion: "sad",
emotionScale: 3,
performancePrompt: "痛心但克制,语速稍慢,像新闻专题旁白",
pitch: -1,
speedRatio: 0.92,
});
// With ElevenLabs delivery controls
mcp__skill__submit_voice({
provider: "elevenlabs",
text: "The launch changed how teams plan their daily work.",
voiceId: "peter",
speed: 0.95,
stability: 0.4,
});
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:
form-visual label, visual-option name,
and summary.For the voice audition widget, set submit_label to a short submit action 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 and
the user's explicit requirements such as gender, age range, tone, and use
case.widget-forms. In Codex, call ask_followup_questions with voice
options and audio samples. In Claude Code, render the recipe's combined
voice cards and resolve each voice/<voiceId> through
${CLAUDE_PLUGIN_ROOT}/assets/widget-media/manifest.json; use a label-only
card when the key is absent and never use or process the original sample URL.submit_voice with the selected preset id as voiceId.For Codex audition options, 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. For every host, write names and summaries 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, Codex 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.
In Claude Code specifically, use the provider-neutral localized display name as
the Elicitation data-value and keep the provider voice id only in the
label-to-id map held in context. Use an ephemeral DOM audio key for playback,
not the provider id. After the user presses Enter and the host-generated answer
line appears, map the visible name back to the preset id and continue without
another confirmation.
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 spending credits:
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's
anchor/editorial moment frame:mcp__core__browse_library({
category: "sound-effects",
query: "short whoosh transition",
});
mcp__core__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 suitable
match.// Custom/generated sound effect after the library has no suitable match
mcp__skill__submit_sound({ prompt: "A dog barking in the distance" });
// With custom duration (0.5-22 seconds)
mcp__skill__submit_sound({
prompt: "Thunder and heavy rain",
durationSeconds: 15,
});
// High prompt adherence
mcp__skill__submit_sound({
prompt: "Sci-fi laser gun firing",
promptInfluence: 0.8,
});
Tips for better results:
| Field | Description | Notes |
|---|---|---|
provider | TTS provider: doubao or elevenlabs | 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 and Doubao have separate voice catalogs. vivi / dayi are only
Doubao; mark / amelia / james are only ElevenLabs. Passing a Doubao name
to ElevenLabs (e.g. voiceId: "vivi" with provider: "elevenlabs") will fail.
If you need a specific voice and a particular language:
provider: "doubao" and either a curated Doubao
preset (vivi, dayi, xiaohe, yunzhou, liuchang, etc.) or a raw
speaker_id from the configured Doubao catalog.provider: "elevenlabs" and an ElevenLabs
preset.npx claudepluginhub chatcut-inc/agent-plugin --plugin chatcutGenerate audio content — text-to-speech, podcasts, voice cloning, sound effects, speech-to-speech, dubbing, and audio isolation. Currently powered by ElevenLabs. Works with both the Python SDK and the ElevenLabs CLI. Includes ready-to-run generator scripts that Claude writes to a temp file and executes directly. Triggers: audio, elevenlabs, text-to-speech, TTS, podcast, voice, voiceover, narration, voice clone, sound effects, dubbing, speech-to-speech, audio isolation.
Synthesizes high-quality speech with 18 voice personas, 32 languages, sound effects, and custom voice design via ElevenLabs API.
Creates single-voice audio content like audiobooks, voiceovers, narrations, jingles, and ads via TTS orchestration, background music, and FFmpeg assembly.