快速使用PPASR V3版不能语音识别框架

前言

本文章主要介绍如何快速使用PPASR语音识别框架训练和推理,本文将致力于最简单的方式去介绍使用,如果使用更进阶功能,还需要从源码去看文档。仅需三行代码即可实现训练和推理。

源码地址:https://github.com/yeyupiaoling/PPASR

安装环境

使用Anaconda,并创建了Python3.11的虚拟环境。

  • 首先安装的是PaddlePaddle 2.6.2 的GPU版本,如果已经安装过了,请跳过。
conda install paddlepaddle-gpu==2.6.2 cudatoolkit=11.7 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge
  • 使用pip安装PPASR库,命令如下:
python -m pip install ppasr -U -i https://pypi.tuna.tsinghua.edu.cn/simple

准备数据集

执行下面代码即可自动完成下载数据,和制作数据列表。默认下载可能会比较慢,可以复制下载地址用迅雷等工具下载,并指定filepath为下载好的文件路径,可以快速完成制作数据列表。

import argparse
import os
import functools
from utility import download, unpack
from utility import add_arguments, print_argumentsDATA_URL = 'https://openslr.trmal.net/resources/33/data_aishell.tgz'
MD5_DATA = '2f494334227864a8a8fec932999db9d8'parser = argparse.ArgumentParser(description=__doc__)
add_arg = functools.partial(add_arguments, argparser=parser)
add_arg("target_dir", default="dataset/audio/", type=str, help="存放音频文件的目录")
add_arg("annotation_text", default="dataset/annotation/", type=str, help="存放音频标注文件的目录")
add_arg("filepath", default=None, type=str, help="提前下载好的数据集压缩文件")
args = parser.parse_args()def create_annotation_text(data_dir, annotation_path):print('Create Aishell annotation text ...')if not os.path.exists(annotation_path):os.makedirs(annotation_path)f_train = open(os.path.join(annotation_path, 'aishell.txt'), 'w', encoding='utf-8')if not os.path.exists(os.path.join(annotation_path, 'test.txt')):f_test = open(os.path.join(annotation_path, 'test.txt'), 'w', encoding='utf-8')else:f_test = open(os.path.join(annotation_path, 'test.txt'), 'a', encoding='utf-8')transcript_path = os.path.join(data_dir, 'transcript', 'aishell_transcript_v0.8.txt')transcript_dict = {}for line in open(transcript_path, 'r', encoding='utf-8'):line = line.strip()if line == '': continueaudio_id, text = line.split(' ', 1)# remove spacetext = ''.join(text.split())transcript_dict[audio_id] = textdata_types = ['train', 'dev']for type in data_types:audio_dir = os.path.join(data_dir, 'wav', type)for subfolder, _, filelist in sorted(os.walk(audio_dir)):for fname in filelist:audio_path = os.path.join(subfolder, fname).replace('\\', '/')audio_id = fname[:-4]# if no transcription for audio then skippedif audio_id not in transcript_dict:continuetext = transcript_dict[audio_id]f_train.write(audio_path.replace('../', '') + '\t' + text + '\n')audio_dir = os.path.join(data_dir, 'wav', 'test')for subfolder, _, filelist in sorted(os.walk(audio_dir)):for fname in filelist:audio_path = os.path.join(subfolder, fname).replace('\\', '/')audio_id = fname[:-4]# if no transcription for audio then skippedif audio_id not in transcript_dict:continuetext = transcript_dict[audio_id]f_test.write(audio_path.replace('../', '') + '\t' + text + '\n')f_test.close()f_train.close()def prepare_dataset(url, md5sum, target_dir, annotation_path):"""Download, unpack and create manifest file."""data_dir = os.path.join(target_dir, 'data_aishell')if not os.path.exists(data_dir):if args.filepath is None:filepath = download(url, md5sum, target_dir)else:filepath = args.filepathunpack(filepath, target_dir)# unpack all audio tar filesaudio_dir = os.path.join(data_dir, 'wav')for subfolder, _, filelist in sorted(os.walk(audio_dir)):for ftar in filelist:unpack(os.path.join(subfolder, ftar), subfolder, True)os.remove(filepath)else:print("Skip downloading and unpacking. Aishell data already exists in %s." % target_dir)create_annotation_text(data_dir, annotation_path)def main():print_arguments(args)if args.target_dir.startswith('~'):args.target_dir = os.path.expanduser(args.target_dir)prepare_dataset(url=DATA_URL,md5sum=MD5_DATA,target_dir=args.target_dir,annotation_path=args.annotation_text)if __name__ == '__main__':main()

训练

使用PPASR框架训练非常简单,核心代码就3行,如下,configs参数可以指定使用的默认配置文件。

from ppasr.trainer import PPASRTrainertrainer = PPASRTrainer(configs="conformer", use_gpu=True)trainer.train(save_model_path="models/")

输出类似如下:

2025-03-08 11:04:57.884 | INFO     | ppasr.optimizer:build_optimizer:16 - 成功创建优化方法:Adam,参数为:{'lr': 0.001, 'weight_decay': 1e-06}
2025-03-08 11:04:57.884 | INFO     | ppasr.optimizer:build_lr_scheduler:31 - 成功创建学习率衰减:WarmupLR,参数为:{'warmup_steps': 25000, 'min_lr': 1e-05}
2025-03-08 11:04:57.885 | INFO     | ppasr.trainer:train:541 - 词汇表大小:5561
2025-03-08 11:04:57.885 | INFO     | ppasr.trainer:train:542 - 训练数据:13382
2025-03-08 11:04:57.885 | INFO     | ppasr.trainer:train:543 - 评估数据:27
2025-03-08 11:04:58.642 | INFO     | ppasr.trainer:__train_epoch:414 - Train epoch: [1/200], batch: [0/836], loss: 51.60880, learning_rate: 0.00000008, reader_cost: 0.1062, batch_cost: 0.6486, ips: 21.1991 speech/sec, eta: 1 day, 11:03:13

导出模型

训练完成之后还需要导出模型才能进行推理,导出模型也非常简单。需要三行代码,如下:

from ppasr.trainer import PPASRTrainer# 获取训练器
trainer = PPASRTrainer(configs="conformer", use_gpu=True)# 导出预测模型
trainer.export(save_model_path='models/',resume_model='models/ConformerModel_fbank/best_model/')

推理

推理也相当简单,只需要下面三行代码即可完成语音识别。

from ppasr.predict import PPASRPredictorpredictor = PPASRPredictor(model_dir="models/ConformerModel_fbank/inference_model/", use_gpu=True)audio_path = "dataset/test.wav"
result = predictor.predict(audio_data=audio_path)
print(f"识别结果: {result}")

输出如下:

2025-03-08 11:21:52.100 | INFO     | ppasr.infer_utils.inference_predictor:__init__:38 - 已加载模型:models/ConformerModel_fbank/inference_model/inference.pth
2025-03-08 11:21:52.147 | INFO     | ppasr.predict:__init__:117 - 流式VAD模型已加载完成
2025-03-08 11:21:52.147 | INFO     | ppasr.predict:__init__:119 - 开始预热预测器...
2025-03-08 11:22:01.366 | INFO     | ppasr.predict:reset_predictor:471 - 重置预测器
2025-03-08 11:22:01.366 | INFO     | ppasr.predict:__init__:128 - 预测器已准备完成!
识别结果: {'text': '近几年不但我用书给女儿压岁也劝说亲朋不要给女儿压岁钱而改送压岁书', 'sentences': [{'text': '近几年不但我用书给女儿压岁也劝说亲朋不要给女儿压岁钱而改送压岁书', 'start': 0, 'end': 8.39}]}

结语

该框架支持多个语音识别模型,包含deepspeech2conformersqueezeformerefficient_conformer等,每个模型都支持流式识别和非流式识别,以及多种解码器,包含ctc_greedy_searchctc_prefix_beam_searchattention_rescoringctc_beam_search等。更多功能等你发现。

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

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

相关文章

cannon g3810打印机设置

现在AI这么厉害,是不是很少人来这里搜索资料了。 不过我还是写一下。 买了一台cannon g3810打印机。一直都用USB打印,今天突然想用手机打印。于是又折腾了两个小时,终于折腾完了。 步骤如下: [1]打开官网,下载佳能…

使用 Arduino 和 ThingSpeak 通过 Internet 进行心跳监测

使用 Arduino 和 ThingSpeak 通过 Internet 进行心跳监测 在这个项目中,我们将使用 Arduino 制作一个心跳检测和监测系统,该系统将使用脉搏传感器检测心跳,并在与其连接的 LCD 上显示 BPM(每分钟心跳次数)读数。它还将使用 Wi-Fi 模块ESP8266将读数发送到 ThingSpeak 服务…

vulnhub靶场之【digitalworld.local系列】的snakeoil靶机

前言 靶机:digitalworld.local-snakeoil,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.6 kali采用VMware虚拟机,靶机选择使用VMware打开文件,都选择桥接网络 这里官方给的有两种方式&#xff0…

自行车的主要品牌

一、国际知名品牌(专注运动与高端市场) 捷安特(GIANT) 台湾品牌,全球最大自行车制造商之一,覆盖山地车、公路车、通勤车等多品类。 美利达(MERIDA) 台湾品牌,以山地车…

C语言(队列)

1、队列的原理和作用 1、1 队列的原理 队列的原理其实就像一个管道,如果我们不断的往管道里塞乒乓球,每个乒乓球在管道里就会排列一条队列,先进去的乒乓球会先出来,这个就是队列先进先出的规则 球从左边进去的动作叫入列&#xf…

【C++算法】AVL树的平衡之美:从理论到C++高效实现

AVL树是一种自平衡二叉搜索树,解决了普通二叉搜索树在数据倾斜时的性能退化问题。本文深入探讨了AVL树的理论基础,包括平衡因子的定义、旋转操作的数学推导,并通过LaTeX公式分析其时间复杂度。接着,我们用C++实现了一个完整的AVL树,包括插入、删除和平衡调整的详细代码,附…

黑金风格人像静物户外旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 针对人像、静物以及户外旅拍照片,运用 Lightroom 软件进行风格化调色工作。旨在通过软件中的多种工具,如基本参数调整、HSL(色相、饱和度、明亮度)调整、曲线工具等改变照片原本的色彩、明度、对比度等属性,将…

ESP8266 NodeMCU 与 Atmega16 微控制器连接以发送电子邮件

NodeMCU ESP8266 AVR 微控制器 ATmega16 的接口 Atmega16 是一款低成本的 8 位微控制器,比以前版本的微控制器具有更多的 GPIO。它具有所有常用的通信协议,如 UART、USART、SPI 和 I2C。由于其广泛的社区支持和简单性,它在机器人、汽车和自动化行业有广泛的应用。 Atmega1…

【Hadoop】详解HDFS

Hadoop 分布式文件系统(HDFS)被设计成适合运行在通用硬件上的分布式文件系统,它是一个高度容错性的系统,适合部署在廉价的机器上,能够提供高吞吐量的数据访问,非常适合大规模数据集上的应用。为了做到可靠性,HDFS创建了…

2025 批量下载市场高标解读/配置喵/wangdizhe 雪球帖子/文章导出excel和pdf

之前分享过文章2025 批量下载雪球和东方财富文章导出excel和pdf ,今天整理分享下我下载过的一些雪球文章。 第1个号市场高标解读 抓取下载的所有帖子excel数据包含文章日期,文章标题,文章链接,文章简介,点赞数&#…

2022年《申论》第二题(河北A卷)

材料: “社区很大,共有安置房148栋,安置人口2.9万人。人员众多,而且原来都来自农村,群众生活环境变化大,不适应。”春林易地搬迁安置点建成使用后,老单便来这里担任春林街道办主任。如何有效治…

Qt中实现多个QMainWindow同时显示

在Qt中实现多个QMainWindow同时显示,可通过以下方法实现: 一、直接显示多个实例 必须使用new创建堆对象,避免栈对象因作用域结束被销毁‌。 int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建两个独立的主窗口QMainW…

从运动手环到医疗贴片,精密校平机正在重塑柔性电子器件的工业化生产标准

在柔性电子器件的制造领域,从运动手环到医疗贴片,精密校平机的应用正引领一场生产标准的变革。传统的柔性电子器件生产过程中,材料的平整度控制往往不够精确,导致产品质量参差不齐。然而,随着精密校平机的引入&#xf…

AIP-161 域掩码

编号161原文链接AIP-161: Field masks状态批准创建日期2021-03-01更新日期2021-03-01 在(使用AIP-134的Update或类似方法)更新资源时,通常需要明确指定哪些域需要更新。服务可以忽略另外的域,即使用户发送了值。 定义一种掩码格…

掌握Kubernetes Network Policy,构建安全的容器网络

在 Kubernetes 集群中,默认情况下,所有 Pod 之间都是可以相互通信的,这在某些场景下可能会带来安全隐患。为了实现更精细的网络访问控制,Kubernetes 提供了 Network Policy 机制。Network Policy 允许我们定义一组规则&#xff0c…

Flask 小册子简介

这是一个Flask restful讲解的小册子,涵盖了 RESTful API 的概念、选择 Flask 的原因以及小册子的目标和结构。我会尽量写得详细,帮助你更好地理解。 1. 简介 1.1 什么是 RESTful API? 1.1.1 REST 的概念 REST(Representational…

ElementUI 级联选择器el-cascader启用选择任意一级选项,选中后关闭下拉框

1、启用选择任意一级选项 在 el-cascader 标签上加上配置项&#xff1a; :props"{ checkStrictly: true }"例如&#xff1a; <el-cascaderref"selectedArrRef"v-model"selectedArr":options"optionsList":props"{ checkStri…

typedef 和 using 有什么区别?

在 C 编程中&#xff0c;类型别名&#xff08;Type Aliases&#xff09;是为已有类型定义新名称的一种机制&#xff0c;能够显著提升代码的可读性和可维护性。C 提供了两种工具来实现这一功能&#xff1a;传统的 typedef 和 C11 引入的 using 关键字。 概念 类型别名本质上是为…

VS2022C#windows窗体应用程序调用DeepSeek API

目录 一、创建DeepSeek API Key 二、创建窗体应用程序 三、设计窗体 1、控件拖放布局‌‌ 2、主窗体【Form1】设计 3、多行文本框【tbContent】 4、提交按钮【btnSubmit】 5、单行文字框 四、撰写程序 五、完整代码 六、运行效果 七、其它 一、创建DeepSeek API Ke…

docker 如何更新容器内的环境变量,并覆盖创建这个容器的镜像?

docker 如何更新容器内的环境变量&#xff0c;并覆盖串讲这个容器的镜像&#xff1f; 之前试过在容器内unset 环境变量&#xff0c;并进行docker commit 保存&#xff0c;发现这样是不行的&#xff0c;重新启动容器之后还是会出现之前设置过的环境变量 了解了下&#xff0c;u…