用途
screenkite-audio-dub 用于把 ScreenKite 录屏中的口播音频替换为另一种语言的时间匹配配音。原始停顿会被保留,对齐按每个 cue 单独处理,而不是把整段音频拉伸成一个文件。
主要能力
- 词级转写:优先使用 ScreenKite 的 export-words(沿用 GUI 的 ElevenLabs Scribe 配置,返回剪切后的时间线秒数),失败时回退到 screenkite-transcription-cut 的 transcribe_mic.py。
- 打包 cue:pack_cues.py 将词级 JSON 转为 cues.json 与 source.srt,--silence-threshold 默认 0.45,可调高合并更多语音、调低实现近乎逐句配音。
- 翻译填写:复制 cues.json 并为每个 dub_text 填入目标语言文本,保持每个原始窗口一个 cue,不合并或拆分。
- 时间匹配混音:gen_dub.py 对每个 cue 以 speed 1.0 生成 TTS;若时长偏差超过 8%,用 prosody.speed(Fish 0.5–2.0)或 ElevenLabs voice_settings.speed 重新生成;仍过长则用 ffmpeg atempo;再长则硬裁剪(报告为 clipped);过短则在窗口内补静音。最终混到与时间线等长的静音底上。
- 应用配音:apply_dub.py 将原麦克风轨设为 mute: true,并新增 type=audio 且带 createTrack: {name, language} 的音轨,使 ScreenKite 的语言分组音频导出把配音视为独立语言。
- 可选字幕:可从配音 SRT 通过 fx captions import 导入字幕。
使用方式
前置条件:screenkite CLI(/usr/local/bin/screenkite),每次调用尽量带 --project;PATH 中有 ffmpeg 与 ffprobe;Python 3.10+ 与 requests(建议 uv run --with requests)。默认 TTS 为 Fish Audio,需要 FISH_API_KEY(可在 bundle 向上查找的 .env、~/.config/env/*.env 或环境变量中),语音 id 通过 --voice 或 FISH_VOICE_ID 指定,密钥获取地址为 https://fish.audio/app/api-keys。ElevenLabs 回退需要 ELEVEN_LABS_API_KEY(带下划线),可选 ELEVEN_VOICE_ID(默认 George JBFqnCBsd6RMkjVDRZzb)。若缺少 Fish 密钥,应先向用户索取;仅在用户同意或 Fish 不可用时切换到 ElevenLabs。
流程分七个阶段:
- 盘点:用 stat(scope summary)、ls-assets、transcribe-ready 获取 project.duration、麦克风 trackId(通常含 mic)与 projectRevision。
- 转写:export-words 输出 transcript.json;失败则回退。转写可能短、嘈杂或错误,翻译前应向用户展示源文本。
- 打包 cue:运行 pack_cues.py 生成 cues.json 与 source.srt,展示 cue 表,未填 dub_text 前不生成音频。
- 翻译(必须复核):填写 dub_text,匹配含义而非词数,保留产品名与代码标识符,不改 start/end,展示前后对照表并等待用户确认。
- 生成时间匹配混音:gen_dub.py 支持 --provider fish 或 elevenlabs,--list-voices 可列出 Fish 语音,--dry-run 只打印计划不调用 TTS。真实运行后检查 report.json 中的 clipped_cue_ids 与 max_abs_drift_s,若有裁剪需改写并重新生成。
- dry-run 应用(必须):确认静音目标是麦克风而非系统音频,用户确认前不应用。
- 应用:执行 apply_dub.py。撤销可用 edit-timeline action=undo(每次变更一次,先 mute 后 add),也可将麦克风轨 props mute 设为 false 或静音新配音轨来恢复原声。
适用场景
需要为 ScreenKite 录屏制作多语言配音、且希望保留原始停顿与逐句时间对齐的场景。4 秒测试录音也可作为冒烟测试:打包 → 一两个 cue → 生成 → 应用。
限制与注意事项
- 不要把整段脚本作为单个文件做 TTS,否则停顿塌陷、cue 漂移。
- 不要跳过翻译复核,错误 ASR 会进入配音。
- 除非用户要求,不要静音系统音频,只静音麦克风轨。
- 不要跳过 dry-run 直接应用。
- 不要依赖过期的默认项目,每次调用都传 --project。
- 不要忽略被裁剪的 cue,硬裁剪会吃掉句尾,应缩短 dub_text 并重新生成该 cue。
- 多语言配音不要用 fx voiceover/replace,那会替换主口播音频且没有语言标签;优先用 add + createTrack。仅当用户想要原地替换且不新增音轨时才用 voiceover/replace。
- 若 export-words 返回几乎没有语音,应停止并询问是否强制重新转写或换项目。
- 官方文档未提供收费、价格、平台支持范围等信息。