2025-08-20 11:39:34 +08:00

236 lines
7.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
VideoLingo 非图形界面版本
支持通过参数赋值的方式处理视频
"""
import os
import sys
import shutil
from pathlib import Path
# 设置路径
current_dir = os.path.dirname(os.path.abspath(__file__))
os.environ['PATH'] += os.pathsep + current_dir
sys.path.append(current_dir)
# 导入核心模块
from core.utils.config_utils import load_key, update_key
from core.utils.onekeycleanup import cleanup
from core.utils.delete_retry_dubbing import delete_dubbing_files
from translations.translations import translate as t
from core import (
_2_asr, _3_1_split_nlp, _3_2_split_meaning,
_4_1_summarize, _4_2_translate, _5_split_sub,
_6_gen_sub, _7_sub_into_vid, _8_1_audio_task,
_8_2_dub_chunks, _9_refer_audio, _10_gen_audio,
_11_merge_audio, _12_dub_to_vid
)
class VideoLingoProcessor:
"""VideoLingo 视频处理器"""
def __init__(self, input_path, output_dir="output"):
"""
初始化处理器
Args:
input_path (str): 输入视频文件路径
output_dir (str): 输出目录路径,默认为 "output"
"""
self.input_path = Path(input_path)
self.output_dir = Path(output_dir)
# 验证输入文件
if not self.input_path.exists():
raise FileNotFoundError(f"输入文件不存在: {self.input_path}")
# 创建输出目录
self.output_dir.mkdir(exist_ok=True)
# 设置输出文件路径
self.sub_video = self.output_dir / "output_sub.mp4"
self.dub_video = self.output_dir / "output_dub.mp4"
print(f"📹 输入视频: {self.input_path}")
print(f"📁 输出目录: {self.output_dir}")
def setup_video_file(self):
"""设置视频文件到指定位置"""
# 将输入视频复制到 "output" 目录
output_dir = Path("output")
output_dir.mkdir(exist_ok=True)
target_video = output_dir / self.input_path.name
if not target_video.exists():
print(f"📋 复制视频文件到: {target_video}")
shutil.copy2(self.input_path, target_video)
return target_video
def process_subtitles(self):
"""处理字幕生成"""
print("\n🎬 开始字幕处理流程...")
try:
print("🎤 使用 Whisper 进行语音转录...")
_2_asr.transcribe()
print("✂️ 拆分长句子...")
_3_1_split_nlp.split_by_spacy()
_3_2_split_meaning.split_sentences_by_meaning()
print("📝 总结和翻译...")
_4_1_summarize.get_summary()
# 检查是否需要暂停编辑术语
if load_key("pause_before_translate"):
input("⚠️ 暂停以便编辑术语。请前往 'output/log/terminology.json' 编辑术语表,然后按回车继续...")
_4_2_translate.translate_all()
print("⏱️ 处理和对齐字幕...")
_5_split_sub.split_for_sub_main()
_6_gen_sub.align_timestamp_main()
print("🎞️ 将字幕合并到视频...")
_7_sub_into_vid.merge_subtitles_to_video()
print("✅ 字幕处理完成! 🎉")
return True
except Exception as e:
print(f"❌ 字幕处理失败: {str(e)}")
return False
def process_dubbing(self):
"""处理配音生成"""
print("\n🎙️ 开始配音处理流程...")
try:
print("📋 生成音频任务...")
_8_1_audio_task.gen_audio_task_main()
_8_2_dub_chunks.gen_dub_chunks()
print("🎵 提取参考音频...")
_9_refer_audio.extract_refer_audio_main()
print("🔊 生成所有音频...")
_10_gen_audio.gen_audio()
print("🎶 合并完整音频...")
_11_merge_audio.merge_full_audio()
print("🎬 将配音合并到视频...")
_12_dub_to_vid.merge_video_audio()
print("✅ 配音处理完成! 🎇")
return True
except Exception as e:
print(f"❌ 配音处理失败: {str(e)}")
return False
def process_all(self, include_dubbing=True):
"""
执行完整的处理流程
Args:
include_dubbing (bool): 是否包含配音处理,默认为 True
"""
print("🚀 开始 VideoLingo 处理流程")
print("=" * 50)
# 设置视频文件
self.setup_video_file()
# 处理字幕
subtitle_success = self.process_subtitles()
if not subtitle_success:
print("❌ 字幕处理失败,停止执行")
return False
# 如果字幕成功且需要配音,则处理配音
if include_dubbing:
dubbing_success = self.process_dubbing()
if not dubbing_success:
print("❌ 配音处理失败")
return False
print("\n🎊 所有处理完成!")
print(f"📁 输出文件位于: {self.output_dir.absolute()}")
# 显示输出文件
if self.sub_video.exists():
print(f" 🎬 字幕视频: {self.sub_video}")
if include_dubbing and self.dub_video.exists():
print(f" 🎙️ 配音视频: {self.dub_video}")
return True
def cleanup_files(self):
"""清理临时文件"""
print("🧹 清理临时文件...")
cleanup()
print("✅ 清理完成")
def delete_dubbing_files(self):
"""删除配音相关文件"""
print("🗑️ 删除配音文件...")
delete_dubbing_files()
print("✅ 配音文件删除完成")
def main():
"""主函数 - 示例用法"""
# ==================== 配置参数 ====================
# 请在这里修改您的参数
# 输入视频路径(必需)
INPUT_VIDEO_PATH = "/root/autodl-tmp/output/Dajing_Gate/video_gen_20250721_145356/videos/composed_video_20250721_145724.mp4"
# 输出目录(可选,默认为 "output"
OUTPUT_DIR = "output"
# 处理选项
INCLUDE_DUBBING = True # 是否包含配音处理
# ==================== 可选配置覆盖 ====================
# 您可以在这里覆盖 config.yaml 中的设置
# 配置中文转英文翻译
update_key("whisper.language", "zh") # 原始语言为中文
update_key("target_language", "English") # 目标语言为英文
update_key("tts_method", "edge_tts") # 使用 Edge TTS
update_key("burn_subtitles", True) # 烧录字幕到视频
# ===================================================
try:
# 创建处理器实例
processor = VideoLingoProcessor(
input_path=INPUT_VIDEO_PATH,
output_dir=OUTPUT_DIR
)
# 执行处理
success = processor.process_all(include_dubbing=INCLUDE_DUBBING)
if success:
print("\n🎉 处理成功完成!")
else:
print("\n❌ 处理过程中出现错误")
except FileNotFoundError as e:
print(f"❌ 文件错误: {e}")
print("请检查输入视频路径是否正确")
except Exception as e:
print(f"❌ 处理失败: {e}")
if __name__ == "__main__":
main()