Whisper-Finetune

yeyupiaolingApache-2.0更新放缓

基于 PyTorch 微调 Whisper 语音识别模型,支持有无时间戳、无语音数据训练,并用 CTranslate2 加速推理,可部署到 Web、Windows 和安卓。

Fine-tune the Whisper speech recognition model to support training without timestamp data, training with timestamp data, and training without speech data. Accelerate inference and support Web deployment, Windows desktop deployment, and Android deployment

暂无版本1,222star219fork同步于 2026-11-07 07:30 UTC

怎么上手

由 README 提炼,执行前请确认
pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu128
python -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
硬件要求按 README 说明

README 使用环境为 GPU A100-PCIE-40GB*1、Ubuntu 18.04、Python 3.11、Pytorch 2.4.0;未说明 CPU 运行和最低显存要求。

多卡 / 张量并行
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

用 LoRA 微调 Whisper 语音识别模型,支持无时间戳、有时间戳和无语音数据训练,并提供多种部署方式

基于 PyTorch 微调 Whisper 语音识别模型,支持有无时间戳、无语音数据训练,并用 CTranslate2 加速推理,可部署到 Web、Windows 和安卓。

核心能力

  • 用 LoRA 对 Whisper 做微调,支持无时间戳、有时间戳和无语音数据训练
  • 支持 tiny 到 large-v3-turbo 多个 Whisper 模型
  • 支持 CTranslate2 和 GGML 加速推理,原模型可直接转换
  • 提供 Web 服务、Windows 桌面和 Android 部署源码
  • 支持 torchrun 和 accelerate 多卡训练

容易踩的坑

训练时 --base_model 默认从 HuggingFace 自动下载模型,离线需提前下载并设 --local_files_only=True;微调后必须先用 merge_lora.py 合并 LoRA 与基础模型才能推理;README 未说明默认端口,Web 部署需查看 infer_server.py 参数。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

0 个版本

暂无 release 数据(可能没有发版,或尚未同步)。

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    微调Whisper语音识别模型和加速推理

    简体中文 | English

    python version GitHub forks GitHub Repo stars GitHub 支持系统

    前言

    OpenAI在开源了号称其英文语音辨识能力已达到人类水准的Whisper项目,且它亦支持其它98种语言的自动语音辨识。Whisper所提供的自动语音识与翻译任务,它们能将各种语言的语音变成文本,也能将这些文本翻译成英文。本项目主要的目的是为了对Whisper模型使用Lora进行微调,支持无时间戳数据训练,有时间戳数据训练、无语音数据训练。目前开源了好几个模型,具体可以在openai查看,下面列出了常用的几个模型。另外项目最后还支持CTranslate2加速推理和GGML加速推理,提示一下,加速推理支持直接使用Whisper原模型转换,并不一定需要微调。支持Windows桌面应用,Android应用和服务器部署。

    在线试用

    使用whisper-small微调后的模型:在线演示

    支持模型

    • openai/whisper-tiny
    • openai/whisper-base
    • openai/whisper-small
    • openai/whisper-medium
    • openai/whisper-large
    • openai/whisper-large-v2
    • openai/whisper-large-v3
    • openai/whisper-large-v3-turbo

    欢迎大家扫码入知识星球(左)或者QQ群(右)讨论,知识星球里面提供项目的模型文件和博主其他相关项目的模型文件,也包括其他一些资源。

    使用环境:

    • Anaconda 3
    • Python 3.11
    • Pytorch 2.4.0
    • Ubuntu 18.04
    • GPU A100-PCIE-40GB*1

    视频讲解:哔哩哔哩

    演示地址:Web部署

    目录

    项目主要程序介绍

    1. aishell.py:制作AIShell训练数据。
    2. finetune.py:微调模型。
    3. merge_lora.py:合并Whisper和Lora的模型。
    4. evaluation.py:评估使用微调后的模型或者Whisper原模型。
    5. infer.py:使用调用微调后的模型或者transformers上的Whisper模型预测。
    6. infer_ct2.py:使用转换为CTranslate2的模型预测,主要参考这个程序用法。
    7. infer_gui.py:有GUI界面操作,使用调用微调后的模型或者transformers上的Whisper模型预测。
    8. infer_server.py:使用调用微调后的模型或者transformers上的Whisper模型部署到服务器端,提供给客户端调用。
    9. convert-ggml.py:转换模型为GGML格式模型,给Android应用或者Windows应用使用。
    10. AndroidDemo:该目录存放的是部署模型到Android的源码。
    11. WhisperDesktop:该目录存放的是Windows桌面应用的程序。

    模型测试表

    1. 原始模型字错率测试表。
    使用模型指定语言aishell_testtest_nettest_meeting粤语测试集模型获取
    whisper-tinyChinese0.318980.404820.75332N/A加入知识星球获取
    whisper-baseChinese0.221960.304040.50378N/A加入知识星球获取
    whisper-smallChinese0.138970.184170.31154N/A加入知识星球获取
    whisper-mediumChinese0.095380.135910.26669N/A加入知识星球获取
    whisper-largeChinese0.089690.129330.23439N/A加入知识星球获取
    whisper-large-v2Chinese0.088170.123320.26547N/A加入知识星球获取
    whisper-large-v3Chinese0.080860.114520.198780.35301加入知识星球获取
    whisper-large-v3-turboChinese0.086470.212250.203900.38069加入知识星球获取
    1. 微调数据集后字错率测试表。
    使用模型指定语言数据集aishell_testtest_nettest_meeting粤语测试集模型获取
    whisper-tinyChineseAIShell0.130430.44630.57728N/A加入知识星球获取
    whisper-baseChineseAIShell0.089990.330890.40713N/A加入知识星球获取
    whisper-smallChineseAIShell0.054520.198310.24229N/A加入知识星球获取
    whisper-mediumChineseAIShell0.036810.130730.16939N/A加入知识星球获取
    whisper-large-v2ChineseAIShell0.031390.122010.15776N/A加入知识星球获取
    whisper-large-v3ChineseAIShell0.036600.098350.137060.33464加入知识星球获取
    whisper-large-v3-turboChineseAIShell0.036070.230380.356970.35697加入知识星球获取
    whisper-large-v3Cantonese粤语(含港式粤语)0.124430.323650.359110.02106加入知识星球获取
    whisper-large-v3-turboCantonese粤语(含港式粤语)0.140280.344830.386820.03255加入知识星球获取
    whisper-tinyChineseWenetSpeech0.177110.247830.39226N/A加入知识星球获取
    whisper-baseChineseWenetSpeech0.145480.177470.30590N/A加入知识星球获取
    whisper-smallChineseWenetSpeech0.084840.118010.23471N/A加入知识星球获取
    whisper-mediumChineseWenetSpeech0.058610.087940.19486N/A加入知识星球获取
    whisper-large-v2ChineseWenetSpeech0.054430.083670.19087N/A加入知识星球获取
    whisper-large-v3ChineseWenetSpeech0.049470.107110.174290.60919加入知识星球获取
    1. 微调其他语言数据集后字错率测试表。
    使用模型实际语言指定语言数据集测试集模型获取
    whisper-tiny维吾尔语ChineseCommonVoice-Uyghur + THUYG200.06798加入知识星球获取
    whisper-base维吾尔语ChineseCommonVoice-Uyghur + THUYG200.04690加入知识星球获取
    whisper-small维吾尔语ChineseCommonVoice-Uyghur + THUYG200.02855加入知识星球获取
    whisper-medium维吾尔语ChineseCommonVoice-Uyghur + THUYG200.01669加入知识星球获取
    whisper-large-v2维吾尔语ChineseCommonVoice-Uyghur + THUYG200.01480加入知识星球获取
    whisper-large-v3-turbo维吾尔语ChineseCommonVoice-Uyghur + THUYG200.01744加入知识星球获取

    说明:

    1. 测试过指定语音为Chinese和uzbek,训练tiny模型的字错率分别是:0.06798和0.0685,它们差距不大,所上面使用都是指定语言为Chinese。

    2. 使用CommonVoice-Uyghur的测试集作为本项目测试集,其余的和THUYG20全部作为训练集。

    3. 推理速度测试表,使用GPU为GTX3090(24G),音频为test_long.wav,时长为3分钟整,测试程序在tools/run_compute.sh。

    加速方式tinybasesmallmediumlarge-v2large-v3large-v3-turbo
    Transformers (fp16 + batch_size=16)1.458s1.671s2.331s11.071s4.779s12.826s1.594s
    Transformers (fp16 + batch_size=16 + Compile)1.477s1.675s2.357s11.003s4.799s12.643s1.581s
    Transformers (fp16 + batch_size=16 + BetterTransformer)1.461s1.676s2.301s11.062s4.608s12.505s1.809s
    Transformers (fp16 + batch_size=16 + Flash Attention 2)1.436s1.630s2.258s10.533s4.344s11.651s1.651s
    Transformers (fp16 + batch_size=16 + Compile + BetterTransformer)1.442s1.686s2.277s11.000s4.543s12.592s1.816s
    Transformers (fp16 + batch_size=16 + Compile + Flash Attention 2)1.409s1.643s2.220s10.390s4.377s11.703s1.657s
    Faster Whisper (fp16 + beam_size=1 )2.179s1.492s2.327s3.752s5.677s31.541s/
    Faster Whisper (8-bit + beam_size=1 )2.609s1.728s2.744s4.688s6.571s29.307s/
    1. 经过处理的数据列表。
    数据列表处理方式AiShellWenetSpeech
    添加标点符号加入知识星球获取加入知识星球获取
    添加标点符号和时间戳加入知识星球获取加入知识星球获取

    重要说明:

    1. 在评估的时候移除模型输出的标点符号,并把繁体中文转成简体中文。
    2. aishell_test为AIShell的测试集,test_net和test_meeting为WenetSpeech的测试集。
    3. 测试速度的音频为dataset/test_long.wav,时长为3分钟整。
    4. 训练数据使用的是带标点符号的数据,字错率高一点。
    5. 微调AiShell数据不带时间戳,微调WenetSpeech带时间戳。

    安装环境

    1. 首先安装的是Pytorch的GPU版本,如果已经安装过了,请跳过。
    pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu128
    
    1. 安装所需的依赖库。
    python -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    准备数据

    训练的数据集如下,是一个jsonlines的数据列表,也就是每一行都是一个JSON数据,数据格式如下。本项目提供了一个制作AIShell数据集的程序aishell.py,执行这个程序可以自动下载并生成如下列格式的训练集和测试集,注意: 这个程序可以通过指定AIShell的压缩文件来跳过下载过程的,如果直接下载会非常慢,可以使用一些如迅雷等下载器下载该数据集,然后通过参数--filepath指定下载的压缩文件路径,如/home/test/data_aishell.tgz。

    小提示:

    1. 如果不使用时间戳训练,可以不包含sentences字段的数据。
    2. 如果只有一种语言的数据,可以不包含language字段数据。
    3. 如果训练空语音数据,sentences字段为[],sentence字段为"",language字段可以不存在。
    4. 数据可以不包含标点符号,但微调的模型会损失添加符号能力。
    {
       "audio": {
          "path": "dataset/0.wav"
       },
       "sentence": "近几年,不但我用书给女儿压岁,也劝说亲朋不要给女儿压岁钱,而改送压岁书。",
       "language": "Chinese",
       "sentences": [
          {
             "start": 0,
             "end": 1.4,
             "text": "近几年,"
          },
          {
             "start": 1.42,
             "end": 8.4,
             "text": "不但我用书给女儿压岁,也劝说亲朋不要给女儿压岁钱,而改送压岁书。"
          }
       ],
       "duration": 7.37
    }
    

    微调模型

    准备好数据之后,就可以开始微调模型了。训练最重要的两个参数分别是,--base_model指定微调的Whisper模型,这个参数值需要在HuggingFace存在的,这个不需要提前下载,启动训练时可以自动下载,当然也可以提前下载,那么--base_model指定就是路径,同时--local_files_only设置为True。第二个--output_path是是训练时保存的Lora检查点路径,因为我们使用Lora来微调模型。如果想存足够的话,最好将--use_8bit设置为False,这样训练速度快很多。其他更多的参数请查看这个程序。

    单卡训练

    单卡训练命令如下,Windows系统可以不添加CUDA_VISIBLE_DEVICES参数。

    CUDA_VISIBLE_DEVICES=0 python finetune.py --base_model=openai/whisper-tiny --output_dir=output/
    

    多卡训练

    多卡训练有两种方法,分别是torchrun和accelerate,开发者可以根据自己的习惯使用对应的方式。

    1. 使用torchrun启动多卡训练,命令如下,通过--nproc_per_node指定使用的显卡数量。
    torchrun --nproc_per_node=2 finetune.py --base_model=openai/whisper-tiny --output_dir=output/
    
    1. 使用accelerate启动多卡训练,如果是第一次使用accelerate,要配置训练参数,方式如下。

    首先配置训练参数,过程是让开发者回答几个问题,基本都是默认就可以,但有几个参数需要看实际情况设置。

    accelerate config
    

    大概过程就是这样:

    --------------------------------------------------------------------In which compute environment are you running?
    This machine
    --------------------------------------------------------------------Which type of machine are you using?
    multi-GPU
    How many different machines will you use (use more than 1 for multi-node training)? [1]:
    Do you wish to optimize your script with torch dynamo?[yes/NO]:
    Do you want to use DeepSpeed? [yes/NO]:
    Do you want to use FullyShardedDataParallel? [yes/NO]:
    Do you want to use Megatron-LM ? [yes/NO]: 
    How many GPU(s) should be used for distributed training? [1]:2
    What GPU(s) (by id) should be used for training on this machine as a comma-seperated list? [all]:
    --------------------------------------------------------------------Do you wish to use FP16 or BF16 (mixed precision)?
    fp16
    accelerate configuration saved at /home/test/.cache/huggingface/accelerate/default_config.yaml
    

    配置完成之后,可以使用以下命令查看配置。

    accelerate env
    

    开始训练命令如下。

    accelerate launch finetune.py --base_model=openai/whisper-tiny --output_dir=output/
    

    输出日志如下:

    {'loss': 0.9098, 'learning_rate': 0.000999046843662503, 'epoch': 0.01}                                                     
    {'loss': 0.5898, 'learning_rate': 0.0009970611012927184, 'epoch': 0.01}                                                    
    {'loss': 0.5583, 'learning_rate': 0.0009950753589229333, 'epoch': 0.02}                                                  
    {'loss': 0.5469, 'learning_rate': 0.0009930896165531485, 'epoch': 0.02}                                          
    {'loss': 0.5959, 'learning_rate': 0.0009911038741833634, 'epoch': 0.03}
    

    合并模型

    微调完成之后会有两个模型,第一个是Whisper基础模型,第二个是Lora模型,需要把这两个模型合并之后才能之后的操作。这个程序只需要传递两个参数,--lora_model指定的是训练结束后保存的Lora模型路径,其实就是检查点文件夹路径,第二个--output_dir是合并后模型的保存目录。

    python merge_lora.py --lora_model=output/whisper-tiny/checkpoint-best/ --output_dir=models/
    

    评估模型

    执行以下程序进行评估模型,最重要的两个参数分别是。第一个--model_path指定的是合并后的模型路径,同时也支持直接使用Whisper原模型,例如直接指定openai/whisper-large-v2,第二个是--metric指定的是评估方法,例如有字错率cer和词错率wer。提示: 没有微调的模型,可能输出带有标点符号,影响准确率。其他更多的参数请查看这个程序。

    python evaluation.py --model_path=models/whisper-tiny-finetune --metric=cer
    

    预测

    执行以下程序进行语音识别,这个使用transformers直接调用微调后的模型或者Whisper原模型预测,支持Pytorch2.0的编译器加速、FlashAttention2加速、BetterTransformer加速。第一个--audio_path参数指定的是要预测的音频路径。第二个--model_path指定的是合并后的模型路径,同时也支持直接使用Whisper原模型,例如直接指定openai/whisper-large-v2。其他更多的参数请查看这个程序。

    python infer.py --audio_path=dataset/test.wav --model_path=models/whisper-tiny-finetune
    

    GUI界面预测

    --model_path指定Transformers模型。其他更多的参数请查看这个程序。

    python infer_gui.py --model_path=models/whisper-tiny-finetune
    

    启动后界面如下:

    Web部署

    --host指定服务启动的地址,这里设置为0.0.0.0,即任何地址都可以访问。--port指定使用的端口号。--model_path指定的Transformers模型。--num_workers指定是使用多少个线程并发推理,这在Web部署上很重要,当有多个并发访问是可以同时推理。其他更多的参数请查看这个程序。

    python infer_server.py --host=0.0.0.0 --port=5000 --model_path=models/whisper-tiny-finetune --num_workers=2
    

    接口文档

    目前提供识别接口/recognition,接口参数如下。

    字段是否必须类型默认值说明
    audio是File要识别的音频文件
    to_simple否int1是否繁体转简体
    remove_pun否int0是否移除标点符号
    task否Stringtranscribe识别任务类型,支持transcribe和translate
    language否Stringzh设置语言,简写,如果为None则自动检测语言

    返回结果:

    字段类型说明
    resultslist分割的识别结果
    +resultstr每片分隔的文本结果
    +startint每片分隔的开始时间,单位秒
    +endint每片分隔的结束时间,单位秒
    codeint错误码,0即为成功识别

    示例如下:

    {
      "results": [
        {
          "result": "近几年,不但我用书给女儿压碎,也全说亲朋不要给女儿压碎钱,而改送压碎书。",
          "start": 0,
          "end": 8
        }
      ],
      "code": 0
    }
    

    为了方便理解,这里提供了调用Web接口的Python代码,下面的是/recognition的调用方式。

    import requests
    
    response = requests.post(url="http://127.0.0.1:5000/recognition", 
                             files=[("audio", ("test.wav", open("dataset/test.wav", 'rb'), 'audio/wav'))],
                             json={"to_simple": 1, "remove_pun": 0, "language": "zh", "task": "transcribe"}, timeout=20)
    print(response.text)
    

    提供的测试页面如下:

    首页http://127.0.0.1:5000/ 的页面如下:

    文档页面http://127.0.0.1:5000/docs 的页面如下:

    使用Ctranslate2格式模型预测

    这里提供了一个CTranslate2加速的方式,尽管使用Transformers的pipeline推理速度已经很快了,首先要转换模型,把合并后的模型转换为CTranslate2模型。如下命令,--model参数指定的是合并后的模型路径,同时也支持直接使用Whisper原模型,例如直接指定openai/whisper-large-v2。--output_dir参数指定的是转换后的CTranslate2模型路径,--quantization参数指定的是量化模型大小,不希望量化模型的可以直接去掉这个参数。

    ct2-transformers-converter --model models/whisper-tiny-finetune --output_dir models/whisper-tiny-finetune-ct2 --copy_files tokenizer.json preprocessor_config.json --quantization float16
    

    执行以下程序进行语音识别,--audio_path参数指定的是要预测的音频路径。--model_path指定的是转换后的CTranslate2模型。其他更多的参数请查看这个程序。

    python infer_ct2.py --audio_path=dataset/test.wav --model_path=models/whisper-tiny-finetune-ct2
    

    输出结果如下:

    -----------  Configuration Arguments -----------
    audio_path: dataset/test.wav
    model_path: models/whisper-tiny-finetune-ct2
    language: zh
    use_gpu: True
    use_int8: False
    beam_size: 10
    num_workers: 1
    vad_filter: False
    local_files_only: True
    ------------------------------------------------
    [0.0 - 8.0]:近几年,不但我用书给女儿压碎,也全说亲朋不要给女儿压碎钱,而改送压碎书。
    

    Android部署

    安装部署的源码在AndroidDemo目录下,具体文档可以到该目录下的README.md查看。

    Windows桌面应用

    程序在WhisperDesktop目录下,具体文档可以到该目录下的README.md查看。

    打赏作者

    参考资料

    1. https://github.com/huggingface/peft
    2. https://github.com/guillaumekln/faster-whisper
    3. https://github.com/ggerganov/whisper.cpp
    4. https://github.com/Const-me/Whisper