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

文本记录了在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.mzph.cn/pingmian/15699.shtml

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

相关文章

帝国CMS跳过选择会员类型直接注册方法

国CMS因允许多用户组注册,所以在注册页面会有一个选择注册用户组的界面,即使网站只用了一个用户组也会出现。 如果想去掉这个页面,直接进入注册页面,那么可按以下办法修改 打开 e/class/user.php 文件 查找: $chan…

TCP通信实现(服务端与客户端)

TCP通信实现&#xff08;服务器端) 案例 // TCP 通信的服务器端#include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h>int main() {// 1.创建socket(用于监听的套接字)int lfd socket(AF_…

Linux_CentOS7.6防火墙常用相关命令汇总(防火墙关闭与开启)

CentOS 防火墙是操作系统自带的一款网络安全工具&#xff0c;可以用于限制和管理网络流量。以下是一些 CentOS 防火墙相关的常用命令&#xff08;不常用的&#xff0c;太多了就不写了&#xff09;&#xff1a; 在centos7中用firewalld代替以前的iptables 一&#xff0c;查看防…

人脑与电脑有什么不同

人脑和计算机都是信息处理装置&#xff0c;目前人类对自己大脑的原理了解甚少。然而它们仍然有一些相似之处&#xff0c;例如都需要记忆来存储信息。人脑有些功能特性是计算机所没有的&#xff0c;且很难模拟出来&#xff0c;所以两者在原理上并不完全相同。 计算机由人类发明&…

美军配备人工智能武器的机器狗引发伦理争议

近日&#xff0c;美国海军陆战队特种作战司令部&#xff08;MARSOC&#xff09;的一项测试引发了全球关注&#xff1a;他们正在评估一种由“幽灵机器人”公司研发的最新型机器狗&#xff0c;并考虑为其配备“玛瑙工业”公司提供的武器系统。这一消息犹如在平静的湖面投下一颗石…

weixin209基于微信小程序投票评选系统的设计与实现ssm-手把手调试

weixin209基于微信小程序投票评选系统的设计与实现ssm-手把手调试 weixin209基于微信小程序投票评选系统的设计与实现ssm-手把手调试

Python 之 日志巡检脚本

脚本说明 使用Paramiko库进行SSH连接的自动化脚本&#xff0c;用于检查、配置和排除设备故障。说明如下&#xff1a; 导入所需的库&#xff1a;paramiko、json、logging和concurrent.futures。定义配置文件路径&#xff08;devices.json&#xff09;和日志文件路径&#xff0…

阿里巴巴最新研究突破:自我演化大模型,打破性能天花板

获取本文论文原文PDF&#xff0c;请在公众号【AI论文解读】留言&#xff1a;论文解读AI论文解读 原创作者 | 柏企 引言&#xff1a;自我进化的新篇章 在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展正迎来一场革命性的变革。传统的训练模式依赖…

006、API_单线程

Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库 服务&#xff0c;本节首先通过多个客户端命令调用的例子说明Redis单线程命令处理 机制&#xff0c;接着分析Redis单线程模型为什么性能如此之高&#xff0c;最终给出为什么理 解单线程模型是使用和运维Redis的…

一战成电失败,二战上岸复旦!

这个系列会邀请往届学长学姐进行经验分享~ 本篇是复旦大学957来自专业课134分上岸同学的经验分享。 经验分享 大家好&#xff0c;大伙能点进这个帖子倍感荣幸。 先说一下个人情况吧&#xff0c;鼠鼠本科武汉大学物院&#xff0c;总共四年混了四年&#xff0c;绩点低&#x…

数据赋能(99)——概念:数据服务、数据产品

此文为本人学习与提高能力的笔记。 数据服务&#xff08;数据服务目录&#xff09;和数据产品是两个不同的概念&#xff0c;尽管它们都涉及到数据的利用和应用&#xff0c;但在定义和功能上存在一些差异。 在探讨“数据服务”、“数据产品”术语时&#xff0c;我们将从定义的…

WordPress国外超人气主题Vikinger汉化版

WordPress国外超人气主题Vikinger汉化版 前言效果图安装教程领取主题下期更新预报 前言 我们在上一个教程已经学过如何安装WordPress&#xff0c;所以现在不用多说。 效果图 安装教程 下载后先本地解压&#xff0c;找到vikinger.zip文件&#xff0c;上传安装并启用主题。 访…

EasyMR 基于国产化信创的适配实践技术详解

国产化信创&#xff0c;即采用国产信息技术产品和服务&#xff0c;构建自主可控的信息技术体系。近年来&#xff0c;随着国家对网络安全和信息安全的重视程度不断提高&#xff0c;国产化信创已经成为国家战略的重要组成部分&#xff0c;并呈现出以下大趋势&#xff1a; ● 政策…

【C语言】C语言-学生选修课程系统(源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

尝试解决Linux提示:/lib64/libc.so.6: version GLIBC_2.XX‘ not found

一、查看系统中可使用的glibc版本 strings /lib64/libc.so.6 |grep GLIBC_ 二、下载高版本的glibc库 库网站&#xff1a;https://ftp.gnu.org/gnu/glibc/ 下载所需库&#xff0c;如&#xff1a; glibc-2.17.tar.gz 将其转到linux系统中&#xff0c;进行解压缩 tar -xvf gli…

【Muduo】网络库框架模型和各模块简介

Muduo是由陈硕大佬个人开发的C网络库&#xff0c;最近在剖析其源码&#xff0c;在此做一些归纳整理。 框架模型 Muduo网络库的框架模型主要基于Reactor模式&#xff0c;这是一种用于处理多个I/O事件的高效并发模型。 Reactor模式 Reactor模式是一种事件驱动的处理模式&#…

Java 面向数据编程-DOP

近年来&#xff0c;Java 获得了许多新的语言特性&#xff0c;这些特性可以独立使用&#xff0c;并且每个特性都很有用&#xff1a;类型模式&#xff08;type patterns&#xff09;、开关改进&#xff08;switch improvements&#xff09;、记录和记录模式&#xff08; records …

纯正英语新闻 5.26

brutal&#xff1a;残暴的 apartheid&#xff1a;隔离 discrimination&#xff1a;歧视 segregation&#xff1a;隔离 humiliation&#xff1a;屈辱 unfolding&#xff1a;展开 shuffle forward&#xff1a;向前推进 justice&#xff1a;正义 endure&#xff1a;经久不…

分享几张漂亮的linux kde主题

分享几张漂亮的linux kde主题&#xff1a;在系统设置的全局主题内下载。

开源大模型与闭源大模型

概述 开源大模型和闭源大模型是两种常见的大模型类型&#xff0c;它们在以下方面存在差异&#xff1a; 开放性&#xff1a; 开源大模型&#xff1a;代码和模型结构是公开可用的&#xff0c;任何人都可以访问、修改和使用。闭源大模型&#xff1a;模型的代码和结构是私有的&…