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

相关推荐
aqi0021 分钟前
FFmpeg开发笔记(九十二)基于Kotlin的开源Android推流器StreamPack
android·ffmpeg·kotlin·音视频·直播·流媒体
Together_CZ2 小时前
Cambrian-S: Towards Spatial Supersensing in Video——迈向视频中的空间超感知
人工智能·机器学习·音视频·spatial·cambrian-s·迈向视频中的空间超感知·supersensing
Android系统攻城狮2 小时前
Android16音频之设置音频属性AudioTrack.Builder().setAudioAttributes:用法实例(一百一十九)
音视频·android16·音频进阶
空影星2 小时前
轻量日记神器RedNotebook,高效记录每一天
python·数据挖掘·数据分析·音视频
Black蜡笔小新2 小时前
视频汇聚平台EasyCVR赋能石油管道计量站精准监控与安全管理
安全·音视频
nuoxin1143 小时前
GSV1011-富利威-HDMI芯片选型
arm开发·驱动开发·fpga开发·ffmpeg·射频工程
马剑威(威哥爱编程)12 小时前
鸿蒙6开发视频播放器的屏幕方向适配问题
java·音视频·harmonyos
潇湘秦16 小时前
一次微小的CPU波动,你能查到什么?
ffmpeg
万能的小裴同学17 小时前
Android M3U8视频播放器
android·音视频
音视频牛哥17 小时前
轻量级RTSP服务的工程化设计与应用:从移动端到边缘设备的实时媒体架构
人工智能·计算机视觉·音视频·音视频开发·rtsp播放器·安卓rtsp服务器·安卓实现ipc功能