使用 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 将字幕烧录到视频中。

相关推荐
沐禾安信3 小时前
抖音的bgm 想保存? 3个音频提取工具,一键分离
音视频·音频·音频转换·视频转换
Peter-Code3 小时前
视频人脸马赛克逐帧处理技术方案解析
音视频
TechVoyager_82464 小时前
从TMDS输入到音视频分离:IT66021FN接收芯片技术详解
音视频·色彩空间转换·it66021·hdmi1.4b·tmds·音视频分离·hdcp1.4
IvorySQL4 小时前
代价比较的变革——PostgreSQL执行计划干预增强深度解析
数据库·postgresql·ffmpeg
不cong明的亚子15 小时前
web live多屏互动平台
javascript·经验分享·音视频
ACP广源盛1392462567315 小时前
M6/M5 Pro Mac mini 端侧 AI 新形态@ACP#GSV5800 Serdes 长距离视频传输在 AI 服务中的机会与落地场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos·音视频
广州硅基技术官方1 天前
AIGK外贸工厂社媒引流实战教程:海外自媒体短视频AI矩阵获客玩法解析
人工智能·音视频·媒体
奈斯先生Vector1 天前
AIGC 视频生成换个拍法:用 Kling Video 把一张人物图变成可剪辑的短故事
开发语言·人工智能·windows·python·aigc·音视频
AI的探索之旅1 天前
97 个 OpenCV 实例(二十一):音频进阶,音视频同抽与麦克风采集
人工智能·opencv·音视频
独码侠1 天前
FunASR语音识别生产部署实战:511MB音频47秒转写,离线落地 8 步、7 坑一次说清
人工智能·音视频·语音识别·funasr·说话人分离·会议纪要·内网离线部署