一条产品视频做英日韩配音:用 Gemini TTS 重排三版时间线
通过 Ofox 调用 Gemini TTS,把同一段产品演示做成英文、日文、韩文配音版。附真实 WAV、逐句时长、三份 MP4 和离线复现源码。
把同一条产品演示做成英、日、韩配音版,应先本地化台词,再分别生成声音,最后按每段实测时长重排画面。只翻译字幕不会改变口播,译文字数接近也不能证明音频能放进原时间窗。
我们于2026年10月9日通过 Ofox 调用 google/gemini-3.8-flash-tts,用 Kore 音色生成五段日文和五段韩文 WAV。英文复用上一篇配音教程的五段真实 Gemini 音频。这篇新增的是三套独立时间线和三份可下载成片,不是语种或供应商排名。
下载完整工程,或直接看英文 MP4、日文 MP4、韩文 MP4。用保存的素材重建视频不调用 API。
1. 先确定本地化到哪一层
源素材是 Opus 产品演示系列已有的30秒截图视频,保留9月30日拍摄的英文界面。本次没有重新调用 Opus 生成画面:Gemini 生成声音,Python 和 FFmpeg 处理旧画面与新语音的组合。
因此,交付是三个语种的配音版,不能称完整界面本地化。截图和英文标题卡仍然相同;没有新增字幕、翻译界面、声音克隆或口型同步。若投放必须展示当地语言界面,应另做画面编辑,优先使用真实本地化页面,不能改截图里的字来伪装产品已经支持该语言。
还要先确认时长限制。教程中的34秒视频通常可以正常展示,但严格限制30秒的广告位未必接受。本例允许延长画面以保留完整台词;若要求固定时长,应缩短对应译文并重生成,不能直接删掉最后几个词。
三版都只讲稳定事实:明确需求、展示模型目录、找到文档、展示 API 参考、提醒检查。历史截图里的价格、模型数量和促销不写进口播,旧画面不是今天产品承诺的证据。
2. 按场景本地化五句台词
逐句生成有利于修订。API 参考那一句发音不合适,只需重做对应音频,不必重新生成全段。审核者也能逐句比较意思、语气和画面动作,而不是对整段译文泛泛说“通顺”。
英文首句是“A clear product video starts with a clear brief.”,日文为 わかりやすい製品動画は、目的を明確にすることから始まります。,韩文为 이해하기 쉬운 제품 영상은 명확한 기획에서 시작됩니다.。三句表达相同任务含义,没有要求逐词对应。
第四句日文保留“以 API 参考页为例”的关系:この API リファレンスのように、各シーンに対応する実際のページを示します。。韩文使用 API 참조 문서,并说明当前画面展示什么,没有增加原稿不存在的功能。
下载包的 narration-drafts.json 保存全部十五句。文件名表示可编辑台词源,不代表发布前未审核:日、韩文字在生成前已完成独立 AI 语言审稿。这不等于真人母语配音或发音听评,更不证明声音一定按预期读出“API”。
制作自己的版本时,先列产品名、缩写、界面标签和必须保留英文的词。文字审核与声音验收分开,批准后的台词和 WAV 一起保存;改了文字后,不能把旧录音当作新台词的生成结果。
3. 明确语言、音色和格式再请求
从当前 Gemini TTS 模型页复制精确 ID。本次统一 Kore、WAV 和 speed: 1.0,语言代码分别为 en-US、ja-JP、ko-KR。

10月9日真实页面截图,保留英文界面。截图代码语速为1.1,本次实际请求为1.0。页面截图证明接入示例,保存的响应与音频证明实际生成结果。
下面是日文请求。韩文版本应同时替换台词和语言代码,不能只改文字却留下 ja-JP。
import os
from pathlib import Path
import requests
payload = {
"model": "google/gemini-3.8-flash-tts",
"voice": "Kore",
"input": "次に、ドキュメントがどこにあるかを案内します。",
"language_code": "ja-JP",
"speed": 1.0,
"response_format": "wav",
}
r = requests.post(
"https://api.ofox.io/v1/audio/speech",
headers={"Authorization": "Bearer " + os.environ["OFOX_API_KEY"]},
json=payload,
timeout=(15, 120),
)
r.raise_for_status()
if not r.headers.get("content-type", "").startswith("audio/"):
raise RuntimeError("Expected audio; inspect the response")
Path("ja-line-3.wav").write_bytes(r.content)
Key 用环境变量提供,不放前端或共享工程。上一篇下载包的完整客户端会检查媒体工具、保存安全元数据,不自动重试付费 POST。超时不证明服务端没工作,重发前先查请求状态和用量。
十次新请求均返回 HTTP 200,输出为24kHz、单声道、16位 PCM WAV,完整解码通过。这只证明本次输入在该日期生成成功,不保证下次输出完全一致。请求参数、时间与音频哈希必须成组保存,换音色或重跑后都重新测量。
4. 先比较真实时长,再动时间线
这里统计完整 WAV,包括其中的静音,不是逐词边界。用 ffprobe 测文件,不能按台词字数估时长。
ffprobe -v error -show_entries stream=codec_name,sample_rate,channels \
-show_entries format=duration -of json ja/line-1.wav
| 场景 | 英文 WAV | 日文 WAV | 韩文 WAV | 原场景 |
|---|---|---|---|---|
| 明确需求 | 3.56秒 | 5.32秒 | 4.68秒 | 4秒 |
| 模型目录 | 4.64秒 | 4.80秒 | 4.72秒 | 7秒 |
| 文档 | 3.44秒 | 3.80秒 | 4.28秒 | 7秒 |
| API 参考 | 4.96秒 | 6.12秒 | 6.76秒 | 7秒 |
| 结尾提醒 | 5.44秒 | 5.48秒 | 5.64秒 | 5秒 |
首场景已经不能机械复用:日文声音本身5.32秒,原场景只有4秒,还没算看清标题所需的留白。韩文 API 句加上入点和尾部空白,也需要更多时间。
这五句不能推导“日语总是更慢”或“韩语必然更长”。措辞、标点、音色和输出波动都会影响时长。能成立的结论是:每段都测量,再决定对应画面怎么编辑。
5. 为每个语种重新计算切点
原视频切点是0、4、11、18、25、30秒。脚本保留五个场景的顺序,分别计算新时长:开头留0.35秒,WAV结束后至少留0.65秒;不足时停留该场景最后一帧,不加速、不截短口播。
30fps 下计算方式如下:
scene_frames = ceil(max(original_scene_seconds, wav_seconds + 1.0) * 30)
scene_seconds = scene_frames / 30
speech_start = cumulative_scene_seconds + 0.35
向上取整到完整视频帧后,最终英文约32.03秒、日文33.97秒、韩文34.13秒。因此本篇英文成片也不是上一篇32秒成片的相同文件,这里对三个语种采用同一逐场景规则。
安装 Python 3、FFmpeg 和 ffprobe,解压后执行:
python3 assemble_localized.py en source.mp4 rebuilt-en
python3 assemble_localized.py ja source.mp4 rebuilt-ja
python3 assemble_localized.py ko source.mp4 rebuilt-ko
每个输出目录包含 narrated.mp4、narration.wav、timing.json 和 probe.json。时间表记录原画面区间、新场景时长、额外停留、音频开始结束及哈希。使用新目录,避免覆盖旧版本。
截图演示适合短暂停帧,因为参考页面仍然可见。但人物口播、光标移动和快速动作不一定适用,需要重剪或重做对应画面。停帧保留像素,不会让人物嘴型自动匹配译文。
6. 文件验收和语言验收分别做
三份视频均有 H.264 视频流和 AAC 音轨。本地验证将流时长与计划时间线比较,并完整解码:
ffprobe -v error -show_streams -show_format -of json rebuilt-ja/narrated.mp4
ffmpeg -v error -i rebuilt-ja/narrated.mp4 -f null -
视觉重点看最长句和所有延长的场景。底层还是英文界面,日、韩口播应解释任务,不能声称画面标签也变成当地语言。分发文案同样要保留这个范围。
技术通过不等于发音通过。正式投放自己修改的版本前,应完整播放,听“API”、产品名、词尾及跨场景停顿。本文没有组织人类听评,不宣称母语级效果或优于其他供应商,下载文件保留了实际输出供评估。
另一个模型的转写可帮助发现疑似漏词,但不能当作声音内容的唯一真相。原批准台词要保留,有分歧回听;逐词字幕需要另做带验证时间戳的转写或对齐,句子级时间表不能替代它。
7. 让后续修订和费用有据可查
只改了一句,也要测量新 WAV 后重建该语种整条时间线。不要覆盖音频却保留旧哈希和旧切点。发布记录至少包含台词版本、请求参数、源画面日期和最终文件哈希。
三个成片时长不是三张账单:英文声音复用,日、韩新增十次生成。尚未逐笔核对最终扣费,因此本文不报总费用或节省比例。扩大批量前,要先核对模型计费单位与请求明细。
遇到失败时区分网关鉴权、供应商额度、解码和本地时间线问题。供应商配额错误不能直接归因为 Ofox 钱包没余额;若声音已生成,组装却因源视频不是30秒或 PCM 格式不同而失败,应修正本地输入,不要反复付费生成同一段声音。
先选一段包含难读术语的译文做验证,再扩大到完整视频。真正可复用的是已审台词、保存的声音和各语种时间表,而不是一套不加测量就通用于所有语言的切点。
常见问题
- 日文和韩文能直接套英文时间线吗?
- 只能作为初始参考,必须测量实际音频。本例首句英文3.56秒、日文5.32秒、韩文4.68秒,原始第一场景需要分别延长。
- 不用 API 额度能复现视频吗?
- 可以。下载包内含已生成音频与源视频,FFmpeg 本地组装不调用 API。重新生成声音才需要有访问权限和可用额度的 Key。
- 三版视频是否已经完全本地化?
- 没有。三版是本地化配音,底层仍是历史英文界面,没有替换为本地化界面、翻译画面标题,也没有逐词字幕或口型同步。


