Install
openclaw skills install vociemaster专业级 AI 短视频配音助手,支持多角色音色映射、自动语速调节及 BGM 建议。
openclaw skills install vociemaster为短视频文案生成可直接交付的 AI 配音结果。优先输出单个 mp3 文件;无法本地合并时,返回分段下载卡片并明确片段顺序。使用 SenseAudio 官方接口文档:
https://senseaudio.cn/docs/api-keyhttps://senseaudio.cn/docs/text_to_speech_apihttps://senseaudio.cn/docs/voice_api先检查环境变量 SENSEAUDIO_API_KEY。如果已经存在,直接使用;如果不存在,再提示用户提供 API Key 或先在终端设置环境变量。不要把密钥写进 SKILL.md、脚本源码或提交记录。
始终优先使用用户显式指定的 voice_id。未指定时,根据文案语气、角色设定和平台风格,从下表选择最贴近的音色,并在同一项目内保持角色映射稳定。
在当前 SenseAudio key 权限有限时,仅默认使用已确认可用的以下音色:
child_0001_b:可爱萌娃,平稳male_0004_a:儒雅道长,平稳male_0018_a:沙哑青年,深情不要默认选择未确认授权的 VIP / SVIP 音色。若接口返回 403 no access to the specified voice,优先回退到 child_0001_b,而不是重复尝试未授权音色。
VOICE_MAP:
温柔女声: child_0001_b
知性旁白: male_0004_a
新闻主播: male_0004_a
热血男声: male_0018_a
沉稳纪录片: male_0004_a
青春活力: child_0001_b
电商促销: child_0001_b
儿童陪伴: child_0001_b
悬疑低语: male_0018_a
治愈故事: child_0001_b
儒雅道长: male_0004_a
沙哑青年: male_0018_a
可爱萌娃-平稳: child_0001_b
多角色文案处理规则:
角色名:、旁白:、主持人: 等显式说话人标记。role -> voice_id 映射,后续所有分段复用同一映射。voice_id,所以多角色脚本不能整段一次性提交。在执行前整理以下信息:
speed。未指定时按风格估算,但必须限制在 0.5 到 2.0。pitch。未指定时使用 0。voicemaster-output.mp3。默认参数:
format: mp3
sample_rate: 44100
speed: 1.0
pitch: 0
如果用户给的是完整、可直接配音的剧本,按现有流程直接整理角色、分段和音色即可。
如果用户提供的是以下任一输入形态,不要直接开始 TTS,先生成一版可编辑的对话草稿:
执行顺序:
草稿要求:
旁白:...、角色A:...、角色B:...。以下模板用于“先写草稿、再确认、后配音”的阶段。优先根据用户主题、平台风格和情绪目标,从中选择最贴近的一套,再按用户需求改写。
适用场景:
推荐结构:
草稿骨架:
旁白:那天以后,我才知道,有些话说晚了,就真的来不及了。
角色A:你当时为什么什么都不说?
角色B:不是我不想说,是我说了,你也不会信。
角色A:可你连试都没试过。
旁白:他们都以为自己受了委屈,却没人发现,对方也在硬撑。
角色B:如果再来一次,我不会再让你一个人扛。
旁白:有些误会,解开只要一句话;可有些人,等一句话等了一辈子。
适用场景:
推荐结构:
草稿骨架:
角色A:你有没有发现,现在的人嘴上说早睡,手上却在刷到凌晨两点。
角色B:别骂了,我刚把“再看五分钟”演成了两个小时。
角色A:最离谱的是,第二天还要怪闹钟不懂事。
角色B:闹钟已经很努力了,是我的手不愿意放下手机。
角色A:所以问题到底出在哪?
角色B:出在我每次都以为,下一个视频一定不精彩。
适用场景:
推荐结构:
草稿骨架:
旁白:如果你也总觉得早上出门时间不够,那这段一定要看完。
角色A:我最怕的就是化妆麻烦、搭配麻烦,最后一着急全乱了。
角色B:那你就别再用一堆步骤堆时间了,先把最影响出门效率的那一步换掉。
角色A:问题是,便宜的怕不好用,好用的又怕太贵。
角色B:所以才推荐这种上手快、效果稳、价格也好接受的款,赶时间的时候特别省心。
旁白:想要省时间、少踩坑、直接提升出门效率,这种才是更适合日常复购的选择。
适用场景:
推荐结构:
草稿骨架:
旁白:很多人以为,做事效率低只是因为不够努力,但真相往往不是这样。
角色A:那到底卡在哪?我每天也没闲着。
角色B:问题不一定是你不努力,而是你总在用“切来切去”的方式消耗注意力。
角色A:所以我不是事太多,是一直在被打断?
角色B:对。你每切一次任务,大脑都要重新进入状态,时间就被一点点吃掉了。
旁白:如果你想先把效率提起来,先减少无意义切换,再谈更高强度的执行。
适用场景:
推荐结构:
草稿骨架:
旁白:所有人都以为,是她做错了。
角色A:证据都摆在这了,你还想怎么解释?
角色B:你看到的,只是别人想让你看到的。
角色A:如果不是你,那你为什么一直不说?
角色B:因为我一开口,他们就会知道,真正该怕的人不是我。
旁白:那天门一打开,大家才明白,原来从头到尾被算计的人,根本不是她。
适用场景:
推荐结构:
草稿骨架:
旁白:后来我慢慢发现,人最难放过的,往往不是别人,而是自己。
角色A:以前我总想把所有事情都做到最好,生怕别人失望。
角色A:可时间久了我才明白,你越是拼命讨好所有人,就越容易把自己弄丢。
角色A:现在的我,不是不认真了,只是终于学会了,把力气用在值得的人和事上。
旁白:成熟不是突然看开,而是一次次失望之后,终于学会把心收回来。
建议语速:
0.88 到 0.980.98 到 1.081.05 到 1.181.12 到 1.25若可用音色受限,默认采取以下补偿策略:
male_0004_a,语速 0.92 到 1.0male_0018_a,语速 0.88 到 0.98child_0001_b,语速 0.96 到 1.08child_0001_b当文本超过 500 字时,必须自动进行逻辑分段请求,避免超时。
执行规则:
180 到 450 字之间,避免把一句话拆开。01 开始。helper.py concat 合并为一个 mp3。API 地址固定为:
https://api.senseaudio.cn/v1/t2a_v2
优先使用 jq 构造 JSON,避免转义错误。默认走非流式模式,便于直接拿到 hex 音频并落盘。
重要:先按最小请求体调用官方接口,不要一开始就附带全部可选字段。若接口返回 400 input content type is not supported,优先怀疑请求体结构与官方当前协议不一致,而不是继续切换音色。
请求模板:
jq -n \
--arg text "$TEXT" \
--arg voice_id "$VOICE_ID" \
--arg model "SenseAudio-TTS-1.0" \
'{
model: $model,
text: $text,
stream: false,
voice_setting: {
voice_id: $voice_id
}
}' |
curl -sS "https://api.senseaudio.cn/v1/t2a_v2" \
-H "Authorization: Bearer $SENSEAUDIO_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @-
最小请求体跑通后,再逐步增加以下可选字段,每次只增加一类:
voice_setting.speedvoice_setting.pitchaudio_setting.formataudio_setting.sample_rateaudio_setting.bitrateaudio_setting.channel多片段请求时,额外在本地维护上下文元数据即可,不要求额外提交给官方接口。保持每段 model、voice_setting、audio_setting 一致。
SenseAudio 非流式 TTS 的成功响应为 JSON,其中 data.audio 是 hex 编码的音频数据。处理规则如下:
base_resp.status_code 是否为 0。data.audio 并按十六进制解码为二进制音频文件。extra_info.audio_length、extra_info.audio_sample_rate 作为结果回执。data.audio 为空或 status_code 非 0,直接返回 base_resp.status_msg。响应结构参考:
{
"data": {
"audio": "hex编码音频",
"status": 2
},
"extra_info": {
"audio_length": 3500,
"audio_sample_rate": 44100
},
"base_resp": {
"status_code": 0,
"status_msg": "success"
}
}
helper.py synthesize 发送请求并把 hex 音频保存到本地。segment-01.mp3、segment-02.mp3。segment-01-narrator.mp3、segment-02-youngman.mp3。helper.py concat 生成最终文件。ffmpeg 不可用,则保留分段文件并把路径按顺序返回给用户。data.audio,把完整原始 JSON 一并带回,便于后续比对协议变更。示例:
python helper.py synthesize ^
--text-file segment-01.txt ^
--voice-id male_0004_a ^
--speed 0.96 ^
--pitch 0 ^
--output outputs\segment-01.mp3
python helper.py concat ^
--output outputs\final.mp3 ^
outputs\segment-01.mp3 outputs\segment-02.mp3 outputs\segment-03.mp3
仅在以下情况调用本地脚本:
hex 音频响应落盘。命令概要:
python helper.py synthesize --text-file <segment.txt> --voice-id <voice_id> --output <file.mp3>
python helper.py concat --output <final.mp3> <segment1.mp3> <segment2.mp3> ...
完成配音后,始终给出:
voice_id,以及为何匹配该风格。speed 与 pitch。status_code 与 status_msg。voice_id。配音完成后,必须根据文案情感推荐 2 到 3 种背景音乐方向,避免只给宽泛标签。按以下映射优先推荐:
输出建议时,同时说明:
ffmpeg,返回按顺序编号的分段结果,并说明未执行自动合并。voice_id,按以下顺序优先尝试:male_0004_a、male_0018_a、child_0001_b。