whisper语音转文字及其视频配置中英文字幕应用

1 简介及安装

1.1 简介

Whisper是由OpenAI训练并开源的通用语音识别模型,它在英语语音识别的稳健性和准确性方面已接近人类水平。

Paper:https://cdn.openai.com/papers/whisper.pdf

Code:https://github.com/openai/whisper

Blog:https://openai.com/blog/whisper

Whisper 是一种自动语音识别 (ASR) 系统,根据从网络收集的680,000小时多语言和多任务监督数据进行训练。使用这种大规模且多样化的数据集,能够提升模型在口音、背景噪音及专业术语方面的稳健性。此外,该模型还支持多种语言的转录,以及将这些语言翻译成英语。Whisper架构是一种简单的端到端方法,实现为编码器-解码器转换器。输入音频被分成30秒的块,转换为对数梅尔频谱图,然后传递给编码器。解码器经过训练,可以预测相应的文本标题,并与特殊的令牌混合使用,这些令牌指导单个模型执行语言识别、短语级时间戳、多语言语音转录和英语语音翻译等任务。Whisper 的音频数据集中约有三分之一是非英语内容,模型在训练时会交替执行两个任务:将音频转录为原始语言,或翻译成英语。更为详细信息请阅读论文及博客。

1.2 安装

1. 安装ffmpeg

ffmpeg可以很方便的处理各种音视频文件,在识别视频相应语音内容时需要该库的支持,可参考文中本文最后第2项博客,下载预编译版本ffmpeg并配置环境变量,最终如在命令行下可以直接查看ffmpeg版本信息说明安装成功。

2. 创建新的conda环境

whisper官网指出项目兼容3.8-3.11,这里安装的是3.10

复制代码
conda create -n whisper python=3.10 -y
conda activate whisper

3. 安装PyTorch

如果没有GPU则安装CPU版本torch

复制代码
conda install -c pytorch pytorch torchvision torchaudio cpuonly -y

如果有GPU则根据相应驱动版本安装合适的torch版本,

复制代码
pip install torch==2.6.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

注意,这里只需指定torch版本即可,torchvision/torchaudio版本在安装时会自动匹配,安装完成后可以使用如下脚本测试环境:

复制代码
import torch
print("Torch version:", torch.__version__)
print("CUDA available:", torch.cuda.is_available())
print("CUDA version used by PyTorch:", torch.version.cuda)
print("Device:", torch.device("cuda:0" if torch.cuda.is_available() else "cpu"))

从图中可以看出torch使用的CUDA版本12.4是小于PC上实际安装的CUDA版本12.8,这是因为一般软件都保持向下兼容,所以12.8是兼容12.4的,所以即便是torch使用的CUDA版本稍低也没有问题。

4. 安装Whisper

使用如下命令进行安装

复制代码
pip install openai-whisper -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后可以查看whisper帮助信息:

以下是本人环境中所安装的所有python库,如果在使用whisper中遇见问题时可以参考安装:

2 实际应用

2.1 模型说明

最新版本的whisper提供了6种模型,其中4种还提供了只支持英文的版本,各种模型在速度和精度上做出了相应的权衡。以下是可用模型的名称及其相对于大型模型的近似内存要求和推理速度,表中的相对速度是通过在A100上转录英语语音来测量的,真实世界的速度可能会因许多因素而显著变化,包括语言、说话速度和可用硬件。

仅用于英语应用程序时,.en模型往往表现更好,特别是对于tiny.en和base.en模型。据官方观察,对于small.en和medium.en模型,差异并不是那么显著。此外,turbo模型是large-v3的优化版本,可提供更快的转录速度,同时将准确性降低到最低限度。Whisper的表现因语言而异,下图显示了使用在Common Voice 15和Fleurs数据集上评估的WER(单词错误率)或CER(字符错误率,以斜体显示)按语言对large-v3和large-v2模型的性能细分。

从图中可以看到v3大模型比v2有明显的提升,特别是中文对广东话的识别水平比普通话还高。

2.2 命令行用法

1. 音频解析

使用如下命令可以让Whisper同时处理多个音频文件,并指定使用turbo模型(属于small模型的优化版,速度快但精度略低于medium/large)进行转录或翻译,运行命令后,whisper会自动下载所用的模型文件,在Windows系统中,默认路径为C:\Users\<用户名>\.cache\whisper。

复制代码
whisper audio1.mp3 audio2.wav dilireba.mp3 --model turbo

如果在参数中没有用--language指定语言,whisper会首先检测语种然后再进行解析,程序运行过程信息如下所示:

最终将产生txt、srt、tsv、vtt、json五种文件格式,它们分别适用于不同的场景,用途各有侧重:

(1).txt(纯文本文件)

  • 用途:最基础的转录结果,仅包含音频中的文字内容,不包含时间戳。
  • 适用场景:
    • 快速查看音频的完整文字记录(如会议纪要、访谈内容)。
    • 需要对文本进行二次编辑(如提取关键词、摘要)。
    • 无需时间信息的场景(如单纯的文字存档)。
  • 特点:格式简单,可读性强,兼容性高(任何文本编辑器都能打开)。

(2).srt(SubRip Subtitle,字幕文件)

  • 用途:最常用的字幕格式之一,包含文字内容和精确的时间戳(开始 / 结束时间)。

  • 适用场景:

    • 视频字幕制作(如电影、剧集、短视频添加字幕)。
    • 支持大多数视频播放器(如 VLC、PotPlayer)和视频编辑软件(如 Premiere、剪映)。
  • 格式示例:

    复制代码
    1
    00:00:00,000 --> 00:00:03,500
    大家好,我是星光队员迪丽热八
    
    2
    00:00:03,500 --> 00:00:06,820
    和我一起加入脱贫攻坚战星光行动
  • 特点:结构清晰,时间戳精确到毫秒,支持多语言字幕。

(3) .vtt(WebVTT,网页视频字幕文件)

  • 用途:专为网页设计的字幕格式,是 HTML5 标准支持的字幕格式。

  • 适用场景:

    • 网页中的视频字幕(如 YouTube、B 站、自有网站的视频)。
    • 支持浏览器直接解析,无需额外插件。
  • 格式示例:

    复制代码
    WEBVTT
    
    00:00.000 --> 00:03.500
    大家好,我是星光队员迪丽热八
    
    00:03.500 --> 00:06.820
    和我一起加入脱贫攻坚战星光行动
  • 特点:与srt类似,但时间戳用.分隔毫秒(而非,),且开头需标注WEBVTT

(4).tsb(Tab-Separated Values,制表符分隔文件)

  • 用途:结构化的表格数据文件,包含时间戳(开始 / 结束时间)、文字内容等信息,便于数据分析或批量处理。

  • 适用场景:

    • 对字幕内容进行数据分析(如统计每段台词的时长、关键词出现频率)。
    • 导入到 Excel、Google Sheets 等表格工具中编辑或筛选。
    • 批量修改字幕(如通过脚本处理表格数据后再转换为其他字幕格式)。
  • 格式示例:

    复制代码
    start    end    text
    0    3500    大家好,我是星光队员迪丽热八
    3500    6820    和我一起加入脱贫攻坚战星光行动
    6820    9740    6月28日我在电影频道跟您不见不散
  • 特点:以制表符分隔列,机器可读性强,适合自动化处理。

(5).json(JavaScript Object Notation,结构化数据文件)

  • 核心用途:存储最完整的转录信息,包含文字、时间戳、置信度等详细元数据,适合程序解析。
  • 包含的关键信息:
    • 整体转录文本(text);
    • 分段信息(segments数组,含每段的id、start、end、text);
    • 单词级细节(部分模型支持,words数组,含每个单词的start、end、probability置信度);
    • 语言信息(language,如zh表示中文)。
  • 适用场景:
    • 开发字幕工具(通过代码解析JSON自动生成字幕);
    • 语音数据分析(如计算语速、定位关键词出现的精确时间);
    • 与其他系统集成(如导入内容管理系统、AI 分析平台);
    • 保留原始数据用于质量评估(通过置信度筛选低精度片段)。
  • 特点:信息最全面,结构严谨,必须通过代码或 JSON 解析工具处理,不适合人工直接编辑。

可通过--output_format参数指定格式(如--output_format srt,json同时生成两种),默认会生成所有格式。

如需指定输出目录:--output_dir ./transcripts

如需翻译为英语:--task translate

如下命令示例了较为完整的用法:

复制代码
whisper dilireba.mp3 --model large --language Chinese --output_dir ./results --output_format txt --task translate

最终产生如下结果:

官网已经明确说明turb模型不支持英文翻译,所以要进行其他语种到英语翻译时请使用其他模型,使用medium或者large模型可获取最好的翻译结果。

2. 视频解析

进行视频解析时用法和进行音频解析时类似,例如:

复制代码
whisper zhouxingchi.mp4 --model medium --language Chinese --task translate

该命令使用medium模型解析中文电影,并进行英文翻译。命令运行完成后也会生成.srt英文版本字幕文件。使用vlc对原音频文件进行播放,vlc会自动检测并加载字幕文件,因为原始视频中本身存在中文字幕,播放时英文字幕和远有字幕会重合到一起,可以修改偏好设置 "显示设置" 为全部。并展开 "视频" → 点击 "字幕 / OSD",在其中修改"强制字幕位置"参数,如这里修改为100:

保存以上设置,并重新打开视频文件进行播放,可以看到英文字幕位置已经和远有的中文字幕已经错开:

2.3 python用法

1. 简单示例

首先给出源码:

复制代码
import whisper

model = whisper.load_model("base")
result = model.transcribe("../audio/dilireba.mp3")
print(result["text"])

对比之前的结果可以看出在使用"base"模型时,解析结果明显比较差,例如将"脱贫攻坚战"解析为"拖平公间站",所以要想取得最精确的结果最好还是使用large模型。

2. 英文视频配置中文字幕

上一节中已经说了如何对中文视频配置英文字幕,还有一种相反的情况就是给英文视频配置中文字幕,这里首先需要解析出英文字幕文件,如调用如下命令:

复制代码
whisper .\IntroToNVIDIANsightSystemsCUDADeveloperTools_2.mp4 --model medium --language English --output_format srt

生成的字幕文件IntroToNVIDIANsightSystemsCUDADeveloperTools_2.srt内容如下:

复制代码
1
00:00:00,000 --> 00:00:02,640
Hey everyone, my name is Sven Middlebär.

2
00:00:02,640 --> 00:00:06,200
Welcome again to the Cuda Developer Tools video series.

3
00:00:06,200 --> 00:00:10,820
In the first episode of this series, Robby introduced you to the Ansight Tools ecosystem.

4
00:00:10,820 --> 00:00:14,960
He explained what tools it offers and what a typical profiling workflow looks like.

比较笨的方法就是直接复制相应英文文本到翻译工具(如谷歌、百度)中,逐句翻译成中文,然后将相应的中文文本替换SRT文件里对于的英文内容,其他时间戳和序号保持不变。这种方法适用于字幕量少,追求精确的场景。对于字幕量大,追求效率的场景,就需要借助python脚本及翻译API进行自动化翻译,本来想借助谷歌翻译,但是由于国内的限制导致API访问会超时失败,只好改为使用百度翻译,首先按如下步骤,申请百度翻译开放平台的 API,获取appid和secretKey:

测试实验用,申请为"个人开发者"即可:

申请完成后会给出APP ID及密钥:

之后开通相应的服务,这里选择的最基础的"通用文本翻译":

复制代码
pip install pysrt deep-translator  # pysrt 处理 SRT,deep-translator中的BaiduTranslator可帮助完成百度翻译api调用

以下是完整处理程序baidu_srt_translator.py源码:

复制代码
import pysrt
from deep_translator import BaiduTranslator
import time

def translate_srt_baidu(input_path, output_path, appid, appkey, source_lang='en', target_lang='zh'):
    """
    使用百度翻译API将SRT字幕文件从源语言翻译到目标语言
    
    参数:
        input_path: 输入的SRT文件路径
        output_path: 输出的翻译后SRT文件路径
        appid: 百度翻译API的appid
        appkey: 百度翻译API的appkey
        source_lang: 源语言代码(默认英文'en')
        target_lang: 目标语言代码(默认中文'zh')
    """
    # 读取SRT文件
    try:
        subs = pysrt.open(input_path)
        print(f"成功读取SRT文件,共包含 {len(subs)} 条字幕")
    except Exception as e:
        print(f"读取SRT文件失败:{str(e)}")
        return
    
    # 初始化百度翻译器
    try:
        translator = BaiduTranslator(
            appid=appid,
            appkey=appkey,
            source=source_lang,
            target=target_lang
        )
    except Exception as e:
        print(f"初始化翻译器失败:{str(e)}")
        return
    
    # 逐句翻译字幕
    for i, sub in enumerate(subs, 1):
        # 跳过空文本
        if not sub.text.strip():
            continue
        
        try:
            # 翻译文本(百度翻译API有频率限制,添加适当延迟)
            translated_text = translator.translate(sub.text)
            sub.text = translated_text
            
            # 显示进度
            if i % 10 == 0:
                print(f"已完成 {i}/{len(subs)} 条字幕翻译")
            
            # 避免触发API频率限制
            time.sleep(0.5)
            
        except Exception as e:
            print(f"第 {i} 条字幕翻译失败:{str(e)}")
            print(f"原文:{sub.text}")
            # 失败时保留原文
            continue
    
    # 保存翻译后的文件
    try:
        subs.save(output_path, encoding='utf-8')
        print(f"\n翻译完成!结果已保存至:{output_path}")
    except Exception as e:
        print(f"保存文件失败:{str(e)}")

def main():
    # 请替换为你的百度翻译API信息
    BAIDU_APPID = "你的百度翻译appid"
    BAIDU_APPKEY = "你的百度翻译appkey"
    
    # 输入输出文件路径
    INPUT_SRT = "..\\video\\IntroToNVIDIANsightSystemsCUDADeveloperTools_2.srt"   # 输入的英文字幕文件
    OUTPUT_SRT = "..\\video\\IntroToNVIDIANsightSystemsCUDADeveloperTools_cn.srt"  # 输出的中文字幕文件
    
    # 调用翻译函数
    translate_srt_baidu(
        input_path=INPUT_SRT,
        output_path=OUTPUT_SRT,
        appid=BAIDU_APPID,
        appkey=BAIDU_APPKEY,
        source_lang='en',
        target_lang='zh'
    )

if __name__ == "__main__":
    main()

baidu_srt_translator.py

注意需要将程序中的BAIDU_APPID和BAIDU_APPKEY换成自己的百度翻译API对应内容,另外百度翻译 API 对免费用户有QPS(每秒请求数)限制(通常为 1-5 次 / 秒),如果程序请求过快会触发限制,这时会提示如下错误:

比如我在调用时就是将其中的time.sleep(0.5)语句改为time.sleep(1),即增加1秒的间隔才能正常的完成srt文件翻译:

完成翻译后将中文srt结果文件的名称改为和视频文件名相同(英文名可以改为其他名称,如在名称后增加en),再次用vlc播放该视频文件时,会自动加载中文字幕为默认字幕,效果如下:

当然也可以在播放过程中切换成"轨道2",改为英文字幕:

除百度翻译外,也可以使用阿里翻译或者DeepL翻译。阿里翻译也需要去开放平台申请API,并获取相关密钥;而DeepL是一家提供高质量翻译服务的公司,deep-translator支持调用 DeepL翻译引擎,它在使用时无需额外申请密钥(但免费版有一定的调用限制),这里不再详细进行说明。

参考

  1. https://blog.csdn.net/weixin_44966641/article/details/127908459

  2. https://blog.csdn.net/make_progress/article/details/136175745

  3. https://zhuanlan.zhihu.com/p/617770448

相关推荐
机器之心6 小时前
DeepSeek开源新基础模型,但不是V4,而是V3.1-Base
人工智能·openai
风云信步6 小时前
GitHub CEO '不改变就改行': 拥抱AI,Copilot instruction用法详解
aigc·openai·ai编程
深度学习机器6 小时前
从Chat Completions到Responses,OpenAI Agent接口设计的演变
llm·openai·agent
FogLetter6 小时前
面试官问我Function Call,我这样回答拿到了Offer!
前端·面试·openai
新智元7 小时前
16 岁天才少年炒掉马斯克,空降华尔街巨头!9 岁上大学,14 岁进 SpaceX
人工智能·openai
J_bean20 小时前
Spring AI Alibaba 项目接入兼容 OpenAI API 的大模型
人工智能·spring·大模型·openai·spring ai·ai alibaba
机器之心1 天前
7年了,OpenAI官方给出五代GPT对比,网友却怀念起「狂野」初代
人工智能·openai
李大腾腾1 天前
6、n8n 中写自己的代码(JavaScript)
openai·workflow
量子位1 天前
4o-mini华人领队也离职了,这次不怪小扎
openai·gemini