在3090卡服务器上面进行funasr模型微调

news/2024/7/22 0:45:53/文章来源:https://blog.csdn.net/happyweb/article/details/139207333

文本记录了在3090卡上对实时asr模型进行微调的过程,包括数据准备、模型微调、验证微调后的模型。

一、参考文档:

https://github.com/alibaba-damo-academy/FunASR/blob/main/examples/industrial_data_pretraining/paraformer_streaming/README_zh.md

二、数据准备
    数据格式:https://github.com/alibaba-damo-academy/FunASR/tree/main/data/list
    wav文件为16KHz,16位的单声道音频数据。6秒到10秒之间的时长。
    编写utf-8格式的csv文件,第一列为音频文件路径名,第二列为对应的音频文本。第一行为头部标签(Audio:FILE,Text:LABEL)。
    具体参见 下面数据集中的speech_asr_aishell_testsets.csv文件。
    
    train_wav.scp 和 train_text.txt 生成 train.jsonl
    val_wav.scp 和 val_text.txt 生成 val.jsonl
    
    数据集:https://www.modelscope.cn/datasets/speech_asr/speech_asr_aishell1_trainsets/summary

   data_process.py的源码如下:

import os
import csv
import sys
import shutil   # 拷贝文件# type    要处理的数据集类型,可以是train,val,test,分别代表训练、验证、测试集
# max_num 最大数据条数,如果为0则无限制
# csv_file csv的文件路径名
# output_path .scp和text及wav文件输出目录
# wav_parent_path wan文件最终的输出父目录,比如最终微调的时候放到/home/data/目录下
def process_data(type, max_num, csv_file, output_path, wav_parent_path=''):if type != "train" and type != "val" and type != "test":print("type is invalid,train or val or test is valid data")return# 根据csv文件获取wav文件所在的目录data_path = os.path.dirname(csv_file)#写train_wav.scpwav_path = os.path.join(output_path,f"{type}_wav.scp")wav_file = open(wav_path, 'w', encoding='utf-8')#写train_text.txttext_path = os.path.join(output_path,f"{type}_text.txt")text_file = open(text_path, 'w', encoding='utf-8')# 以UTF-8编码打开CSV文件with open(csv_file, mode='r', encoding='utf-8', newline='') as csvfile:# 创建csv.reader对象reader = csv.reader(csvfile)# 读取标题行headers = next(reader)print(headers)# 读取每一行index = 0for row in reader:print(row)index += 1audio_file = row[0]text = row[1].replace(" ","")file_name_with_extension = os.path.basename(audio_file)file_name_without_extension, _ = os.path.splitext(file_name_with_extension)directory = os.path.dirname(audio_file)wav_output_dir = os.path.join(output_path, directory)# 检查目录是否存在if not os.path.exists(wav_output_dir):# 如果目录不存在,则创建目录os.makedirs(wav_output_dir)#将wav文件拷贝到输出目录src_path = os.path.join(data_path,audio_file)dest_path = os.path.join(output_path,audio_file)shutil.copyfile(src_path, dest_path)# 将wav的实际保存路径格式化为linux格式,因为最终微调都是在linux系统下if wav_parent_path.endswith("/"):audio_file = f"{wav_parent_path}{audio_file}"else:audio_file = f"{wav_parent_path}/{audio_file}"wav_file.write(f"{file_name_without_extension} {audio_file}\n")text_file.write(f"{file_name_without_extension} {text}\n")if max_num>0 and index >= max_num:breakwav_file.close()text_file.close()if __name__ == "__main__":process_data("train",20000, "./data/speech_asr_aishell_trainsets.csv", "./data/list/",'/home/data/asr_finetune')process_data("val", 10000, "./data/speech_asr_aishell_devsets.csv", "./data/list/",'/home/data/asr_finetune')#process_data("test", 5000, "./data/speech_asr_aishell_testsets.csv", "./data/list/",'/home/data/')

    执行python data_process.py 处理数据,就是生成train_wav.scp,train_text.txt和val_wav.scp 和 val_text.txt及test_wav.scp 和 test_text.txt。
    同时有wav文件目录:speech_asr_aishell_trainsets及speech_asr_aishell_devsets,其保存的是wav音频文件。
    将生成的speech_asr_aishell_trainsets及speech_asr_aishell_devsets 拷贝/home/data/asr_finetune/目录下
    
    测试数据集可以不用,不涉及微调。
    
    .scp中的wav文件路径改成绝对路径,这样不容易出错。

三、微调
    conda activate funasr
    conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia  
    pip install -U funasr
    pip install -U modelscope
    
    pip install chardet
    
    # 下载模型
    cd /home/data/model
    git clone https://www.modelscope.cn/iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online.git
    
    # 下载源码
    cd /home/data/asr_finetune
    git clone https://github.com/alibaba-damo-academy/FunASR.git
    
    数据放到/home/data/asr_finetune/FunASR/data/list目录下面。
    
    cd /home/data/asr_finetune/FunASR/examples/industrial_data_pretraining/paraformer_streaming
    修改finetune.sh: 
      model_name_or_model_dir="/home/data/model/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online"
      修改++dataset_conf.batch_size=2000,原来为20000,否则在2卡的3090服务器上面会提示cuda 显存不足。改完后2块卡各6.8G
      根据情况修改max_epoch为实际期望的轮次。
    
    确保模型存在,且路径正确,数据路径都正确。
    
    bash finetune.sh
    # "log_file: ./outputs/log.txt
    如果去掉最后面那一行的 &> ${log_file},可以输出信息到屏幕。
         
    ls ./outputs/
    下面存在 config.yaml model.pt model.pt.ep1 model.pt.ep1.2000 等文件
    
    微调后生成的模型文件在: /home/data/asr_finetune/FunASR/examples/industrial_data_pretraining/paraformer_streaming/outputs
    cd /home/data/asr_finetune/FunASR/examples/industrial_data_pretraining/paraformer_streaming/outputs

四、验证微调后的模型
    
  (1).有configuration.json
    假定,训练模型路径为:./model_dir,如果改目录下有生成configuration.json,只需要将 上述模型推理方法 中模型名字修改为模型路径即可

    例如:
    (1.1)从shell推理
      python -m funasr.bin.inference ++model="./model_dir" ++input=="${input}" ++output_dir="${output_dir}"
    
    (1.2)从python推理
      from funasr import AutoModel
      model = AutoModel(model="./model_dir")
      res = model.generate(input=wav_file)
      print(res)
  
  (2)无configuration.json时
    (2.1)方法一、利用原来模型的配置文件
      # 将原来的模型拷贝一份,然后替换model.pt为刚微调的模型文件,其它配置文件还是用原来的
      cp -r /home/data/model/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online/ /home/data/model/test_finetune_asr_model/
      cp model.pt /home/data/model/test_finetune_asr_model/
      
      或者拷贝其它的模型文件也可以:
      cp model.pt.ep3.2000 /home/data/model/test_finetune_asr_model/model.pt
      
      # 推理,验证微调后的模型
      cd /home/data/asr_finetune/
      python asr_infere.py
      asr_infere.py的源码如下:

     

# pip install soundfile
# pip install -U funasr
# #pip install -U modelscopefrom funasr import AutoModelchunk_size = [0, 10, 5] #[0, 10, 5] 600ms, [0, 8, 4] 480ms
encoder_chunk_look_back = 4 #number of chunks to lookback for encoder self-attention
decoder_chunk_look_back = 1 #number of encoder chunks to lookback for decoder cross-attentionmodel = AutoModel(model="/home/data/model/test_finetune_asr_model")import soundfile
import oswav_file = "BAC009S0764W0121.wav"
speech, sample_rate = soundfile.read(wav_file)
chunk_stride = chunk_size[1] * 960 # 600mscache = {}
total_chunk_num = int(len((speech)-1)/chunk_stride+1)
for i in range(total_chunk_num):speech_chunk = speech[i*chunk_stride:(i+1)*chunk_stride]is_final = i == total_chunk_num - 1res = model.generate(input=speech_chunk, cache=cache, is_final=is_final, chunk_size=chunk_size, encoder_chunk_look_back=encoder_chunk_look_back, decoder_chunk_look_back=decoder_chunk_look_back)print(res)


    (2.2)方法二、如果模型路径中无configuration.json时,需要手动指定具体配置文件路径与模型路径
      python -m funasr.bin.inference \
      --config-path "${local_path}" \
      --config-name "${config}" \
      ++init_param="${init_param}" \
      ++tokenizer_conf.token_list="${tokens}" \
      ++frontend_conf.cmvn_file="${cmvn_file}" \
      ++input="${input}" \
      ++output_dir="${output_dir}" \
      ++device="${device}"
      参数介绍

      config-path:为实验中保存的 config.yaml,可以从实验输出目录中查找。
      config-name:配置文件名,一般为 config.yaml,支持yaml格式与json格式,例如 config.json
      init_param:需要测试的模型参数,一般为model.pt,可以自己选择具体的模型文件
      tokenizer_conf.token_list:词表文件路径,一般在 config.yaml 有指定,无需再手动指定,当 config.yaml 中路径不正确时,需要在此处手动指定。
      frontend_conf.cmvn_file:wav提取fbank中用到的cmvn文件,一般在 config.yaml 有指定,无需再手动指定,当 config.yaml 中路径不正确时,需要在此处手动指定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1054436.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Facebook:社交世界的接口

在当今数字时代,社交媒体已经成为了人们生活中不可或缺的一部分,而Facebook作为其中的巨头之一,扮演着至关重要的角色。本文将带您深入探索Facebook这张社交世界的画卷,全面了解这个令人着迷的平台。 起源与历程 Facebook的故事始…

18. CentOS面试题汇总

Java全栈面试题汇总目录-CSDN博客 1. 什么是Linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了…

C# 读取 CSV 文件的方法汇总

文章目录 1. 使用System.IO命名空间中的类2. 处理标题行和指定列3. 使用CsvHelper库4. 高级功能和异常处理5. 使用 LINQ6. 总结 CSV(Comma-Separated Values,逗号分隔值)文件是一种简单的文本文件格式,用于存储表格数据。在C#中&a…

【C++提高编程-02】----C++泛型编程之类模板实战

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

jupyter notebook更改位置

1.找到jupyer的配置文件 一般在c盘用户的.jupter文件夹下 2. 用记事本打开这个配置文件,定位到c.NotebookApp.notebook_dir /path_to_your_directory 替换你的位置 3.找到jupyer图标的位置,打开属性 添加要存放的位置在目标文件的末尾,重新…

基于单片机的操作平台数据采集网关设计与实现

摘  要: 由于传统网关无法实现数据实时交换,数据传输速率较低,为此提出基于单片机的操作平台数据采集网关设计与实现研究。首先,结合单片机具有的显著优势对网关结构选型设计;其次,参照一体化设计理念&…

ChatGPT API 开发人员实施指南

在技​​术以惊人的速度发展的世界中,ChatGPT API 已经成为游戏规则的改变者,为开发人员开辟了无限的可能性。ChatGPT API 使将类人人工智能的强大功能集成到您的应用程序中成为可能。 在本教程中,您将学习如何在应用程序中利用 ChatGPT API…

精通推荐算法7:多任务学习 -- 总体架构

1 多任务学习的总体架构 目前的互联网主流推荐场景在大多数情况下需要优化多个业务目标。例如在淘宝商品推荐中,需要兼顾点击率和转化率。在抖音短视频推荐中,需要考虑完播率、播放时长、点赞率、评论率、关注率等目标。为了提升各项业务目标&#xff0…

【全开源】Java养老护理助浴陪诊小程序医院陪护陪诊小程序APP源码

打造智慧养老服务新篇章 一、引言:养老护理的数字化转型 随着老龄化社会的到来,养老护理需求日益凸显。为了更好地满足老年人及其家庭的需求,我们推出了养老护理助浴陪诊小程序系统源码。该系统源码旨在通过数字化技术,优化养老…

[AIGC] Nginx常用变量详解

Nginx非常强大,其主要功能包括HTTP服务器、反向代理、负载均衡等。Nginx的配置中有许多内置的变量,你可以在配置文件中使用这些变量进行灵活的配置。在本篇文章中,我们将介绍一些Nginx中常见的变量,包括proxy_add_header。 常见变…

Money Trees

思路分析: 利用双指针 l1始终作为起点,ri,不断更新终点 #include<iostream> #include<cstring> #include<string> #include<algorithm> #define int long long using namespace std; int w[2000005],h[2000005],s[2000005]; int t,n,m,l,r; signed m…

嵌入式单片机笔试题

DC-DC 和 LDO两者有何区别&#xff1f; DC-DC转换器&#xff08;直流-直流转换器&#xff09;和LDO&#xff08;低压差线性稳压器&#xff09;都是用于电源管理的设备&#xff0c;但它们在原理和特性上有一些显著的区别&#xff1a; 原理&#xff1a; DC-DC转换器通过改变输…

前端 CSS 经典:图片边框

前言&#xff1a;有这么一个业务&#xff0c;需要边框随着图片宽度的变化而变化&#xff0c;比如一些聊天的气泡框等。 实现原理&#xff1a;使用 border-image 属性 效果图&#xff1a; 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><he…

vue项目中使用json编辑器

实现效果&#xff1a; 借助插件json-editor-vue3实现效果如图一&#xff0c;如果嫌丑可以通过类名改一下样式如图二。 实现过程&#xff1a; 安装插件&#xff1a;npm install json-editor-vue3 文档链接&#xff1a;GitCode - 开发者的代码家园 <script setup name&quo…

day17

第一题 本题可以采用快速排序的思想&#xff0c;适应随机数指定和三指针划分数组为三个区域的思想&#xff1a; 其中指针的移动细节如上题故事&#xff0c;如下所示&#xff1a; 当a区域的商都大于k时&#xff0c;我们要查找的k位置元素就在左区域&#xff0c;我们进一步在左区…

【LORA协议栈】工作记录

一、硬件资源 MCU型号&#xff1a;STM32F401xE。Lora芯片&#xff1a;SX1276。硬件看门狗。ATT7022E三相电能专用计量芯片。 二、功能简介 作为一个组件&#xff0c;通过485与网关或者各种子设备连接在一起。支持boot升级。通过SPI与LORA芯片通信。接收和发送数据。有3路通信…

vue3 调用本地exe

1、注册表注册 在注册表中直接按照图2注册数据&#xff1b;也可以按照图3注册表的文件创建文档&#xff0c;然后点击打开&#xff0c;将会将注册表写入window系统。 图2 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\F1] "URL:F1 Protocol Handler" &q…

Rust 赋能前端 -- 写一个 File 转 Img 的功能

所有耀眼的成绩,都需要苦熬,熬得过,出众;熬不过,出局 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 Rustwasm-bindgen/js-sys/web-sysWeb WorkerWebAssemblyWebpack/Vite配置WebAssemblyOffscreenCanvas脚手架生成项…

Android Ktor 网络请求框架

Ktor 是一个由 JetBrains 开发的用于 Kotlin 编程语言的应用框架&#xff0c;旨在创建高性能的异步服务器和客户端应用程序。由于完全基于 Kotlin 语言&#xff0c;Ktor 能够让开发者编写出简洁、可读性强且功能强大的代码&#xff0c;特别适合那些已经熟悉 Kotlin 的开发人员。…

提取COCO 数据集的部分类

1.python提取COCO数据集中特定的类 安装pycocotools github地址&#xff1a;https://github.com/philferriere/cocoapi pip install githttps://github.com/philferriere/cocoapi.git#subdirectoryPythonAPI若报错&#xff0c;pip install githttps://github.com/philferriere…