0. 简介
最近快到1024程序员节了,再给大家上点干活。Whisper是openai开源的一个语音转文字模型。也是现在识别效果最好的离线数据模型,但是我们发现我们在完成一些中英文或者专业术语对话的时候。这时候表现的效果就比较差了。而这一步就得用微调的方式来完成对这些特定词语进行修正了。这里最近受到优刻得的使用邀请,正好解决了我在大模型和自动驾驶行业对GPU的使用需求。UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU,按时收费每卡2.08元,月卡只需要1.36元每小时,并附带200G的免费磁盘空间。暂时已经满足我的使用需求了,同时支持访问加速,独立IP等功能,能够更快的完成项目搭建。同时我们也开源了我们的代码:https://github.com/lovelyyoshino/Whisper_finetuning

在1024程序员节,优刻得发了专属的算力金,注册点击上方的链接即可获得,可以说填写一个问卷就可以白嫖了

1. Whisper在Windows中安装----这里有人写过了,我们就不再重复;可以参考OpenAI开源语音识别模型Whisper在Windows系统的安装详细过程这个文章
1.1 安装Python
Python的安装很简单,点击这里进行下载。
安装完成之后,输入python -V可以看到版本信息,说明已经安装成功了。

如果输入python -V命令没有看到上面的这样的信息,要么是安装失败,要么是安装好之后没有自动配置环境变量,如何配置环境变量可以从网上搜索。
Python的具体安装过程可以参考这篇文章。
1.2 安装FFmpeg
ffmpeg是专门做音视频处理用的软件,并且是开源的,点击这里进行下载
安装过程也是十分的简单,具体安装过程可以到网上搜索,因为我这里已经安装过了,所以没办法重新演示安装过程。
这里需要注意,我们安装完成之后还需要配置环境变量。
1.3 配置环境变量
如何配置环境变量,这里以Windows 11为例。
首先右击桌面上的"此电脑",然后点击"属性",然后点击"高级系统设置",然后点击"环境变量",然后点击"系统变量"中的"Path",然后双击"Path"进入到设置"Path"窗口,然后点击"新建",然后把你安装FFmpeg的位置写上,注意写到bin目录,最后记得点击"确定"。

1.4 安装显卡驱动
如过你没有独立显卡,那么可以跳过这步。如果你使用的是AMD显卡,那你也可以跳过这步了。
这里我以NVIDIA显卡为例。
我自己电脑上的显卡是NVIDIA MX150 2GB显卡,所以我们安装驱动的时候也要选择与自己显卡类型一致的驱动。

选择完成之后,点击"搜索"按钮,就可以看到有哪些可以下载的显卡驱动了,最后点击下载。
下载到本地之后,运行安装程序即可。
1.5 安装CUDA
安装完显卡驱动之后,我们打开显卡控制面板,找到显卡的信息,查看你显卡支持的CUDA版本。

可以看到我这里是12.1版本。
然后我们可以去官网下载对应版本的CUDA了,点击这里去下载

你要根据自己使用的系统来选择。

下载完成之后,直接双击运行即可。
这里比较大,为了下载更快,我使用了多线程下载器IDM。
这里再提一句,我们一定要下载对应版本的CUDA。
运行之后,可以选择自己安装的位置。

选择自定义安装,然后把前面两个勾选上。

然后是选择安装的位置。

然后你可能会安装失败。
我在安装过程中就有一个没有安装成功,我们可以不管它。
我们打开cmd命令行窗口,然后输入nvcc --version回车之后看到下面这些信息,说明安装成功了。

如果你们不懂,可以看参考文章。
如果有需要的话,最好还要安装一下cuDNN。这里我就不安装了。具体可以参考这篇文章。
1.6 安装PyTorch
简介:PyTorch是一个开源的Python机器学习库,其前身是著名的机器学习库Torch。2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch,它是一个面向Python语言的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络,这是很多主流深度学习框架比如Tensorflow等都不支持的。PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用。作为经典机器学习库Torch的端口,PyTorch 为 Python 语言使用者提供了舒适的深度学习开发选择。
这里说明一下,下载的PyTorch要与CUDA的版本一致,我这里使用的CUDA版本是12.1,但是我在官方PyTorch中没有找到该版本的下载命令。然后我是从网上找到一个命令安装了PyTorch。
            
            
              bash
              
              
            
          
          pip --trusted-host pypi.tuna.tsinghua.edu.cn install torch==1.10.1+cu102 torchvision==0.11.2+cu102 torchaudio==0.10.1 -f https://download.pytorch.org/whl/torch_stable.html
        安装完成之后可以进入python环境,如果输入import torch没有报错,说明就可以了。
            
            
              python
              
              
            
          
          import torch
print(torch.__version__)
print(torch.cuda.is_available())
        
不过这里还是推荐大家下载与自己CUDA对应的版本。
1.7 安装whisper
安装whisper很简单,直接用一条命令即可。
            
            
              bash
              
              
            
          
          pip install -U openai-whisper
        不过使用这条命令安装会很慢,我们可以使用清华镜像。
            
            
              bash
              
              
            
          
          pip install -U openai-whisper -i https://pypi.tuna.tsinghua.edu.cn/simple
        1.8 whisper的使用
安装好后,我们使用下面的命令可以查看whisper如何使用。
            
            
              bash
              
              
            
          
          whisper -h
        我们现在就可以使用whisper来语音识别了。
            
            
              bash
              
              
            
          
          whisper test.mp3 --model small --language Chinese
        这里我们使用small模型,语言是中文,这样我们就可以把test.mp3音频文件转为文本并输出了。
我们可以指定输出的格式,默认是输出所有格式文件。
            
            
              bash
              
              
            
          
          --output_format {txt,vtt,srt,tsv,json,all}
        我们也可以直接传入视频来识别音频生成文件。
            
            
              bash
              
              
            
          
          whisper test.mp4 --model small --output_format srt --language Chinese
        如果你的显存不过用会报下面的错误。
            
            
              bash
              
              
            
          
          RuntimeError: CUDA out of memory. Tried to allocate 226.00 MiB (GPU 0; 2.00 GiB total capacity;
1.34 GiB already allocated; 0 bytes free; 1.60 GiB reserved in total by PyTorch) If reserved 
memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  
See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
        这个时候我们不要慌,我们还可以使用CPU,默认是使用GPU的,我们可以通过参数--device来指定使用CPU进行运算。
            
            
              bash
              
              
            
          
          whisper test.mp4 --model small --output_format srt --device cpu --language Chinese
        我们可以省略--language Chinese,这个时候可以自动识别出你音频的语言。
当我们使用CPU运算时,我们还可以指定使用的线程数量。
            
            
              bash
              
              
            
          
          whisper test.mp4 --model small --output_format srt --device cpu --language Chinese --threads 8
        2. 训练自己的数据
首先我们原始的数据模型在huggingface中,这就需要使用git将大文件都下载下来,这里就需要安装lfs
            
            
              bash
              
              
            
          
          apt install git-lfs
        然后按照下面的流程执行
2.1 安装
- 克隆此代码
 
            
            
              bash
              
              
            
          
          git clone https://github.com/lovelyyoshino/Whisper_finetuning.git
        - 安装Conda请参考 https://docs.conda.io/en/latest/miniconda.html
 - 创建Conda环境
 
            
            
              bash
              
              
            
          
          conda create -n whisper python=3.8
conda activate whisper
        - 配置环境 - 有一个命令会运行很久,中途可能会断掉,请多尝试
 
            
            
              bash
              
              
            
          
          bash set_env.sh
        - 下载Whisper_large_v2模型(大概需要一晚上)
 
            
            
              bash
              
              
            
          
          git clone https://huggingface.co/openai/whisper-large-v2
cd whisper-large-v2
git lfs fetch
git lfs checkout
        PS
- 也可以用Whisper_Tiny模型做尝试
 
            
            
              bash
              
              
            
          
          git clone https://huggingface.co/openai/whisper-tiny
cd whisper-base
git lfs fetch
git lfs checkout
        2.2 案例1:在Whisper上同时微调转录与翻译任务
            
            
              bash
              
              
            
          
          cp -r whisper example/aishell-sample/
cd example/aishell-sample
        2.2.1 数据准备
- 转录数据,参考data/transcribe/{wav.scp,text}
 - 翻译数据,参考data/translate/{wav.scp,text} wav.scp
id | language | task -> /absolute/path/to/wav
text
id | language | task -> label
 
| id | 语种 | 任务类型 | 
|---|---|---|
| BAC009S0150W0001 | chinese | translate | 
| BAC009S0150W0001 | chinese | transcribe | 
            
            
              bash
              
              
            
          
          # 模型总共训练数据 - 将翻译和转录的数据合并为一个整体
cat data/transcribe/wav.scp data/translate/wav.scp > data/wav.scp
cat data/transcribe/text data/translate/text > data/text
        
2.2.2 更改配置
修改 config/whisper_multitask.yaml
            
            
              yaml
              
              
            
          
          data:
  train:
    wav_scp: "训练数据wav.scp的绝对路径"
    text: "训练数据text的绝对路径"
  test:
    wav_scp: "测试数据wav.scp的绝对路径"
    text: 测试数据text的绝对路径"
predict:
  model_path: "自己微调之后的模型位置"
  result_file: "结果保存的绝对路径"
  eval: 
    wav_scp: "验证数据wav.scp的绝对路径"
    text: "验证数据text的绝对路径"
dev_env:
  ori_model_path: "原始模型路径"
  ctranslate_model_path: "ctranslate转后的模型"
  conf:
    device: "cpu"
    compute_type: "float32"
  result_file: "结果保存的绝对路径"
  dev:
    wav_scp: "测试数据wav.scp的绝对路径"
    text: "测试数据text的绝对路径"
model:
  model_path: "自己的whisper_large_v2或者base模型路径"
  is_large_model: "如果是whisper_large_v2模型则设置为True否则为False"
  data_collator:
    forward_attention_mask: False
  model_train_argv:
    out_model_path: "模型保存的路径"
    resume_from_checkpoint : ""
    per_device_train_batch_size: 1
    per_device_eval_batch_size: 1
    gradient_accumulation_steps: 1
    num_train_epochs: 1
    learning_rate: 0.0001
    logging_steps: 2
    fp16: False
    warmup_steps: 50
    evaluation_strategy: "epoch"
    generation_max_length: 128
    remove_unused_columns: False
    label_names:
      - labels
        2.3 训练模型
更改代码中配置文件路径
            
            
              bash
              
              
            
          
          python3 train.py
        2.4 测试模型
更改代码中配置文件路径
            
            
              bash
              
              
            
          
          python3 predict.py
        2.5 使用CTranslate2进行模型加速
            
            
              python
              
              
            
          
          from whisper.utils.common_utils import convert_finetuning_peft_model_into_whisper
log_info("Lora参数融入Whsiper")
convert_finetuning_peft_model_into_whisper(
  # 微调后的peft模型路径
  peft_model_path=config['predict']['model_path'],
  # 原始whisper模型路径
  whisper_model_path=config['dev_env']['ori_model_path'],
  # 可以使用ctranslate加速后的模型位置
  out_ctranslate_path = config['dev_env']['ctranslate_model_path']
)
        2.6 Whipser使用
读取对应的pt文件,与原来的文件进行对比
            
            
              bash
              
              
            
          
          python whipser_demo.py
        