使用 whisper和ffmpeg 烧录视频的中英文双语字幕

使用 whisper和ffmpeg 来烧录中英文双语字幕,可以通过以下几个步骤来修改你的代码。主要修改的地方是生成字幕的方式,将字幕通过 ffmpeg 的命令行工具烧录到视频中。通过生成字幕文件(.srt)然后用 ffmpeg 将字幕直接烧录到视频里。

主要步骤:

  1. 生成英文和简体中文字幕的 .srt 文件
  2. 使用 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)

关键修改点:

  1. 生成SRT文件
    • generate_srt 函数生成了一个带有英文和简体中文字幕的 .srt 文件。
  2. 使用ffmpeg嵌入字幕
    • 使用 subprocess.run 来执行 ffmpeg 命令,将 .srt 字幕文件嵌入到视频中。命令中的 -vf subtitles=output.srt 参数会使 ffmpeg 将字幕文件烧录到视频中。

需要的依赖:

  1. whisper:用于转录音频。
  2. deep-translator:用于翻译英文字幕为中文。
  3. ffmpeg :必须安装并配置在系统环境变量中,确保可以从命令行调用 ffmpeg

安装ffmpeg:

你需要安装并配置 ffmpeg。如果没有安装,可以按以下步骤操作:

  • 下载并解压 ffmpeg官方FFmpeg下载)。
  • ffmpegbin 目录添加到环境变量中。

说明:

  1. 生成的 .srt 文件 结合了英文和简体中文的字幕。
  2. 使用 ffmpeg 来将字幕硬嵌入到视频中,最终输出一个带有双语字幕的视频。

这段代码会提取视频中的音频,使用 Whisper 进行转录,翻译为简体中文,然后生成一个 .srt 字幕文件,最后使用 ffmpeg 将字幕烧录到视频中。

相关推荐
Eric.Lee20215 小时前
moviepy 将mp4视频文件提取音频mp3 - python 实现
音视频·moviepy·音频提取
宿命小人8 小时前
ffmpeg视频抽帧和合成
ffmpeg·音视频
余~~185381628009 小时前
碰一碰发视频的剪辑功能开发的细节源码搭建,支持OEM
音视频
前端熊猫9 小时前
MP4 与Fragmented MP4 (fMP4)的区别
音视频·mp4·fmp4
智联视频超融合平台10 小时前
WebRTC 在视频联网平台中的应用:开启实时通信新篇章
网络协议·音视频·webrtc·实时音视频·视频编解码
jwybobo200712 小时前
linux音视频采集技术: v4l2
linux·音视频
丘上人14 小时前
ffmpeg 命令行 重置音频或视频的时间戳
ffmpeg·音视频
伊织code17 小时前
Decord - 深度学习视频加载器
人工智能·深度学习·ai·音视频·视频·加载·decord
喜欢小苹果的码农18 小时前
javaCV音频剪切
java·音视频
我真不会起名字啊19 小时前
“深入浅出”系列之FFmpeg:(1)音视频开发基础
ffmpeg·音视频