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

相关推荐
Likeadust10 小时前
视频直播点播平台EasyDSS助力阳光政务直播体系建设
音视频·政务
skyjilygao11 小时前
n8n整合ffmpeg
ffmpeg·视频编辑·n8n
xcLeigh14 小时前
HTML5实现好看的视频播放器(三种风格,附源码)
前端·音视频·html5
别动哪条鱼15 小时前
SDL 函数对各对象缓冲区的影响
网络·数据结构·ffmpeg
骄傲的心别枯萎17 小时前
RV1126 NO.57:ROCKX+RV1126人脸识别推流项目之读取人脸图片并把特征值保存到sqlite3数据库
数据库·opencv·计算机视觉·sqlite·音视频·rv1126
好游科技18 小时前
IM即时通讯系统:安全可控、功能全面的社交解决方案全解析
安全·音视频·webrtc·im即时通讯·私有化部署im即时通讯·社交app
EasyDSS18 小时前
视频直播点播平台EasyDSS构建高并发、低延迟的远程教学直播新模式
音视频
GIOTTO情19 小时前
多模态舆情监测技术深度解析:Infoseek 如何实现 AI 造假与短视频舆情的精准捕捉?
人工智能·音视频
音视频牛哥19 小时前
C# 开发工业级 RTSP/RTMP 播放器实战:基于 SmartMediakit 的低延迟与高可靠性设计
音视频·rtsp播放器·rtmp播放器·windows rtsp播放器·windows rtmp播放器·c# rtsp播放器·c# rtmp播放器
JellyDDD19 小时前
【悬赏】Android WebRTC 数字人项目回声问题排查(AEC / AudioMode)
音视频·webrtc