HuggingFace镜像/Wenet_Conformer_for_Pytorch
模型介绍文件和版本分析
下载使用量0

Wenet Conformer for PyTorch

  • 简介
    • 模型介绍
    • 支持特性
    • 代码实现
  • Wenet-Conformer
    • 准备训练环境
    • 准备数据集
    • 开始训练
    • 训练结果展示
  • 公网地址说明
  • 变更说明
  • FAQ

简介

模型介绍

Wenet是一款开源的、面向工业落地应用的语音识别工具包,主要特点是小而精,它不仅采用了现阶段最先进的网络设计Conformer,还用到了U2结构实现流式与非流式框架的统一。

支持特性

本仓已支持以下模型任务类型。

模型任务类型是否支持
Conformer预训练✅
Whisper预训练✅

代码实现

  • 参考实现:

    url=https://github.com/wenet-e2e/wenet.git
    commit_id=ac9a2612e8245ac473a17f64eea600dd7afbeb20
  • 适配昇腾 AI 处理器的实现:

    url=https://gitee.com/ascend/ModelZoo-PyTorch.git
    code_path=PyTorch/built-in/audio

Wenet-Conformer

准备训练环境

安装模型环境

当前模型支持的 PyTorch 版本和已知三方库依赖如下表所示。

表 1 版本支持表

Torch_Version三方库依赖版本
PyTorch 1.11torch_audio==0.11.0
PyTorch 2.1torch_audio==2.1.0
  • 环境准备指导。

    请参考《Pytorch框架训练环境准备》。

  • 安装依赖。

    在模型源码包根目录下执行命令。

    # PyTorch 1.11请使用requirements_1_11.txt,PyTorch 2.1请使用requirements_2_1.txt
    pip install -r requirements_1_11.txt
  • 编译安装torchaudio

    在官网根据PyTorch版本获取torchaudio对应版本,解压至torchaudio文件夹,运行以下命令

    cd torchaudio
    python setup.py develop

准备数据集

  1. 获取数据集。

    用户自行下载 aishell-1 数据集,并将下载好的数据集放置服务器的任意目录下。该数据集包含由 400 位说话人录制的超过 170 小时的语音。数据集目录结构参考如下所示。

     aishell-1
        ├── data_aishell.tgz
        |
        └── resource_aishell.tgz

    说明: 该数据集的训练过程脚本只作为一种参考示例。

开始训练

训练模型

  1. 进入解压后的源码包根目录。

    cd /${模型文件夹名称} 
  2. 运行训练脚本。

    该模型支持单机8卡训练。

    • 单机8卡训练

      cd examples/aishell/s0/test
      bash train_full_8p.sh --stage=起始stage --stop_stage=终止stage --data_path=/data/xxx/  # 8卡精度
      bash train_performance_8p.sh --data_path=/data/xxx/  # 8卡性能
      bash train_full_8p_whisper.sh --stage=起始stage --stop_stage=终止stage --data_path=/data/xxx/  # 裁剪了CNN Module的8卡精度、性能

    模型训练脚本参数说明如下。

    --stage              //模型训练的起始阶段,默认为-1,即从数据下载开始启动训练。若之前数据下载、准备、特征生成等阶段已完成,可配置--stage=4开始训练。
    --stop_stage         //模型训练的终止阶段
    --data_path          //数据集路径

    说明:

    --stage <-1 ~ 5>、--stop_stage <-1 ~ 5>:控制模型训练的起始、终止阶段。模型包含 -1 ~ 5 训练阶段,其中 -1 ~ 3 为数据下载、准备、特征生成等阶段,4为模型训练,5为ASR任务评估。首次运行时请从 -1 开始,-1 ~ 3 阶段执行过一次之后,后续可以从stage 4 开始训练。

    --data_path参数填写数据集路径,需要写到数据集的一级目录。

    训练完成后,权重文件保存在当前路径下,并输出模型训练精度和性能信息。

训练结果展示

表 2 conformer训练结果展示表

NAMEErrorFPS(iters/sec)EpochsAMP_TypeTorch_Version
8p-GPU-800.4415fp321.11
8p-Atlas A2-526.3415fp321.11
8p-GPU-958.9815fp322.1
8p-Atlas A2-830.4915fp322.1

表 3 whisper训练结果展示表

NAMEErrorFPS(iters/sec)EpochsAMP_TypeTorch_Version
8p-GPU-746.3915fp321.11
8p-Atlas A2-667.6215fp321.11
8p-GPU-748.8515fp322.1
8p-Atlas A2-789.3115fp322.1

表 4 conformer result

  • Feature info: using fbank feature, dither, cmvn, online speed perturb
  • Training info: lr 0.002, batch size 18, 4 gpu, acc_grad 4, 240 epochs, dither 0.1
  • Decoding info: ctc_weight 0.5, average_num 20
decoding modeWER
ctc greedy search4.96

公网地址说明

代码涉及公网地址参考public_address_statement.md

变更说明

2023.09.01:首次发布。

2024.03.16: 增加PyTorch2.1基线,增加FAQ。

FAQ

Q1:Pytorch2.1版本,运行时可能出现段错误

A1:问题原因是Pytorch与torchaudio版本不匹配,需要手动编译安装torchaudio,并在编译时设置变量 BUILD_SOX=0

同时对模型内部分相关代码进行修改:

1). 在tools/compute_cmvn_stats.py中修改:

# 1. 找到:
torchaudio.set_audio_backend("sox_io")
# 修改为:
# torchaudio.set_audio_backend("sox_io")

# 2. 找到:
sample_rate = torchaudio.backend.sox_io_backend.info(wav_path).sample_rate
# 修改为:
sample_rate = torchaudio.info(wav_path).sample_rate

# 3. 找到:
waveform, sample_rate = torchaudio.backend.sox_io_backend.load(
                  filepath=wav_path,
                  num_frames=end_frame - start_frame,
                  frame_offset=start_frame)
# 修改为:
waveform, sample_rate = torchaudio.load(
                  filepath=wav_path,
                  num_frames=end_frame - start_frame,
                  frame_offset=start_frame)

2). 在tools/make_shard_list.py中修改:

# 1. 找到:
import torchaudio.backend.sox_io_backend as sox
# 修改为:
# import torchaudio.backend.sox_io_backend as sox

# 2. 找到:
waveforms, sample_rate = sox.load(wav, normalize=False)
# 修改为:
waveforms, sample_rate = torchaudio.load(wav, normalize=False)

# 3. 找到:
sox.save(f, audio, resample, format="wav", bits_per_sample=16)
# 修改为:
torchaudio.save(f, audio, resample, format="wav", bits_per_sample=16)

2). 在wenet/dataset/processor.py中修改:

# 1. 找到:
torchaudio.utils.sox_utils.set_buffer_size(16500)
# 修改为:
# torchaudio.utils.sox_utils.set_buffer_size(16500)

# 2. 找到:
sample_rate = torchaudio.backend.sox_io_backend.info(
                  wav_file).sample_rate
# 修改为:
sample_rate = torchaudio.info(
                  wav_file).sample_rate

# 3. 找到:
waveform, _ = torchaudio.backend.sox_io_backend.load(
                  filepath=wav_file,
                  num_frames=end_frame - start_frame,
                  frame_offset=start_frame)
# 修改为:
waveform, _ = torchaudio.load(
                  filepath=wav_file,
                  num_frames=end_frame - start_frame,
                  frame_offset=start_frame)

# 4. 找到:
        if speed != 1.0:
          wav, _ = torchaudio.sox_effects.apply_effects_tensor(
              waveform, sample_rate,
              [['speed', str(speed)], ['rate', str(sample_rate)]])
          sample['wav'] = wav
# 修改为:
        # if speed != 1.0:
        #   wav, _ = torchaudio.sox_effects.apply_effects_tensor(
        #       waveform, sample_rate,
        #       [['speed', str(speed)], ['rate', str(sample_rate)]])
        #   sample['wav'] = wav