{"id":"video-voiceover","name":"video-voiceover","summary":"タイムスタンプ付きのnarration.jsonを中国語のナレーション音声に組み合わせる。MiMo TTS(mimo-v2.5-tts)を用いて音声セグメントごとに生成し、時間ウィンドウや音量処理に応じて音声速度を動的に調整します。","body":"## 1. 定位\n\n本技能读取带时间戳的旁白稿，为每一段生成独立音频，并把语音适配到对应时间窗，随后记录下游合成所需的放置元数据。\n当前唯一引擎是 MiMo TTS（`mimo-v2.5-tts`）。\n\n## 2. 环境要求\n\n```bash\nexport MIMO_API_KEY=***  # 也可使用仅供 TTS 的 MIMO_TTS_API_KEY\n```\n\n下面的 `scripts/...` 均相对于本技能目录。若执行器从仓库根目录启动，请给脚本路径加上本技能的绝对目录。\n脚本不从其他技能目录读取文件；外部输入仅限命令显式传入的稿件、音频、参数与 `work_dir` 产物。\n\n## 3. 输入契约\n\n默认输入为 `work_dir/narration.json`。每段必须包含 `start`、`end` 与 `narration`，可选字段包括\n`pause_after_ms` 和 `overlaps_speech`。时间统一表示音频最终放置的**输出时间线秒数**。\n\n编排式 cut 流程直接使用输出时间的 `narration.json`。只有旧版直接剪辑路径需要显式传入\n`narration_mapped.json`。\n\n## 4. 运行命令\n\n```bash\npython3 scripts/voiceover.py --work-dir <work_dir> --narration <narration.json> \\\n  [--mimo-voice 冰糖 | --voice-ref <reference-audio>]\n```\n\n单独运行且省略 `--narration` 时，默认读取 `work_dir/narration.json`。旧版路径如需映射后的稿件，必须显式传入：\n\n```bash\npython3 scripts/voiceover.py --work-dir <work_dir> \\\n  --narration <work_dir/narration_mapped.json>\n```\n\n## 5. 输出契约\n\n- `tts_segments/*.wav`：每段旁白对应一个音频文件。\n- `tts_meta.json`：包含 `segments`、`engine` 与 `narration`。每段记录 `audio_path`、时间、\n  `pause_after_ms` 和放置字段。\n- 干净运行写入 `partial: false` 与 `failures: []`。\n- 使用 `--allow-partial-tts` 跳过失败段时，写入 `partial: true` 和\n  `failures: [{index,start,end,text,error}]`，让缺失语音保持可见。\n\n## 6. 运行规则\n\n- 重跑只复用内容与 TTS 设置均匹配的分段音频；修改旁白或合成参数后，只重生成受影响的 WAV。\n- `--voice-ref` 仅用于 full/cut 解说克隆，切换到 `mimo-v2.5-tts-voiceclone`。仅在确需新合成时惰性规范化一次；\n- dub voiceclone 原始 WAV 也会用模型、提示、台词和参考音频指纹缓存；匹配重跑不再重复请求或计费，`dub_manifest.json` 逐行记录 `tts_cache=hit|miss`；\n  参考音频内容或预处理指纹变化会使旧缓存失效。仅在获得授权后使用，参考音频会发送到 MiMo。\n- `TTS_WORKERS`、`TTS_TIMEOUT`、`TTS_RETRIES`、`ALLOW_PARTIAL_TTS` 用于调整并发、超时、重试与部分成功策略。\n- dub 模式有独立的确定性门禁：`dub_lint.json` 会在语音克隆前阻止空行、重叠或越界译文；\n  `dub_review.json` 用于记录忠实度、语气、时长和平台适配复核。可通过\n  `dub.py --stage lint|review` 或 `dub.py --print-schema` 单独调用。\n\n## 7. 能力边界\n\n- 不撰写或修改旁白文本。\n- 不混流、不压低原声、不渲染字幕。\n- 不分析视频，也不选择时间点；只为输入稿件中的既定分段配音。","author":"@worldwonderer","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/worldwonderer/video-recap-skills/tree/main/skills/video-voiceover","license":"MIT","category":null,"lang":"multi","tokens":950,"stars":0,"calls30d":1,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"scripts/dub.py","size":28477,"sha256":"5c5f0981353ceab03007e2fff74f8f98393b62be672fd8833b6c7c2b6ae0709d"},{"path":"scripts/lib.py","size":18936,"sha256":"065239ba5699cd5c2148a843e26c6bcdc3f0d6e464bec03a3a0af93ae83ca9f0"},{"path":"scripts/tts_audio.py","size":4300,"sha256":"e7bd0afc34cd906e8e7178c6974a7c6ddc2cd728072290e5e5e5d6abeb103a90"},{"path":"scripts/voiceover.py","size":30875,"sha256":"62e26934ccbedf069b3acce2dfe7c44469efa0a2177780bdba4092423dc7c821"}],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[{"code":"net.endpoints","kind":"exfiltration","excerpt":"api.xiaomimimo.com, token-plan-ams.xiaomimimo.com, token-plan-cn.xiaomimimo.com, token-plan-sgp.xiaomimimo.com","message":"bundled scripts reach 4 external host(s)","severity":"warn"}],"scannedAt":"2026-08-22","hasScripts":true,"networkEndpoints":["api.xiaomimimo.com","token-plan-ams.xiaomimimo.com","token-plan-cn.xiaomimimo.com","token-plan-sgp.xiaomimimo.com"]}}