其他
把视频翻译配音成其他语言并保留原说话人音色(含唇形同步与双语…
当需要把一段视频翻译并配音成另一种语言、同时保留原说话人音色时,用一条流水线完成配音、唇形同步和字幕烧录。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 38/100 ×0.15
适用场景
把视频翻译配音成其他语言并保留原说话人音特定
解决思路
- 解析输入:位置参数 video_url 必须是 https:// 开头;--to <language> 指定目标语言(优先用语言代码如 es、fr、ja、de、pt-BR、zh-Hans);可选 --no-lipsync 跳过唇形同步、--no-bgm 只保留翻译语音丢弃原背景音乐、--bilingual-subtitles 烧录源语言+目标语言双语字幕。用户措辞里提到双语/双字幕/原文+译文字幕时即使没显式传 flag 也要推断 bilingual_subtitles=true。
- 若缺少 --to 就停下来询问用户;除非用户想要同一视频不同片段用不同语言、或只翻译部分片段——那走分段路径,用 segments 计划代替 --to。
- 分段/多语言配音路径:先用 extract_audio_from_video 抽取音频,再 transcribe_audio(audio=<audio_url>, timestamps=true) 得到带时间戳的转写,把带时间戳的片段展示给用户,让用户指定哪个时间范围用哪种语言,然后组装有序、不重叠的 segments[](单位秒),只调用一次 dub_video,例如 dub_video(source_video_url=<video_url>, segments=[{start_s: 0, end_s: 30, target_language: "es"}, {start_s: 30, end_s: 60, target_language: "ja"}])。segments 与 target_language 互斥,只能传一个。未被任何 segment 覆盖的时间范围保留原始音频(人声+背景)。输出长度锁定为源长度。分段路径自动走声音克隆路线,所有覆盖语言都必须被该路线支持,否则报错并查 references/language-coverage.md。
- Step 1 配音:调用 dub_video,参数 source_video_url=<video_url>、target_language=<target_language>(ISO/BCP-47 风格标签)、source_language="auto"、drop_background_audio=true 仅在 no_bgm 时设置否则省略(保留原音乐床)。dub_video 是 plugin-only 工具,若工具列表里没有就直接说明,不要用别的工具替代。
- 若 dub_video 返回 {task_id, status},轮询 task_status 直到 completed,再从结果读取配音视频(视频源读 video_url,音频源读 audio_url)。同时捕获可选的 subtitles[]、transcript_srt、transcript_language;做双语字幕时还要捕获可选的 source_subtitles[]、source_transcript_srt、source_transcript_language(源语言字段是尽力而为,缺失时配音媒体仍有效)。
- 源 URL 无法被 worker 抓取时(403/4xx、防盗链、UA 限制、Access Denied):不要反复重试同一调用。先在客户端/宿主环境用正常浏览器下载路径或带真实 user-agent 的 HTTP 客户端下载源字节;调用 upload_asset 传入文件名、MIME 类型、精确字节大小,把字节上传到返回的 presigned URL;设 source_input_url=<原始 URL>,把 video_url 替换为返回的 Pika CDN public_url(不要手工拼 CDN URL);对 Pika CDN URL 重试 Step 1 一次,后续所有步骤都用更新后的 video_url。若本地也下载不了,停下来告诉用户宿主阻止直接抓取,请其上传文件或换 URL。
- Step 2 唇形同步(默认开启):传了 --no-lipsync 就完全跳过,直接对 dubbed_video_url 做 Step 3 字幕。调用前先检查时长:edit_lipsync 上游硬上限 300 秒(5 分钟),超过会以 invalid_input 拒绝且所有 variant 层级共享同一上限,回退层级无用;若 Step 1 返回的 duration_seconds > 300 就完全跳过唇形同步,直接对 dubbed_video_url 做 Step 3,并告诉用户超过 5 分钟无法做唇形同步(配音本身不限长度)。只有 duration_seconds ≤ 300 才执行下面的调用。
- 调用前先做成本提示:用 cost_usd = duration_seconds / 60 * 4 估算(v2-pro 约 $4/分钟),短片段不要向上取整到整分钟(7 秒约 $0.47 而非约 $4)。给用户发一行提示,含实际时长和按比例估算,例如“Lipsync on — ~7s video, est. ~$0.47 at $4/min (pass --no-lipsync to skip). Starting now.”;若 duration_seconds 缺失且无可靠媒体时长,只说明 $4/min 费率不要编造金额。这只是提示不是审批门,随后直接调用。
- 调用 edit_lipsync(video_url=<dubbed_video_url>),不要传 audio_url——worker 会同步到配音视频自带的翻译音频,不要为了回传而抽取音频。variant 默认 v2-pro,可回退 sync-3 / v2。从响应的 url 读取 lipsynced_video_url。此步运行后 Step 3 要对这个视频做字幕,而不是 dubbed_video_url,否则唇形匹配会丢失。
- Step 3 烧录目标语言字幕:caption_target_video_url 在唇形同步运行(默认)时设为 lipsynced_video_url,在 --no-lipsync 跳过时设为 dubbed_video_url。若属于 Double 视频/分屏对比流程,先构建 Double 视频再把 caption_target_video_url 设为最终合成视频 URL,不要在合成前只给一个面板烧字幕,双语字幕只对最终视觉输出烧一次。对 caption_target_video_url 调用一次 add_captions。
- 双语字幕(bilingual_subtitles=true)且两条轨道都可用时用 manual 双语模式:add_captions(video_url=<caption_target_video_url>, caption_mode="manual", subtitles=<dub_subtitles>, secondary_subtitles=<source_subtitles>, language=<target_language>, secondary_language=<source_transcript_language if available>, secondary_subtitles_position="below", style="branded-space-mono", position="bottom")。目标语言(译文)行是主 subtitles 渲染在上,源语言(原文)行是次要参考渲染在下。只要 dub_video 返回两条字幕轨道,对所有配音 provider 分支都适用。
- 若 bilingual_subtitles=true 但 source_subtitles 缺失,回退为仅目标语言字幕,并告诉用户配音 provider 未提供源转写。不要通过重新转写最终配音音频来编造源语言行——那段音频已经是目标语言了。
- 仅目标语言字幕时优先用配音 worker 已返回的目标语言字幕:若 dub_subtitles 非空,调用 add_captions(video_url=<caption_target_video_url>, caption_mode="manual", subtitles=<dub_subtitles>, language=<target_language>, style="branded-space-mono", position="bottom")。manual 模式跳过重复转写并保留配音 provider 的目标语言文本。
- 若 dub_subtitles 缺失、为空或被 add_captions 拒绝,回退到 auto:add_captions(video_url=<caption_target_video_url>, caption_mode="auto", language=<target_language>, style="branded-space-mono", position="bottom")。auto 会重新转写配音音频,仅作兜底,因为它更耗时且可能引入 CJK/专有名词漂移。
- 除非用户要求更抓眼的风格(tiktok / hormozi / karaoke),否则用 style="branded-space-mono"。只有用户明确要求纯音频配音无字幕时才跳过此步。从响应的 url 读取 final_video_url。
- Step 4 返回:回复 final_video_url 加翻译转写(来自 dub_transcript_srt / 配音结果)供用户审阅。当本次只烧了目标语言字幕(bilingual_subtitles=false)且源转写可用(source_subtitles 非空)时,结尾询问用户是否也要双语版本,例如“Want a bilingual version with the original + translated subtitles stacked? I can add it.”;用户同意就在同一 caption_target_video_url(烧字幕前的视觉视频)上以 manual 双语模式重跑 Step 3,无需重新配音或重新唇形同步,只改字幕烧录,返回新的 final_video_url。已烧双语字幕(bilingual_subtitles=true)或 source_subtitles 缺失时跳过该提议——没有源转写就做不出双语版本,不要提供无法交付的东西。
- 失败处理:源 URL 不可抓取按上面的 rehost 流程;目标语言为粤语(yue/cantonese/zh-HK)、泰语、希伯来语、波斯语、斯洛文尼亚语、加泰罗尼亚语、挪威尼诺斯克语或南非荷兰语时照常调用 dub_video 并保留原说话人音色,但这些语言不保留背景音乐(仅配音语音);配音调用因其他原因失败(不支持的目标语言、provider/worker 5xx、task_status 返回 failed)时把错误抛给用户,若指向语言就查 references/language-coverage.md 建议受支持的标签,否则建议重试,没有手工链路可回退,不要静默产出未配音视频;视频无声时告诉用户“no detectable speech in video — nothing to translate”;原说话人音色无法保留(源太短或太吵)时报错并请用户提供更干净/更长的片段,不要换用其他音色;唇形同步源过长(>5 分钟)时跳过并直接对 dubbed_video_url 做字幕;唇形同步步骤失败时按 variant 层级回退(v2-pro → sync-3 → v2),全失败就返回无唇形匹配的配音视频并告知用户;字幕语言错误时传显式 language 标签,若有 dub_subtitles 就用 caption_mode="manual" 而非 auto;用户要双语字幕但 source_subtitles 缺失时用目标语言字幕并解释源转写不可用。
适用边界 · 注意事项
- 只想要字幕/说明文字(用 add_captions 或 video-captions),或只想要转写(直接用 transcribe_audio),或想翻译屏幕上的文字叠加层——这些不属于本技能。
- 源视频没有可检测语音(无声视频)时无内容可翻译。
- 需要依赖 Pika MCP 工具(dub_video、edit_lipsync、add_captions、upload_asset、task_status 等)和 sync.so 唇形同步服务,没有这些工具或付费账号时无法执行。