一个强大的视频翻译和语音合成工具,支持多种 TTS 引擎和翻译服务。
- 🎥 视频下载: 支持 YouTube 视频下载和处理
- 🗣️ 多引擎 TTS: Edge TTS、OpenAI TTS、XTTS v2、CosyVoice2
- 🌍 多语言翻译: Google、DeepL、GPT (Ollama)
- 🎵 音频处理: 人声分离、背景音乐移除
- 📝 字幕处理: SRT 格式支持、自动时间轴同步
- 🚀 高性能: GPU 加速、异步处理、缓存机制
- 📊 监控: Prometheus 指标、实时状态监控
EasyVideoTrans/
├── app.py # 主 Flask 应用
├── inference.py # GPU 工作负载服务
├── src/
│ ├── service/
│ │ ├── tts/ # TTS 服务 (Edge, OpenAI, XTTS v2, CosyVoice2)
│ │ └── translation/ # 翻译服务 (Google, DeepL, GPT)
│ └── task_manager/ # Celery 任务管理
├── workloads/ # GPU 工作负载
└── configs/ # 配置文件
- Python 3.9+ (推荐 3.11)
- CUDA 11.8+ (GPU 加速)
- FFmpeg
- RabbitMQ
- 克隆仓库
git clone https://github.com/your-username/easyvideotrans.git
cd easyvideotrans- 创建虚拟环境
conda create -n easy-video python=3.11
conda activate easy-video- 安装依赖
pip install -r requirements.txt
pip install -r workloads/requirements.txt- 安装 FFmpeg
# Ubuntu/Debian
sudo apt update && sudo apt install ffmpeg
# CentOS/RHEL
sudo yum install ffmpeg
# macOS
brew install ffmpeg- 启动 RabbitMQ
# 使用 Docker
docker run -d --name rabbitmq -p 5672:5672 -p 10311:15672 rabbitmq:3-management
# 或使用系统包管理器
sudo systemctl start rabbitmq-server- 复制配置文件
cp configs/easyvideotrans.json.example configs/easyvideotrans.json
cp configs/celery.json.example configs/celery.json- 设置环境变量
export OPENAI_API_KEY="your-openai-api-key"
export DEEPL_API_KEY="your-deepl-api-key"- 修改配置
{
"OUTPUT_PATH": "./workloads/static/outputs",
"HOST": "0.0.0.0",
"PORT": 10310
}- 启动主应用
python app.py- 启动 GPU 工作负载服务
python workloads/inference.py- 启动 Celery 工作进程
celery -A src.task_manager.celery_tasks.celery_app worker --concurrency 1 -Q video_preview --loglevel=info- 访问 Web 界面
http://localhost:10310
- 基础URL:
http://localhost:10310 - 内容类型:
application/json - 响应格式: JSON
curl -X POST http://localhost:10310/video_upload \
-F "file=@/path/to/your/video.mp4"参数说明:
file: 视频文件 (支持 .mp4 格式)
响应示例:
{
"message": "Video video.mp4 uploaded as abc123_video.mp4",
"video_id": "abc123"
}curl -X POST http://localhost:10310/yt_download \
-H "Content-Type: application/json" \
-d '{"video_id": "Am54LhN2NLk"}'参数说明:
video_id: YouTube 视频 ID
响应示例:
{
"message": "YouTube video downloaded successfully",
"video_id": "Am54LhN2NLk"
}curl -X POST http://localhost:10310/yt_thumbnail \
-H "Content-Type: application/json" \
-d '{"video_id": "Am54LhN2NLk"}'curl -X GET http://localhost:10310/yt/Am54LhN2NLkcurl -X POST http://localhost:10310/extra_audio \
-H "Content-Type: application/json" \
-d '{"video_id": "Am54LhN2NLk"}'curl -X GET http://localhost:10310/audio/Am54LhN2NLkcurl -X POST http://localhost:10310/remove_audio_bg \
-H "Content-Type: application/json" \
-d '{"video_id": "Am54LhN2NLk"}'curl -X GET http://localhost:10310/audio_no_bg/Am54LhN2NLkcurl -X GET http://localhost:10310/audio_bg/Am54LhN2NLkcurl -X POST http://localhost:10310/transcribe \
-H "Content-Type: application/json" \
-d '{"video_id": "Am54LhN2NLk"}'curl -X GET http://localhost:10310/srt_en/Am54LhN2NLkcurl -X GET http://localhost:10310/srt_en_merged/Am54LhN2NLkcurl -X POST http://localhost:10310/translate_to_zh \
-H "Content-Type: application/json" \
-d '{
"video_id": "Am54LhN2NLk",
"source_lang": "en",
"translate_vendor": "google",
"translate_key": ""
}'参数说明:
video_id: 视频 IDsource_lang: 源语言 (默认: "en")translate_vendor: 翻译服务商 ("google", "deepl", "gpt-3.5-turbo-0125", "gpt-4", "gpt-4-turbo", "gpt-local")translate_key: API 密钥 (DeepL/ChatGPT 需要)base_url: 本地部署 API 地址 (仅 gpt-local 需要)model_name: 本地部署模型名称 (仅 gpt-local 需要)
curl -X POST http://localhost:10310/generate_bilingual_srt \
-H "Content-Type: application/json" \
-d '{"video_id": "Am54LhN2NLk"}'curl -X GET http://localhost:10310/srt_zh_merged/Am54LhN2NLkcurl -X GET http://localhost:10310/srt_bilingual/Am54LhN2NLkcurl -X POST http://localhost:10310/translated_zh_upload \
-F "video_id=Am54LhN2NLk" \
-F "file=@/path/to/modified_subtitle.srt"curl -X POST http://localhost:10310/tts \
-H "Content-Type: application/json" \
-d '{
"video_id": "Am54LhN2NLk",
"tts_vendor": "edge",
"tts_character": "zh-CN-XiaoyiNeural"
}'参数说明:
video_id: 视频 IDtts_vendor: TTS 引擎 ("edge", "openai", "xtts_v2", "cosyvoice2", "fallback")tts_character: 语音角色 (Edge TTS)voice: 语音类型 (OpenAI TTS: "alloy", "echo", "fable", "onyx", "nova", "shimmer")model: 模型类型 (OpenAI TTS: "tts-1", "tts-1-hd")instructions: 语音指令 (OpenAI TTS)language: 目标语言 (XTTS v2)model_name: 模型名称 (XTTS v2)audio_source: 参考音频来源 ("upload", "video_voice")reference_audio_path: 参考音频路径speaker_name: 说话人名称 (CosyVoice2)mode: 生成模式 (CosyVoice2: "zero_shot", "cross_lingual", "instruct")instruction: 指令 (CosyVoice2)model_path: 模型路径 (CosyVoice2)fp16: 使用 FP16 精度 (CosyVoice2)
curl -X GET http://localhost:10310/tts/Am54LhN2NLkcurl -X POST http://localhost:10310/upload_reference_audio \
-F "file=@/path/to/reference_audio.wav"curl -X POST http://localhost:10310/voice_connect \
-H "Content-Type: application/json" \
-d '{"video_id": "Am54LhN2NLk"}'curl -X GET http://localhost:10310/voice_connect/Am54LhN2NLkcurl -X GET http://localhost:10310/voice_connect_log/Am54LhN2NLk# 基础视频生成
curl -X POST http://localhost:10310/video_preview \
-H "Content-Type: application/json" \
-d '{
"video_id": "Am54LhN2NLk",
"audio_type": "translated",
"force_render": false,
"hardcode_subtitles": false
}'
# 硬编码双语字幕视频生成
curl -X POST http://localhost:10310/video_preview \
-H "Content-Type: application/json" \
-d '{
"video_id": "Am54LhN2NLk",
"audio_type": "translated",
"hardcode_subtitles": true,
"subtitle_type": "bilingual",
"subtitle_style": {
"font_name": "Arial",
"font_size": 20,
"primary_color": "&Hffffff",
"outline_color": "&H000000",
"back_color": "&H000000",
"outline_width": 2,
"shadow_depth": 1,
"alignment": 2,
"margin_v": 30,
"auto_scale": true,
"min_font_size": 14,
"max_font_size": 28,
"bilingual": {
"secondary_font_name": "SimHei",
"secondary_font_size": 24,
"secondary_color": "&Hcccccc",
"vertical_spacing": 5
}
}
}'参数说明:
video_id: 视频 IDaudio_type: 音频类型 ("original", "translated") - 使用原始音频还是翻译后的音频force_render: 强制重新渲染 (默认: false)hardcode_subtitles: 硬编码字幕 (默认: false)subtitle_type: 字幕类型 ("translated", "original", "bilingual")subtitle_style: 字幕样式配置对象font_name: 字体名称font_size: 字体大小primary_color: 文字颜色 (ASS 格式)outline_color: 描边颜色 (ASS 格式)back_color: 背景颜色 (ASS 格式)outline_width: 描边宽度shadow_depth: 阴影深度alignment: 对齐方式 (1-8)margin_v: 垂直边距auto_scale: 自适应字体大小min_font_size: 最小字体大小max_font_size: 最大字体大小bilingual: 双语字幕配置 (可选)secondary_font_name: 副字体名称secondary_font_size: 副字体大小secondary_color: 副字体颜色 (ASS 格式)vertical_spacing: 中英文字幕间距 (默认: 5)
响应示例:
{
"message": "Submitted video rendering task",
"task_id": "abc123-def456-ghi789",
"filename": "Am54LhN2NLk_translated.mp4",
"download_url": "/video_preview/Am54LhN2NLk_translated.mp4",
"queue_length": 2
}curl -X GET http://localhost:10310/video_preview/Am54LhN2NLk_translated.mp4curl -X GET http://localhost:10310/video_preview_status/abc123-def456-ghi789# 下载中文字幕
curl -X GET http://localhost:10310/subtitles/Am54LhN2NLk
# 下载双语字幕
curl -X GET http://localhost:10310/srt_bilingual/Am54LhN2NLkcurl -X POST http://localhost:10310/subtitles/Am54LhN2NLk \
-H "Content-Type: application/json" \
-d '{
"content": "1\n00:00:01,000 --> 00:00:04,000\n这是修改后的字幕内容\n\n2\n00:00:04,000 --> 00:00:07,000\n第二行字幕内容"
}'curl -X GET "http://localhost:10310/subtitle_hardcoded/Am54LhN2NLk?subtitle_type=translated&font_name=Arial&font_size=24&auto_scale=true"curl -X GET "http://localhost:10310/subtitle_hardcoded_styled/Am54LhN2NLk?subtitle_type=translated&font_name=Arial&font_size=24&auto_scale=true"curl -X GET http://localhost:10310/video_preview_status/task_id_here- 下载视频: 输入 YouTube 视频 ID(支持文件有效性检查)
- 提取音频: 自动分离人声和背景音乐
- 语音识别: 使用 Whisper 生成字幕
- 翻译字幕: 选择翻译服务 (Google/DeepL/GPT)
- 语音合成: 选择 TTS 引擎生成语音
- 视频合成: 合并音频和视频
- 支持多种语音角色
- 免费使用,无需 API Key
- 高质量语音合成
- 支持多种语音类型
- 需要 OpenAI API Key
- 语音克隆功能
- 支持多语言
- 需要参考音频
- 零样本语音克隆
- 跨语种语音生成
- 支持指令控制
- 免费使用
- 支持 100+ 语言
- 高质量翻译
- 需要 API Key
- 本地部署
- 支持自定义模型
- 默认行为: 不硬编码字幕,使用 MoviePy 合成视频
- 启用硬编码: 将中文字幕直接嵌入视频中,使用 FFmpeg 处理
- 参数:
hardcode_subtitles(布尔值,默认 False)max_chars_per_line(整数,默认 30) - 每行最大字符数
- 自动换行: 支持字幕自动换行,在标点符号处智能分割
- 优势:
- 字幕永久嵌入,无法关闭
- 兼容性更好,所有播放器都支持
- 自动换行确保字幕可读性
- 适合最终成品视频
# 在 workloads/inference.py 中配置
CUDA_VISIBLE_DEVICES = "0" # 使用第一块 GPU# 翻译缓存
CACHE_DIR = "./translation_cache"
CACHE_EXPIRE = 86400 # 24小时# Prometheus 指标
METRICS_PORT = 8081
ENABLE_METRICS = Truedocker-compose up -ddocker build -t easyvideotrans .
docker run -p 10310:10310 easyvideotrans# 运行测试
pytest tests/
# 代码质量检查
flake8 src/
black --check src/- GPU 加速: 使用 CUDA 加速 TTS 和音频处理
- 异步处理: Celery 队列处理耗时任务
- 缓存机制: 翻译结果缓存,避免重复请求
- 文件验证: 自动检测损坏的视频文件并重新下载
- 并发控制: 限制并发数量,避免资源过载
欢迎提交 Issue 和 Pull Request!
# 安装开发依赖
pip install -r requirements-dev.txt
# 运行代码格式化
black src/
isort src/
# 运行测试
pytest tests/ --cov=src/本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
- Coqui TTS - XTTS v2 语音合成
- CosyVoice2 - 中文语音克隆
- Faster Whisper - 语音识别
- MoviePy - 视频处理
- 📧 Email: your-email@example.com
- 🐛 Issues: GitHub Issues
- 📖 文档: Wiki
⭐ 如果这个项目对您有帮助,请给我们一个星标!