Python使用Whisper + Transformers自动生成中英文双语字幕的完整流程

 更新时间:2025年12月04日 09:47:25   作者:weixin_46244623  
本文将教你如何使用 OpenAI 的 Whisper 语音识别模型,结合 HuggingFace Transformers 翻译模型,实现从视频中提取音频、识别语音、生成中英双语字幕的完整流程,需要的朋友可以参考下

引言

本文将教你如何使用 OpenAI 的 Whisper 语音识别模型,结合 HuggingFace Transformers 翻译模型,实现从视频中提取音频、识别语音、生成中英双语字幕的完整流程。
支持自动语言检测、进度条显示、以及自动生成 .srt 字幕文件。

一、环境准备

在开始之前,请先安装所需依赖包:

pip install openai-whisper transformers pydub librosa tqdm torch ffmpeg-python modelscope

需要提前安装 FFmpeg(Windows 用户请到 ffmpeg.org 下载并配置环境变量)

二、项目功能概述

本项目实现的流程如下:

  1. 提取视频音频(使用 FFmpeg)
  2. 验证音频文件是否可用(使用 pydub
  3. 使用 Whisper 模型进行语音识别
  4. 自动检测音频语言
  5. 使用 Transformers 翻译模型进行中英文互译
  6. 生成双语字幕文件 .srt

三、国内下载模型方法

from modelscope import snapshot_download

# 下载模型到当前目录
model_dir = snapshot_download('Helsinki-NLP/opus-mt-en-zh', cache_dir='./')

print(f"✅ 模型已下载到当前目录: {model_dir}")

model_dir = snapshot_download('Helsinki-NLP/opus-mt-zh-en', cache_dir='./')

print(f"✅ 模型已下载到当前目录: {model_dir}")

四、完整代码(含中文注释)

import whisper
import warnings
from datetime import timedelta
from tqdm import tqdm
import librosa
import time
from transformers import pipeline
import torch
from pydub import AudioSegment
import os
import ffmpeg

# 忽略警告信息
warnings.filterwarnings("ignore", category=UserWarning)

# 输入视频路径(可修改)
input_video = r"./Gesture Drawing Practice _ 20 and 40 sec. poses.mp4"
# 输出音频路径
output_audio = "Gesture Drawing Practice _ 20 and 40 sec. poses.wav"

# =========================
# Step 1: 提取视频中的音频
# =========================
ffmpeg.input(input_video).output(output_audio, ac=1, ar=16000).run()

# =========================
# Step 2: 时间戳格式化函数
# =========================
def format_timestamp(seconds):
    """将秒数转换为 SRT 时间格式(HH:MM:SS,mmm)"""
    td = timedelta(seconds=seconds)
    hours, remainder = divmod(td.seconds, 3600)
    minutes, seconds = divmod(remainder, 60)
    milliseconds = int(td.microseconds / 1000)
    return f"{hours:02d}:{minutes:02d}:{seconds:02d},{milliseconds:03d}"

# =========================
# Step 3: 验证音频文件是否有效
# =========================
def validate_audio(audio_file):
    """检查音频文件是否有效,并返回其基本信息"""
    try:
        audio = AudioSegment.from_file(audio_file)
        duration = len(audio) / 1000.0  # 秒
        sample_rate = audio.frame_rate
        channels = audio.channels
        print(f"✅ 音频验证成功:时长={duration:.2f}s, 采样率={sample_rate}Hz, 声道={channels}")
        return True, duration
    except Exception as e:
        print(f"❌ 音频验证失败: {e}")
        return False, 0

# =========================
# Step 4: 初始化翻译模型
# =========================
print("🔤 正在加载翻译模型,请稍候...")
translator_en_to_zh = pipeline("translation", model="./Helsinki-NLP/opus-mt-en-zh")  # 英译中
translator_zh_to_en = pipeline("translation", model="./Helsinki-NLP/opus-mt-zh-en")  # 中译英
print("✅ 翻译模型加载完成。")

# =========================
# Step 5: 验证音频文件
# =========================
audio_file = output_audio
is_valid, duration = validate_audio(audio_file)
if not is_valid:
    raise ValueError(f"无效的音频文件: {audio_file}")

# 备用方案:使用 librosa 检查时长
try:
    duration = librosa.get_duration(path=audio_file)
except Exception as e:
    print(f"Librosa 检查失败: {e}")

# =========================
# Step 6: 初始化 Whisper 模型
# =========================
print("🎙️ 正在加载 Whisper 模型...")
try:
    model = whisper.load_model("base")  # 可选 tiny, base, small, medium, large
except Exception as e:
    print(f"加载模型失败: {e},回退到 'medium' 模型。")
    model = whisper.load_model("medium")

# 进度条初始化
progress_bar = tqdm(total=100, desc="语音识别中", unit="%")

# =========================
# Step 7: 执行语音识别(带进度)
# =========================
def transcribe_with_progress(model, audio_file, language=None):
    start_time = time.time()
    
    # 自动检测语言
    if language is None:
        try:
            audio = whisper.load_audio(audio_file)
            mel = whisper.log_mel_spectrogram(audio, n_mels=80).to(model.device)
            _, probs = model.detect_language(mel)
            detected_language = max(probs, key=probs.get)
            print(f"🌍 自动检测语言: {detected_language}")
        except Exception as e:
            print(f"语言检测失败: {e},默认使用英语(en)。")
            detected_language = "en"
    else:
        detected_language = language
        print(f"🌐 使用指定语言: {detected_language}")
    
    # 执行转录
    try:
        result = model.transcribe(audio_file, language=detected_language)
    except Exception as e:
        print(f"转录失败: {e}")
        raise
    
    # 更新进度条
    progress_bar.update(100 - progress_bar.n)
    progress_bar.close()
    
    elapsed_time = time.time() - start_time
    print(f"✅ 转录完成,用时 {elapsed_time:.2f} 秒。")
    
    return result, detected_language

# 执行转录(可指定语言)
result, detected_language = transcribe_with_progress(model, audio_file, language="en")

# =========================
# Step 8: 生成中英双语字幕文件
# =========================
srt_path = f"{output_audio}.srt"
with open(srt_path, "w", encoding="utf-8") as f:
    for i, segment in enumerate(result["segments"]):
        start_time = format_timestamp(segment["start"])
        end_time = format_timestamp(segment["end"])
        text = segment["text"].strip()
        
        # 判断语言并翻译
        if detected_language == "zh":
            # 中文音频:原文中文 + 翻译英文
            zh_text = text
            en_text = translator_zh_to_en(text)[0]["translation_text"]
        else:
            # 英语音频:原文英文 + 翻译中文
            zh_text = translator_en_to_zh(text)[0]["translation_text"]
            en_text = text
        
        # 写入 SRT 文件(中文在上,英文在下)
        f.write(f"{i+1}\n")
        f.write(f"{start_time} --> {end_time}\n")
        f.write(f"{zh_text}\n{en_text}\n\n")

print(f"🎬 字幕文件生成成功:{srt_path}")

执行效果后

srt文件

五、完成效果

以上就是Python使用Whisper + Transformers自动生成中英文双语字幕的完整流程的详细内容,更多关于Python Whisper中英文双语字幕的资料请关注脚本之家其它相关文章!

相关文章

  • 通过selenium抓取某东的TT购买记录并分析趋势过程解析

    通过selenium抓取某东的TT购买记录并分析趋势过程解析

    这篇文章主要介绍了通过selenium抓取某东的TT购买记录并分析趋势过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • python 自定义装饰器使用及原理详解(最新推荐)

    python 自定义装饰器使用及原理详解(最新推荐)

    本文详细介绍了Python装饰器的原理和使用方法,包括简单的装饰器、带参数的装饰器、原函数的传参、保留原函数元数据以及类装饰器,通过这些讲解,读者可以全面了解装饰器的强大功能和应用技巧,感兴趣的朋友一起看看吧
    2025-02-02
  • 对命令行模式与python交互模式介绍

    对命令行模式与python交互模式介绍

    今天小编就为大家分享一篇对命令行模式与python交互模式介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python自动化完成tb喵币任务的操作方法

    Python自动化完成tb喵币任务的操作方法

    2019双十一,tb推出了新的活动,商店喵币,看了一下每天都有几个任务来领取喵币,从而升级店铺赚钱,然而我既想赚红包又不想干苦力,遂使用python来进行手机自动化操作,需要的朋友跟随小编一起看看吧
    2019-10-10
  • PySide和PyQt加载ui文件的两种方法

    PySide和PyQt加载ui文件的两种方法

    这篇文章主要为大家详细介绍了PySide和PyQt加载ui文件的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Python 使用指定的网卡发送HTTP请求的实例

    Python 使用指定的网卡发送HTTP请求的实例

    今天小编就为大家分享一篇Python 使用指定的网卡发送HTTP请求的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python+PyQt5开发一个截图工具

    Python+PyQt5开发一个截图工具

    这篇文章主要为大家详细介绍了如何使用Python和PyQt5开发一个截图工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • Python实现批量自动化处理图像的完整指南

    Python实现批量自动化处理图像的完整指南

    在日常办公中,我们经常需要处理大量图像,本文将介绍两个强大的Python图像处理库Pillow和OpenCV,展示如何使用它们实现各种图像处理自动化任务,希望对大家有所帮助
    2026-01-01
  • pandas将list数据拆分成行或列的实现

    pandas将list数据拆分成行或列的实现

    这篇文章主要介绍了pandas将list数据拆分成行或列的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Python爬虫实现使用beautifulSoup4爬取名言网功能案例

    Python爬虫实现使用beautifulSoup4爬取名言网功能案例

    这篇文章主要介绍了Python爬虫实现使用beautifulSoup4爬取名言网功能,结合实例形式分析了Python基于beautifulSoup4模块爬取名言网并存入MySQL数据库相关操作技巧,需要的朋友可以参考下
    2019-09-09

最新评论