快速使用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.pswp.cn/pingmian/71716.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71716.shtml
英文地址,請注明出處:http://en.pswp.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…