ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Qwen3-ASR藏语语音识别 | 少数民族(藏语|维吾尔语)语音识别 | 本地化部署藏语语音识别模型

Qwen3-ASR藏语语音识别 | 少数民族(藏语|维吾尔语)语音识别 | 本地化部署藏语语音识别模型 1. 背景在众多的开源ASR模型中对于少数民族语言一般是不支持的比如藏语维吾尔语蒙古语开源的模型均不支持。这次是基于Qwen3-ASR来训练一个支持藏语的ASR模型使得可以在本地跑藏语语音识别项目。2. 数据集的准备首先需要准备数据集这里客户提供了10多个小时的藏语数据集这些数据均是客户自己安排人员采集制作的。数据集要符合一定的格式要求需要整理为jsonl格式文件分为两个jsonl文件一个是train.jsonl文件这是训练集还有一个是验证集val.jsonl。格式可以参考下面这样的{audio: /data/corpus/2026-08-11/converted/1000.wav, text: language Tibetanasr textརང་ཉིད་ངལ་རྩོལ་གྲལ་རིམ་གྱི་བསམ་བློ་བཡིན་རློམ་བྱེད་བཞིན་དུ།}其中这个audio是指音频所在的绝对路径然后这个text是音频对应的文字内容当然前面还添加了语种标识language Tibetanasr text如果不想要语种标识可以不添加这个可以直接写音频对应的文字内容即可。这里由于先做的paraformer训练我这里编写了一个python脚本直接把paraformer_train.jsonl这样的数据转为这个Qwen3-ASR训练用的数据下面是这个脚本代码。# !/usr/bin/env python# _*_ coding utf-8 _*_# Time: 2026/8/24 14:51# Author: Luke Ewin# Blog: https://blog.lukeewin.top# 转换 paraformer 的训练的 jsonl 格式为符合 Qwen3-ASR 训练的格式importjsonimportsysdefconvert_jsonl(input_file,output_file): 将原始JSONL转换为目标格式 - 原 source - 新 audio - 原 target - 新 text并在最前面添加 language Tibetanasr text withopen(input_file,r,encodingutf-8)asfin,\open(output_file,w,encodingutf-8)asfout:forlineinfin:lineline.strip()ifnotline:continuetry:datajson.loads(line)exceptjson.JSONDecodeErrorase:print(f跳过无效JSON行:{e},filesys.stderr)continue# 提取所需字段audio_pathdata.get(source)target_textdata.get(target)# 如果缺少必要字段跳过该行也可选择报错ifaudio_pathisNoneortarget_textisNone:print(跳过缺少 source 或 target 的行,filesys.stderr)continue# 构建新记录new_record{audio:audio_path,text:flanguage Tibetanasr text{target_text}}# 写入输出文件fout.write(json.dumps(new_record,ensure_asciiFalse)\n)if__name____main__:# 使用方法python script.py input.jsonl output.jsonliflen(sys.argv)!3:print(用法: python convert.py 输入文件.jsonl 输出文件.jsonl,filesys.stderr)sys.exit(1)input_filesys.argv[1]output_filesys.argv[2]convert_jsonl(input_file,output_file)print(f转换完成结果已保存至{output_file})3. 搭建训练环境上面准备好了数据集就可以开始搭建训练的Python环境了这里使用uv当然你也可以使用其它的比如conda。如何安装uv这里就不说了比较简单网上也可以很容易找到安装的文档。安装好uv之后就可以使用下面的命令创建一个python运行环境了。uv venv--python3.12这里使用的python版本指定为3.12版本其它的版本不知道是否可以。激活环境source.venv/bin/activate激活之后就可以安装对应的python依赖了。uv pipinstall-e.这里是通过源码方式安装的qwen-asr依赖此外训练还需安装datasets依赖。uv pipinstalldatasets需要主要的是一定要安装上这个cuda版本的torch你执行上面两条安装命令的时候默认会给你安装上这个torch可以检查一下是否安装对了。importtorch torch.cuda.is_available()如果返回的是True就说明可以使用cuda。系统安装的CUDA版本是13.2如果使用的是5090显卡需要安装的CUDA版本大于等于12.8。这里尽量选择安装最新版本的CUDA和显卡驱动。4. 开始训练经过上面的步骤环境和数据集都做好了就可以开始训练了这里为了访问编写一个shell脚本执行这个脚本就可以开始训练了。#!/usr/bin/env bashset-eexportCUDA_VISIBLE_DEVICES0MODEL_PATH/opt/asr/Qwen3/models/Qwen3-ASR-1.7BTRAIN_FILE/opt/asr/Qwen3/finetuning/data/train.jsonlEVAL_FILE/opt/asr/Qwen3/finetuning/data/val.jsonlOUTPUT_DIR/opt/asr/Qwen3/outputtorchrun--nproc_per_node1qwen3_asr_sft.py\--model_path${MODEL_PATH}\--train_file${TRAIN_FILE}\--eval_file${EVAL_FILE}\--output_dir${OUTPUT_DIR}\--batch_size2\--grad_acc4\--lr2e-5\--epochs10\--log_steps10\--save_strategysteps\--save_steps200\--save_total_limit5\--num_workers32\--pin_memory1\--persistent_workers1\--prefetch_factor2需要根据自己的硬件条件修改上面的数值比如服务器有一张显卡那么就指定CUDA_VISIBLE_DEVICES0如果有多张就可以使用CUDA_VISIBLE_DEVICES0,1这种方式添加多张显卡。还有这个batch_size的值一定要是2的n次方这个n可以是非负整数。然后这个num_workers的值最大填写你服务器CPU核心数比如这里有32个核心就最大可以填写32这个值也尽量填写2的n次方同样这个n可以是非负整数。授予可执行权限。chmodx finetun.sh然后执行这个脚本开始训练如果你的显存不够就可以减小batch_size值。./finetun.sh可以看到下面日志中输出的loss值一直在减小说明训练是有效果的。可以看到刚开始这个loss值很高随着训练的进行这个loss值会越来越小如果这个loss值不减小反而变大说明这个训练参数设置的不对。然后可以观察训练中这个显卡的情况。从上面可知如果训练的数据集是10多个小时那么至少需要一张24GB显存的显卡。如果你的数据集更大就需要更大显存的显卡。5. 效果检验经过上面的训练现在已经完成了训练我们可以使用下面的python代码测试一下是否真的有效果。# !/usr/bin/env python# _*_ coding utf-8 _*_# Time: 2025/2/28 1:53# Author: Luke Ewin# Blog: https://blog.lukeewin.topimporttorchfromqwen_asrimportQwen3ASRModel modelQwen3ASRModel.from_pretrained(/opt/asr/Qwen3/output/checkpoint-12830,dtypetorch.bfloat16,device_mapcuda:0,attn_implementationflash_attention_2,max_inference_batch_size32,# Batch size limit for inference. -1 means unlimited. Smaller values can help avoid OOM.max_new_tokens256,# Maximum number of tokens to generate. Set a larger value for long audio input.)resultsmodel.transcribe(audioinput(请输入音频路径:),languageNone,# set English to force the language)print(results[0].language)print(results[0].text)这个/opt/asr/Qwen3/output/checkpoint-12830是我上面训练输出的模型权重路径你需要修改你自己保存训练后的模型权重路径这里最后填写绝对路径。然后这里还需要说明一下我这里开启了flash_attention_2你需要提前安装好这个依赖flash-attn。我这里使用的是whl方式安装的如果执行下面方式安装速度会很慢会编译很长时间所以这里找了一个编译好的whl文件直接安装。uv pipinstallflash-attn --no-build-isolation我这里下载的这个whl文件是aria2c-x16-s16-chttps://github.com/mjun0812/flash-attention-prebuild-wheels/releases/download/v0.9.47/flash_attn-2.6.3cu130torch2.13-cp312-cp312-linux_x86_64.whl执行上面的python代码可以看到有输出藏文相比训练之前来说好很多训练之前输出的是中文。如果要测试训练之前的效果只需要修改上面python代码中的加载模型权重路径为训练之前的模型权重路径即可。可以对比发现原先模型不能识别藏语输出的直接是中文并且意思也不对并不是翻译为中文输出你可以理解为模型胡乱输出了中文来应付我们。然后经过训练之后的模型可以看到输出了藏文由于我看不懂藏文这里我发送给AI大模型分析这意思和音频对应藏文意思是差不多的。
返回列表