中文视频改成英文版,最好先分成三份:原始转写、人工确认的英文字幕、单独生成的英文配音片段。这三份要能对回同一条事实和同一段时间轴。机器转写会漏字,翻译会压缩语义,配音也可能读错单位;不能因为 WAV 已经生成,就当作视频已经可以发布。
本例用一段完全虚构的咖啡杯介绍:容量 300 毫升、双层不锈钢、携带前拧紧杯盖、杯体可能发热。它不对应真实商品,也没有测过保温、密封、耐热或认证。练习包里的原音由本机 macOS 合成,仅做流程测试,未放进公开下载包。
1. 先把事实锁定
先从源稿提取只允许出现的事实,再写翻译。真实出海视频应由产品负责人确认产品型号、数值、单位、警示和当地术语;未知的信息先留空。
| 中文源稿 | 本例英文字幕 | 复核点 |
|---|---|---|
| 便携式咖啡杯 | portable coffee mug | 没有扩写成“保温杯” |
| 容量三百毫升 | holds 300 milliliters | 数值与单位都要听、看两次 |
| 采用双层不锈钢 | double-wall stainless steel body | 不增加等级、材质牌号或保温时间 |
| 携带前请拧紧杯盖 | tighten the lid before carrying it | 保留动作和时机 |
| 杯体可能发热 | the cup may get hot | 不把可能性删掉或改成保证安全 |
练习包的 input/source-script.md 保存虚构源稿和事实边界,input/approved.en.srt 是人工核过的英文字幕。字幕保留“300 milliliters”的完整写法;口播用拼写和音素提示分开保存,避免字幕为了迁就读音而改变事实。
2. 用 FunASR 生成初稿,再回听拆句
先在本地准备好 FunASR 和所需模型。下面的调用返回句子文本和毫秒级边界:
from funasr import AutoModel
model = AutoModel(
model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc",
device="cpu", disable_update=True,
)
result = model.generate(
input="source.wav", batch_size_s=60, sentence_timestamp=True
)[0]
for sentence in result.get("sentence_info", []):
print(sentence["start"], sentence["end"], sentence["text"])
本机对 13.52 秒的中文合成原音转写用时 1.52 秒,句级推理约 1.44 秒,得到 5 段 sentence_info。模型把“今天介绍这款便携式咖啡杯”和后面的“杯身容量三百毫升”连成一段;我对照已知源稿和字符时间戳,在 4.03 秒处手工拆开。若真实音频听不清楚,就回听或找原稿确认,不要只按 ASR 边界切。
sentence_info.start 和 end 的单位是毫秒,但能否返回有用边界取决于模型与处理链。自动边界不是强制对齐结果,也不保证每个词都有时间戳;FunASR 官方说明中也提醒返回字段依模型而异。生成后仍要核对开始时间、结束时间、漏字、数字和标点。查看 FunASR 返回字段说明
3. 逐句翻译并保存字幕
按已经确认的事实翻译,再把英文字幕放回中文原音的时间轴。例子中的片段如下:
2
00:00:01,050 --> 00:00:04,030
Today we're introducing this portable coffee mug.
3
00:00:04,190 --> 00:00:06,070
It holds 300 milliliters.
字幕行要短到能在画面上读完;必要时一条中文句拆成两条字幕,时间点用原声停顿和字符时间戳复核。完成后,在播放器里对照原音、字幕和画面一起检查,不要只看 SRT 文本。
4. 用 IndexTTS-2.5 做逐句配音
IndexTTS-2.5 官方文档列出中文、英文、日语、西班牙语和阿拉伯语支持,并提供参考音频推理示例。它使用参考音频来克隆音色,所以只用本人或已获得明确授权的录音;不要因为某段音频能下载就推定可以克隆或商业使用。当前模型许可还规定:若本人或关联方提供的产品或服务上月月活超过1亿,或上一年度营收超过人民币1亿元,应另行申请商业许可;引入第三方数据或权重也须自行取得合法授权。商业使用前请回到许可原文确认版本和适用条件。查看 IndexTTS 文档 · 查看模型许可
先把已复核的英文切成短句,然后每句输出一个 WAV:
from indextts.infer_v2_5 import IndexTTS2
tts = IndexTTS2(
cfg_path="checkpoints/config.yaml",
model_dir="checkpoints",
device="cpu",
)
tts.infer(
spk_audio_prompt="authorized-reference.wav",
text="It holds three hundred milliliters.",
lang="en",
output_path="output/capacity.wav",
)
注意语言代码使用小写 en。本机第一次用 EN 生成后,英语回读不匹配;改成官方测试采用的小写 en 后再测。容量句的 SenseVoice 回读仍缩短了 milliliters,所以参考 IndexTTS 的 CMU 音素格式,为术语加了发音提示:
three hundred <milliliters|M IH1 . L AH0 . L IY2 . T ER0 Z>
CMU 词典给出的 milliliters 发音为 M IH1 L AH0 L IY2 T ER0 Z。带提示的短句单独生成后,本机 SenseVoice 回读为 “It holds 300 milliliters.”;长段落合成时回读仍曾缩成 “300mili”。因此练习包按句生成独立音频,便于单独听、重做和放入剪辑时间轴;短句回读通过也不能代替人工试听。CMU 词典原始词条
解压练习包后,可用 generate_dub.py --self-check 检查 4 条配音稿,再把自己的授权参考音频和 IndexTTS 模型目录传入脚本。脚本输出分句 WAV 和 run-report.json,不上传音频,也不包含模型权重。
5. 测量时长后放进时间轴
本机用 CPU 运行 IndexTTS-2.5,模型加载约 19.3 秒。完整段落曾用 122.0 秒生成 13.60 秒配音;中文源音长 13.52 秒,整段总长相近,但单位在长段里仍未完全通过回读。单独容量句约 2.72 秒,原声对应区间约 1.88 秒,明显放不下。
这时不要挤压字幕或删掉事实。可先缩短不改变意思的译句、把短语移到空白处、调整镜头节奏,再试听并检查语速。若必须调速,检查变速后读音、音高和警示清晰度;每个片段都要重新回听。配音总长相同不代表逐句已经同步。
6. 发布前检查标识和授权
中国《人工智能生成合成内容标识办法》把 AI 生成合成的音频、视频等纳入管理;办法第十条要求用户发布生成合成内容时主动声明,并使用服务提供者提供的标识功能。目的地国家、平台、商业合作和具体生成服务也可能有额外要求。发布前查看当前规则和界面,不要删除、伪造或隐藏生成标识。查看网信办办法原文
逐项检查:
- 事实:产品名、数字、单位、材质和警示与源稿一致。
- 读音:逐句试听,重点检查名字、数字、单位和否定词;必要时用目标语言母语者复核。
- 时间轴:字幕和口播都对准原声停顿与画面切换;确认没有漏句、抢话或尾音被截。
- 授权与标识:参考音频用途授权、音乐和画面授权、平台 AI 标识和商业披露分别核对。
完整练习素材和逐句配音脚本见外语视频配音和字幕练习包。本次只是虚构材料的本机流程实测,不代表真实视频、真人声音、目标市场法规或平台发布审核已经通过。