Skip to content

Latest commit

 

History

History
470 lines (392 loc) · 11.9 KB

File metadata and controls

470 lines (392 loc) · 11.9 KB

视频翻译管线实现文档

概述

本项目实现了一个完整的高精度视频翻译管线(VideoTranslationPipeline),支持以下特性:

  1. 高精度识别: 使用 WhisperX large-v3 模型进行语音识别
  2. 完美音画同步: TTS 音频按原始时间戳精确对齐
  3. 背景音乐保留: 使用 Demucs AI 分离人声和背景音乐,翻译后重新混合

架构设计

管线流程

视频输入
    ↓
1. AudioExtractionStep (音频提取)
    ↓ audio_path
2. VocalSeparationStep (人声分离)
    ↓ vocals_path, bgm_path
3. ASRStep (语音识别)
    ↓ segments (带时间戳的字幕)
4. TranslationStep (并发翻译)
    ↓ translated_segments
5. TTSStep (并发语音合成)
    ↓ audio_segments (TTS音频片段)
6. AudioMixingStep (音频混合)
    ↓ mixed_audio_path
7. VideoSynthesisStep (视频合成)
    ↓
翻译视频输出

核心步骤说明

1. AudioExtractionStep (音频提取)

  • 功能: 从视频文件提取高质量音频
  • 输入: task.video_path (视频文件路径)
  • 输出: audio_path (音频文件), sample_rate, channels
  • 服务: AudioExtractor
  • 配置:
    • sample_rate: 采样率 (默认 44100Hz, Demucs 要求)
    • channels: 声道数 (默认 2, 立体声)
    • format: 音频格式 (默认 wav)

2. VocalSeparationStep (人声分离)

  • 功能: 使用 Demucs AI 模型分离人声和背景音乐
  • 依赖: audio_extraction
  • 输入: audio_path (提取的音频)
  • 输出: vocals_path (人声), bgm_path (背景音乐)
  • 服务: SourceSeparator
  • 配置:
    • model: Demucs 模型 (默认 htdemucs)
    • shifts: 时间偏移次数 (默认 3, 平衡质量和速度)
    • overlap: 分段重叠比例 (默认 0.25)
    • use_gpu: 使用 GPU 加速 (默认 True)

3. ASRStep (语音识别)

  • 功能: 使用 WhisperX 进行高精度语音识别
  • 依赖: vocal_separation
  • 输入: vocals_path (人声音频)
  • 输出: segments (带时间戳的字幕片段), language (检测到的语言)
  • 服务: ASRService
  • 配置:
    • model: Whisper 模型 (默认 large-v3, 最高精度)
    • enable_vad: 语音活动检测 (默认 True)
    • beam_size: 束搜索大小 (默认 5)
    • enable_diarization: 说话人分离 (默认 False)
  • 特点:
    • 需要用户确认 (requires_confirmation=True)
    • 自动保存 SRT 字幕文件

4. TranslationStep (并发翻译)

  • 功能: 使用 Dify API 并发翻译字幕片段
  • 依赖: asr
  • 输入: segments (ASR 识别的字幕)
  • 输出: translated_segments (翻译后的字幕)
  • 服务: DifyClient
  • 配置:
    • max_concurrent: 最大并发数 (默认 8)
    • use_context: 使用上下文 (默认 True, 保持翻译连贯性)
  • 特点:
    • 并发处理,大幅提升速度
    • 保持会话上下文,提高翻译质量
    • 需要用户确认

5. TTSStep (并发语音合成)

  • 功能: 为翻译后的文本生成语音
  • 依赖: translation, vocal_separation
  • 输入: translated_segments (翻译字幕), vocals_path (参考音频)
  • 输出: audio_segments (TTS 音频片段列表)
  • 服务: VoiceCloningTTS
  • 配置:
    • speed: 语速 (默认 1.0)
    • quality: 合成质量 (默认 high)
    • max_concurrent: 最大并发数 (默认 2, GPU 限制)
    • use_voice_cloning: 音色克隆 (默认 True)
  • 特点:
    • 支持音色克隆,保持原说话人特征
    • GPU 调度器自动管理显存
    • 需要用户确认

6. AudioMixingStep (音频混合)

  • 功能: 将 TTS 人声与原背景音乐混合
  • 依赖: tts, vocal_separation
  • 输入: audio_segments (TTS片段), bgm_path (背景音乐)
  • 输出: mixed_audio_path (混合后的音频)
  • 工具: FFmpeg
  • 配置:
    • bgm_volume: 背景音乐音量 (默认 0.2)
    • vocal_volume: 人声音量 (默认 1.0)
    • normalize: 标准化音频 (默认 True)
  • 特点:
    • 按时间戳对齐 TTS 片段
    • 音量自动平衡
    • 响度标准化

7. VideoSynthesisStep (视频合成)

  • 功能: 将混合音频与原视频合成
  • 依赖: audio_mixing
  • 输入: mixed_audio_path (混合音频), task.video_path (原视频)
  • 输出: output_video_path (最终翻译视频)
  • 工具: FFmpeg
  • 配置:
    • output_format: 输出格式 (默认 mp4)
    • video_codec: 视频编码器 (默认 copy, 不重新编码)
    • audio_codec: 音频编码器 (默认 aac)
    • audio_bitrate: 音频比特率 (默认 192k)

管线配置

用户可调参数

VideoTranslationPipeline 提供以下用户可配置参数:

{
    # ASR 配置
    "asr_model": "large-v3",           # Whisper 模型
    "enable_vad": True,                # 语音活动检测
    "enable_diarization": False,       # 说话人分离
    
    # Demucs 配置
    "demucs_model": "htdemucs",        # 分离模型
    "demucs_shifts": 3,                # 时间偏移
    
    # TTS 配置
    "tts_speed": 1.0,                  # 语速
    "tts_quality": "high",             # 质量
    
    # 音频混合配置
    "bgm_volume": 0.2,                 # 背景音乐音量
    "vocal_volume": 1.0,               # 人声音量
    
    # 视频输出配置
    "output_format": "mp4",            # 输出格式
    "video_codec": "copy",             # 视频编码器
}

技术亮点

1. 音画同步机制

  • ASR 步骤生成带精确时间戳的字幕 (start, end)
  • 翻译步骤保持时间戳不变
  • TTS 步骤为每个片段生成音频
  • AudioMixingStep 使用 FFmpeg adelay 滤镜按时间戳对齐
  • 最终实现毫秒级音画同步

2. 背景音乐保留

  • VocalSeparationStep 使用 Demucs 分离人声和背景音乐
  • ASR 仅处理人声,避免背景音干扰
  • TTS 生成新人声
  • AudioMixingStep 将新人声与原背景音乐混合
  • 完整保留原视频的背景音乐和音效

3. 高并发处理

  • TranslationStep 和 TTSStep 使用 ConcurrentPipelineStep
  • 支持多片段并发处理,大幅缩短处理时间
  • TranslationStep: 8并发 (API调用)
  • TTSStep: 2并发 (GPU限制)
  • 自动错误处理和进度追踪

4. GPU 调度优化

  • TTSStep 使用 GPU 调度器管理显存
  • 支持模型共享,避免重复加载
  • 自动排队和资源分配
  • 防止显存溢出

5. 用户交互

  • ASR、Translation、TTS 步骤支持用户确认
  • 用户可以在 UI 中查看和编辑结果
  • 支持重试和跳过
  • 实时进度更新

数据流示例

// 1. AudioExtractionStep 输出
{
  "audio_path": "/path/to/extracted_audio.wav",
  "sample_rate": 44100,
  "channels": 2,
  "file_size": 10485760
}

// 2. VocalSeparationStep 输出
{
  "vocals_path": "/path/to/vocals.wav",
  "bgm_path": "/path/to/no_vocals.wav",
  "model": "htdemucs"
}

// 3. ASRStep 输出
{
  "segments": [
    {
      "start": 0.0,
      "end": 2.5,
      "text": "Hello world"
    },
    {
      "start": 3.0,
      "end": 5.5,
      "text": "This is a test"
    }
  ],
  "language": "en",
  "total_segments": 2
}

// 4. TranslationStep 输出
{
  "translated_segments": [
    {
      "start": 0.0,
      "end": 2.5,
      "text": "Hello world",
      "translated_text": "你好世界"
    },
    {
      "start": 3.0,
      "end": 5.5,
      "text": "This is a test",
      "translated_text": "这是一个测试"
    }
  ],
  "count": 2
}

// 5. TTSStep 输出
{
  "audio_segments": [
    {
      "index": 0,
      "audio_path": "/path/to/tts_0000.wav",
      "text": "你好世界",
      "start": 0.0,
      "end": 2.5,
      "audio_duration": 2.3
    },
    {
      "index": 1,
      "audio_path": "/path/to/tts_0001.wav",
      "text": "这是一个测试",
      "start": 3.0,
      "end": 5.5,
      "audio_duration": 2.4
    }
  ],
  "count": 2
}

// 6. AudioMixingStep 输出
{
  "mixed_audio_path": "/path/to/mixed_audio.wav",
  "duration": 120.5,
  "bgm_volume": 0.2,
  "vocal_volume": 1.0
}

// 7. VideoSynthesisStep 输出
{
  "output_video_path": "/path/to/video_translated.mp4",
  "file_size": 52428800,
  "video_info": {
    "duration": 120.5,
    "width": 1920,
    "height": 1080
  }
}

使用方法

创建和运行管线

from src.models.task import Task, TaskConfig
from src.models.enums import Language
from src.Pipeline.pipelines import VideoTranslationPipeline

# 创建任务
task = Task(
    task_id="task_001",
    video_path="/path/to/video.mp4",
    source_language=Language.EN_US,
    target_languages=[Language.ZH_CN],
    config=TaskConfig(
        whisper_model="large-v3",
        demucs_model="htdemucs",
        tts_speed=1.0,
    )
)

# 创建管线
pipeline = VideoTranslationPipeline(config=task.config, task=task)

# 执行管线
result = await pipeline.execute()

# 获取输出视频
output_video = task.get_output_file("translated_video")
print(f"翻译完成: {output_video}")

自定义配置

# 在管线配置中设置参数
pipeline_config = {
    "asr_model": "large-v3",
    "demucs_shifts": 5,  # 更高质量
    "tts_speed": 0.9,    # 稍慢语速
    "bgm_volume": 0.15,  # 降低背景音乐
}

# 应用配置
for key, value in pipeline_config.items():
    setattr(task.config, key, value)

性能估算

处理 1 分钟视频的大致时间(仅供参考):

  • AudioExtractionStep: ~5秒
  • VocalSeparationStep: ~30秒 (GPU) / ~2分钟 (CPU)
  • ASRStep: ~20秒 (large-v3, GPU)
  • TranslationStep: ~10秒 (8并发)
  • TTSStep: ~40秒 (2并发, GPU)
  • AudioMixingStep: ~10秒
  • VideoSynthesisStep: ~5秒

总计: 约 2-3 分钟 (GPU) / 4-5 分钟 (CPU)

实际时间取决于:

  • 硬件配置(GPU型号、显存大小)
  • 模型选择(更大的模型更慢但更准确)
  • 视频内容(语音密度、背景音复杂度)
  • 并发配置

质量优化建议

高质量配置

{
    "asr_model": "large-v3",
    "enable_vad": True,
    "demucs_shifts": 5,
    "tts_quality": "high",
    "bgm_volume": 0.15,
}

快速处理配置

{
    "asr_model": "medium",
    "enable_vad": False,
    "demucs_shifts": 1,
    "tts_quality": "fast",
}

故障排除

常见问题

  1. 显存不足 (OOM)

    • 降低并发数: tts.max_concurrent = 1
    • 使用较小的模型: asr_model = "medium"
    • 增加 Demucs 分段: segment_length = 5.0
  2. 音画不同步

    • 检查 TTS 语速设置
    • 验证时间戳是否正确
    • 调整 tts_speed 参数
  3. 背景音乐过响或过轻

    • 调整 bgm_volume (0.1-0.3)
    • 调整 vocal_volume (0.8-1.5)
    • 启用标准化: normalize = True
  4. 翻译质量差

    • 检查 Dify API 配置
    • 启用上下文: use_context = True
    • 调整翻译温度

扩展开发

添加新步骤

参考步骤模板 _step_template.py_concurrent_step_template.py

from src.Pipeline.core import PipelineStep
from src.Pipeline.core.step_interface_adapter import PipelineStepMixin

class MyCustomStep(PipelineStepMixin, PipelineStep):
    step_id = "my_custom"
    step_name = "我的步骤"
    depends_on = ["previous_step"]
    
    async def execute(self, task, config=None, **kwargs):
        self.setup(task, config or {})
        # 实现逻辑
        self.save_step_result(data=result)
        return task

修改管线流程

VideoTranslationPipeline.register_steps() 中添加或删除步骤:

def register_steps(self):
    steps = [
        AudioExtractionStep(),
        # 添加降噪步骤
        AudioDenoisingStep(),
        VocalSeparationStep(),
        # ... 其他步骤
    ]
    return steps

总结

本实现提供了一个完整的、生产级的视频翻译管线,具有以下优势:

高精度: 使用最新的 AI 模型 (WhisperX, Demucs, Voice Cloning) ✅ 完整性: 从视频输入到翻译视频输出的完整流程 ✅ 灵活性: 丰富的配置选项,支持不同场景 ✅ 高性能: 并发处理,GPU 加速 ✅ 易扩展: 清晰的架构,易于添加新功能 ✅ 用户友好: 支持实时进度、用户确认、错误处理

适合用于:

  • 视频本地化项目
  • 多语言内容创作
  • 教育视频翻译
  • 企业培训材料翻译
  • 影视字幕制作