Video voiceover
Skill worldwonderer/video-recap-skills/skills/video-voiceover
把带时间戳的 narration.json 合成为中文解说音频。使用 MiMo TTS(mimo-v2.5-tts)逐段生成语音, 按时间窗动态适配语速并处理响度;输入输出时间线上的旁白,产出 tts_segments 与 tts_meta.json。 旧版直接剪辑路径也可显式传入 narration_mapped.json。触发词:配音、语音合成、TTS、解说配音、 voiceover、text to speech、旁白配音。From its SKILL.md
npx -y skills add worldwonderer/video-recap-skills --skill video-voiceoverAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- reads credentialsReads from 2 credential sources: `MIMO_API_KEY` and 1 more.
- runs commandsInstructs the agent to run 4 commands, including `python3 scripts/voiceover.py --work-dir <work_dir> --narration <narration.json>` and 3 more.
SKILL.md
3.5 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it
1. 定位
本技能读取带时间戳的旁白稿,为每一段生成独立音频,并把语音适配到对应时间窗,随后记录下游合成所需的放置元数据。
当前唯一引擎是 MiMo TTS(mimo-v2.5-tts)。
2. 环境要求
export MIMO_API_KEY=*** # 也可使用仅供 TTS 的 MIMO_TTS_API_KEY
下面的 scripts/... 均相对于本技能目录。若执行器从仓库根目录启动,请给脚本路径加上本技能的绝对目录。
脚本不从其他技能目录读取文件;外部输入仅限命令显式传入的稿件、音频、参数与 work_dir 产物。
3. 输入契约
默认输入为 work_dir/narration.json。每段必须包含 start、end 与 narration,可选字段包括
pause_after_ms 和 overlaps_speech。时间统一表示音频最终放置的输出时间线秒数。
编排式 cut 流程直接使用输出时间的 narration.json。只有旧版直接剪辑路径需要显式传入
narration_mapped.json。
4. 运行命令
python3 scripts/voiceover.py --work-dir <work_dir> --narration <narration.json> \
[--mimo-voice 冰糖 | --voice-ref <reference-audio>]
单独运行且省略 --narration 时,默认读取 work_dir/narration.json。旧版路径如需映射后的稿件,必须显式传入:
python3 scripts/voiceover.py --work-dir <work_dir> \
--narration <work_dir/narration_mapped.json>
5. 输出契约
tts_segments/*.wav:每段旁白对应一个音频文件。tts_meta.json:包含segments、engine与narration。每段记录audio_path、时间、pause_after_ms和放置字段。- 干净运行写入
partial: false与failures: []。 - 使用
--allow-partial-tts跳过失败段时,写入partial: true和failures: [{index,start,end,text,error}],让缺失语音保持可见。
6. 运行规则
- 重跑只复用内容与 TTS 设置均匹配的分段音频;修改旁白或合成参数后,只重生成受影响的 WAV。
--voice-ref仅用于 full/cut 解说克隆,切换到mimo-v2.5-tts-voiceclone。仅在确需新合成时惰性规范化一次;- dub voiceclone 原始 WAV 也会用模型、提示、台词和参考音频指纹缓存;匹配重跑不再重复请求或计费,
dub_manifest.json逐行记录tts_cache=hit|miss; 参考音频内容或预处理指纹变化会使旧缓存失效。仅在获得授权后使用,参考音频会发送到 MiMo。 TTS_WORKERS、TTS_TIMEOUT、TTS_RETRIES、ALLOW_PARTIAL_TTS用于调整并发、超时、重试与部分成功策略。- dub 模式有独立的确定性门禁:
dub_lint.json会在语音克隆前阻止空行、重叠或越界译文;dub_review.json用于记录忠实度、语气、时长和平台适配复核。可通过dub.py --stage lint|review或dub.py --print-schema单独调用。
7. 能力边界
- 不撰写或修改旁白文本。
- 不混流、不压低原声、不渲染字幕。
- 不分析视频,也不选择时间点;只为输入稿件中的既定分段配音。
What ships with it: 4 files
80.7 KB alongside SKILL.md, 4 of them executable
scripts/
- dub.pyruns27.8 KB
- lib.pyruns18.5 KB
- tts_audio.pyruns4.2 KB
- voiceover.pyruns30.2 KB
Gives 0 of the 12 instructions most video audio skills give in ~1.1k tokens
Counted across 619 of the 725 authors here whose files we hold, read 2026-09-06
- Read product marketing context firstin 13 of 619, across 7 files
- Define the core visual thesis in one sentencein 11 of 619, across 3 files
- Break the concept into 3 to 6 scenesin 11 of 619, across 3 files
- Render the smallest working version firstin 11 of 619, across 3 files
- Start with a low-quality smoke test renderin 11 of 619, across 3 files
- Add captions for accessibility and engagementin 11 of 619, across 5 files
- Write the scene outline before writing codein 11 of 619, across 3 files
- Specify subject, action, camera, style, and moodin 11 of 619, across 5 files
- Decide what each scene provesin 10 of 619, across 2 files
- Export one clean thumbnail framein 10 of 619, across 2 files
- Pick the right tool for the jobin 10 of 619, across 4 files
- Run the test suite before proposing a fixin 8 of 619, across 7 files
Said here and by no other author read
- Generate independent audio for each narration segment
- Adapt voice speed to the corresponding time window
- Reuse segment audio matching content and settings
- Use explicit tts-provider for reproducible selection
- Record placement metadata for downstream synthesis
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.