本项目实现了一个完整的高精度视频翻译管线(VideoTranslationPipeline),支持以下特性:
- 高精度识别: 使用 WhisperX large-v3 模型进行语音识别
- 完美音画同步: TTS 音频按原始时间戳精确对齐
- 背景音乐保留: 使用 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 (视频合成)
↓
翻译视频输出
- 功能: 从视频文件提取高质量音频
- 输入: task.video_path (视频文件路径)
- 输出: audio_path (音频文件), sample_rate, channels
- 服务: AudioExtractor
- 配置:
- sample_rate: 采样率 (默认 44100Hz, Demucs 要求)
- channels: 声道数 (默认 2, 立体声)
- format: 音频格式 (默认 wav)
- 功能: 使用 Demucs AI 模型分离人声和背景音乐
- 依赖: audio_extraction
- 输入: audio_path (提取的音频)
- 输出: vocals_path (人声), bgm_path (背景音乐)
- 服务: SourceSeparator
- 配置:
- model: Demucs 模型 (默认 htdemucs)
- shifts: 时间偏移次数 (默认 3, 平衡质量和速度)
- overlap: 分段重叠比例 (默认 0.25)
- use_gpu: 使用 GPU 加速 (默认 True)
- 功能: 使用 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 字幕文件
- 功能: 使用 Dify API 并发翻译字幕片段
- 依赖: asr
- 输入: segments (ASR 识别的字幕)
- 输出: translated_segments (翻译后的字幕)
- 服务: DifyClient
- 配置:
- max_concurrent: 最大并发数 (默认 8)
- use_context: 使用上下文 (默认 True, 保持翻译连贯性)
- 特点:
- 并发处理,大幅提升速度
- 保持会话上下文,提高翻译质量
- 需要用户确认
- 功能: 为翻译后的文本生成语音
- 依赖: 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 调度器自动管理显存
- 需要用户确认
- 功能: 将 TTS 人声与原背景音乐混合
- 依赖: tts, vocal_separation
- 输入: audio_segments (TTS片段), bgm_path (背景音乐)
- 输出: mixed_audio_path (混合后的音频)
- 工具: FFmpeg
- 配置:
- bgm_volume: 背景音乐音量 (默认 0.2)
- vocal_volume: 人声音量 (默认 1.0)
- normalize: 标准化音频 (默认 True)
- 特点:
- 按时间戳对齐 TTS 片段
- 音量自动平衡
- 响度标准化
- 功能: 将混合音频与原视频合成
- 依赖: 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", # 视频编码器
}- ASR 步骤生成带精确时间戳的字幕 (start, end)
- 翻译步骤保持时间戳不变
- TTS 步骤为每个片段生成音频
- AudioMixingStep 使用 FFmpeg adelay 滤镜按时间戳对齐
- 最终实现毫秒级音画同步
- VocalSeparationStep 使用 Demucs 分离人声和背景音乐
- ASR 仅处理人声,避免背景音干扰
- TTS 生成新人声
- AudioMixingStep 将新人声与原背景音乐混合
- 完整保留原视频的背景音乐和音效
- TranslationStep 和 TTSStep 使用 ConcurrentPipelineStep
- 支持多片段并发处理,大幅缩短处理时间
- TranslationStep: 8并发 (API调用)
- TTSStep: 2并发 (GPU限制)
- 自动错误处理和进度追踪
- TTSStep 使用 GPU 调度器管理显存
- 支持模型共享,避免重复加载
- 自动排队和资源分配
- 防止显存溢出
- 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",
}-
显存不足 (OOM)
- 降低并发数:
tts.max_concurrent = 1 - 使用较小的模型:
asr_model = "medium" - 增加 Demucs 分段:
segment_length = 5.0
- 降低并发数:
-
音画不同步
- 检查 TTS 语速设置
- 验证时间戳是否正确
- 调整
tts_speed参数
-
背景音乐过响或过轻
- 调整
bgm_volume(0.1-0.3) - 调整
vocal_volume(0.8-1.5) - 启用标准化:
normalize = True
- 调整
-
翻译质量差
- 检查 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 加速 ✅ 易扩展: 清晰的架构,易于添加新功能 ✅ 用户友好: 支持实时进度、用户确认、错误处理
适合用于:
- 视频本地化项目
- 多语言内容创作
- 教育视频翻译
- 企业培训材料翻译
- 影视字幕制作