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

相关推荐
REDcker4 天前
WebCodecs VideoDecoder 的 hardwareAcceleration 使用
前端·音视频·实时音视频·直播·webcodecs·videodecoder
gihigo19985 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
山河君5 天前
四麦克风声源定位实战:基于 GCC-PHAT + 最小二乘法实现 DOA
算法·音视频·语音识别·信号处理·最小二乘法·tdoa
音视频牛哥5 天前
Android平台RTMP/RTSP超低延迟直播播放器开发详解——基于SmartMediaKit深度实践
android·人工智能·计算机视觉·音视频·rtmp播放器·安卓rtmp播放器·rtmp直播播放器
qq_416276425 天前
通用音频表征的对比学习
学习·音视频
美狐美颜sdk5 天前
Android全局美颜sdk实现方案详解
人工智能·音视频·美颜sdk·视频美颜sdk·美狐美颜sdk
EasyDSS5 天前
私有化部署EasyDSS视频点播能力:全链路视频技术赋能,打造企业级视听新体验
音视频·hls·m3u8·点播技术·智能转码
qq_416276425 天前
DeLoRes——一种通用的音频表征学习新方法(DeLoRes(基于 Barlow Twins 的冗余最小化方法)
学习·音视频
Q_4582838685 天前
从定位到视频:808 + 1078 在各行业的落地实践
音视频
山顶望月川5 天前
实测MiniMax-Hailuo-02:当“开工大吉“变成“无字天书“,国产AI视频模型的能与之不能
人工智能·音视频