使用 whisper和ffmpeg
来烧录中英文双语字幕,可以通过以下几个步骤来修改你的代码。主要修改的地方是生成字幕的方式,将字幕通过 ffmpeg
的命令行工具烧录到视频中。通过生成字幕文件(.srt
)然后用 ffmpeg
将字幕直接烧录到视频里。
主要步骤:
- 生成英文和简体中文字幕的
.srt
文件。 - 使用
ffmpeg
将字幕烧录到视频中。
代码:
python
import whisper
import os
from datetime import
import torch
from deep_translator import GoogleTranslator
import subprocess
def extract_audio(video_path, audio_path):
"""从视频中提取音频"""
try:
video = VideoFileClip(video_path)
video.audio.write_audiofile(audio_path)
video.close()
except Exception as e:
print(f"音频提取错误: {str(e)}")
raise
def generate_srt(segments, output_srt):
"""生成SRT格式字幕文件,同时生成中英文双语字幕"""
# 代理设置
proxies = {
'http': 'http://127.0.0.1:10800', # 根据你的代理设置修改端口
'https': 'http://127.0.0.1:10800' # 根据你的代理设置修改端口
}
# 使用 deep-translator 进行翻译
translator = GoogleTranslator(source='en', target='zh-CN', proxies=proxies)
with open(output_srt, 'w', encoding='utf-8') as f:
for i, segment in enumerate(segments, start=1):
# 转换时间格式
start = str(t(seconds=int(segment['start'])))
end = str(t(seconds=int(segment['end'])))
# 获取英文字幕文本
english_text = segment['text'].strip()
# 获取简体中文字幕文本(使用翻译)
simplified_text = translator.translate(english_text)
# 写入SRT格式文件
f.write(f"{i}\n")
f.write(f"{start} --> {end}\n")
f.write(f"{english_text}\n")
f.write(f"{simplified_text}\n\n")
def transcribe_audio(audio_path, device="cpu"):
"""使用Whisper转录音频"""
print("加载Whisper模型...")
model = whisper.load_model("tiny", device=device) # 使用更高精度的模型,"tiny" 可能精度不够
print("开始转录...")
result = model.transcribe(audio_path, verbose=False, language='en') # 假设视频为英文
return result["segments"]
def main(video_path, output_video_path, output_srt):
"""主函数"""
try:
# 检查CUDA是否可用
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"使用设备: {device}")
# 设置音频文件路径
audio_path = "temp_audio.wav" # 提取的音频文件
# 提取音频
print("提取音频中...")
extract_audio(video_path, audio_path)
# 使用Whisper转录音频
print("开始转录音频...")
segments = transcribe_audio(audio_path, device)
# 生成SRT字幕文件
print("生成字幕文件...")
generate_srt(segments, output_srt)
print(f"字幕已生成: {output_srt}")
# 使用ffmpeg烧录字幕到视频中
print("生成带字幕的视频...")
# 构造ffmpeg命令
ffmpeg_command = [
"ffmpeg",
"-i", video_path, # 输入视频路径
"-i", output_srt, # 输入字幕文件
"-c:v", "libx264", # 设置视频编码
"-c:a", "aac", # 设置音频编码
"-strict", "experimental", # 启用实验性特性
"-vf", "subtitles=" + output_srt, # 使用字幕文件
"-y", # 自动确认覆盖输出文件
output_video_path # 输出带字幕的视频路径
]
# 执行ffmpeg命令
subprocess.run(ffmpeg_command, check=True)
print(f"视频已保存: {output_video_path}")
# 可选:删除提取的音频文件
os.remove(audio_path)
except Exception as e:
print(f"处理过程中出错: {str(e)}")
raise
if __name__ == "__main__":
# 设置输入输出路径
video_path = "C:/Users/ly/Antony Blinken Says the War in Gaza Won't Define His Legacy [fSYtF1BGqHg].mp4" # 替换为你的视频文件路径
output_video_path = "C:/Users/ly/output_with_subtitles.mp4" # 输出的带字幕视频路径
output_srt = "C:/Users/ly/output.srt" # 输出的字幕文件路径
main(video_path, output_video_path, output_srt)
关键修改点:
- 生成SRT文件 :
generate_srt
函数生成了一个带有英文和简体中文字幕的.srt
文件。
- 使用ffmpeg嵌入字幕 :
- 使用
subprocess.run
来执行ffmpeg
命令,将.srt
字幕文件嵌入到视频中。命令中的-vf subtitles=output.srt
参数会使ffmpeg
将字幕文件烧录到视频中。
- 使用
需要的依赖:
whisper
:用于转录音频。deep-translator
:用于翻译英文字幕为中文。ffmpeg
:必须安装并配置在系统环境变量中,确保可以从命令行调用ffmpeg
。
安装ffmpeg:
你需要安装并配置 ffmpeg
。如果没有安装,可以按以下步骤操作:
- 下载并解压
ffmpeg
(官方FFmpeg下载)。 - 将
ffmpeg
的bin
目录添加到环境变量中。
说明:
- 生成的
.srt
文件 结合了英文和简体中文的字幕。 - 使用
ffmpeg
来将字幕硬嵌入到视频中,最终输出一个带有双语字幕的视频。
这段代码会提取视频中的音频,使用 Whisper 进行转录,翻译为简体中文,然后生成一个 .srt
字幕文件,最后使用 ffmpeg
将字幕烧录到视频中。