使用 Claude Code 构建这套系统极其高效。你不需要自己从零手写每一行音频对齐与 FFmpeg 命令,而是利用 Claude Code 的 Agent 级终端能力(自动读写代码、运行 CLI、捕获终端报错并自行修 Bug),直接在终端让它帮你搭建并打通整个 Python 自动化管道。项目整体架构系统主要包含三个核心模块:Plaintext[原始视频 + 外语 SRT]

   │
   ▼
  1. 智能翻译模块 (LLM / API) ──► 将 SRT 文本批量翻译为自然中文,保持时间戳不变

    │
    ▼
  2. 配音与对齐引擎 (edge-tts + pydub) ──► 逐句生成中文语音,超长自动加速,补齐静音

    │
    ▼
  3. 视频合成引擎 (FFmpeg) ──► 替换原视频音轨,压制硬字幕,导出 final_output.mp4
    使用 Claude Code 落地搭建步骤1.1. 创建工作区与基础环境:耗时约 2 分钟。在终端中创建一个独立文件夹,准备好原始视频 video.mp4 和外语字幕 sub.srt,然后启动 Claude Code:Bashmkdir video-auto-translator && cd video-auto-translator

    放入你的测试文件 video.mp4 和 sub.srt

启动 Claude Code

claude
2.2. 向 Claude Code 下达构建 Prompt:让 Agent 自动编写完整管道。在 claude 交互终端中,直接复制输入以下提示词:给 Claude Code 的 Prompt:“请在这个目录下帮我从零搭建一个 Python 自动化视频翻译与配音 CLI 工具 auto_dub.py。需求如下:1. 依赖安装:自动检查并用 pip 安装 pysrt、edge-tts、pydub、openai。2. 字幕翻译:读取传入的外语 SRT 字幕,调用 OpenAI API(使用环境变量 OPENAI_API_KEY)将字幕文本批量翻译为自然的中文口语,保留原始时间戳并导出 zh_sub.srt。3. 动态音频对齐:使用 edge-tts(默认音色 zh-CN-YunxiNeural)逐句生成中文配音。计算生成的音频时长:如果大于字幕时间窗,调用 pydub 进行 speedup 动态加速(限速最高 1.4 倍);如果前后有空隙,补齐静音段。4. FFmpeg 视频合成:拼接完整中文音轨,调用 FFmpeg 替换视频原有音频,并将 zh_sub.srt 烧录到视频中,导出为 output.mp4。5. 测试与修复:编写完代码后,请自动执行 python auto_dub.py --video video.mp4 --srt sub.srt --output output.mp4 进行测试。如果遇到 FFmpeg 路径、asyncio 事件循环或 pydub 类型错误,请读取终端报错日志并自行修改代码,直到测试通过。”3.3. 观察 Claude Code 的自主执行与自纠错:全自动无人值守执行。Claude Code 会开始在终端中自主完成以下动作:创建文件:生成 auto_dub.py 代码框架。环境配置:自动运行 pip install 补充依赖。测试运行:调用 python auto_dub.py ... 触发第一版脚本。自动捕获报错并修复:例如如果遇到 edge-tts 在异步循环中的报错或 FFmpeg 的字符转义问题,Claude Code 会实时拦截日志、修正代码并再次重试,直到生成最终视频。核心生成的脚本逻辑 (auto_dub.py 源码参考)以下是 Claude Code 在后台为你生成并调优的核心 Python 源码参考:Pythonimport argparse
import asyncio
import os
import sys
import pysrt
from pydub import AudioSegment
import edge_tts
from openai import OpenAI

def translate_srt_to_chinese(srt_path, output_zh_srt_path):

client = OpenAI(
    api_key=os.environ.get("OPENAI_API_KEY"),
    base_url=os.environ.get("OPENAI_BASE_URL", "https://api.openai.com/v1")
)
subs = pysrt.open(srt_path, encoding='utf-8')
texts = [f"{i}: {sub.text.replace('\n', ' ')}" for i, sub in enumerate(subs)]

prompt = "请将以下字幕翻译为通顺自然的中文口语,保持原有的编号格式不变:\n" + "\n".join(texts)
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": prompt}]
)

translated_lines = response.choices[0].message.content.strip().split("\n")
zh_map = {}
for line in translated_lines:
    if ":" in line:
        parts = line.split(":", 1)
        try:
            zh_map[int(parts[0].strip())] = parts[1].strip()
        except ValueError:
            continue

for idx, sub in enumerate(subs):
    sub.text = zh_map.get(idx, sub.text)

subs.save(output_zh_srt_path, encoding='utf-8')
print(f"[✓] 中文字幕已生成: {output_zh_srt_path}")
return subs

async def generate_aligned_audio(subs, voice, output_audio_path):

final_audio = AudioSegment.silent(duration=0)
current_time_ms = 0

for idx, sub in enumerate(subs):
    start_ms = sub.start.ordinal
    end_ms = sub.end.ordinal
    max_duration_ms = end_ms - start_ms
    text = sub.text.strip()

    if not text:
        continue

    # 1. 补齐句间空白静音
    if start_ms > current_time_ms:
        silence_gap = start_ms - current_time_ms
        final_audio += AudioSegment.silent(duration=silence_gap)
        current_time_ms = start_ms

    # 2. 生成单句中文 TTS
    temp_file = f"temp_{idx}.mp3"
    await edge_tts.Communicate(text, voice).save(temp_file)
    segment = AudioSegment.from_file(temp_file)

    # 3. 超长时自动变速 (防止重叠下一句)
    if max_duration_ms > 0 and len(segment) > max_duration_ms:
        speed_factor = len(segment) / max_duration_ms
        speed_factor = min(speed_factor, 1.4)  # 最高加速 1.4 倍
        segment = segment.speedup(playback_speed=speed_factor)

    final_audio += segment
    current_time_ms += len(segment)

    if os.path.exists(temp_file):
        os.remove(temp_file)

final_audio.export(output_audio_path, format="mp3")
print(f"[✓] 对齐音频已生成: {output_audio_path}")

def merge_video(video_path, audio_path, srt_path, output_path):

# 使用 FFmpeg 替换原音轨并压制硬字幕
cmd = (
    f'ffmpeg -y -i "{video_path}" -i "{audio_path}" '
    f'-vf "subtitles=\'{srt_path}\'" '
    f'-c:v libx264 -c:a aac -map 0:v:0 -map 1:a:0 "{output_path}"'
)
os.system(cmd)
print(f"[✓] 成品视频已导出: {output_path}")

def main():

parser = argparse.ArgumentParser(description="Auto Translate and Dub Video")
parser.add_argument("--video", required=True, help="原始视频路径")
parser.add_argument("--srt", required=True, help="原始字幕路径")
parser.add_argument("--output", default="output.mp4", help="导出视频路径")
parser.add_argument("--voice", default="zh-CN-YunxiNeural", help="TTS 音色")
args = parser.parse_args()

zh_srt_path = "temp_zh.srt"
temp_audio_path = "temp_dub.mp3"

subs = translate_srt_to_chinese(args.srt, zh_srt_path)
asyncio.run(generate_aligned_audio(subs, args.voice, temp_audio_path))
merge_video(args.video, temp_audio_path, zh_srt_path, args.output)

# 清理中间音频
if os.path.exists(temp_audio_path):
    os.remove(temp_audio_path)

if name == "__main__":

main()

随时日常调用后续当你需要翻译配音新视频时,只需在终端唤醒 Claude Code 或直接运行脚本即可:Bashpython auto_dub.py --video lesson.mp4 --srt lesson.srt --output lesson_chinese.mp4 --voice

标签: none

添加新评论