語(yǔ)音之家WeNet語(yǔ)音識(shí)別實(shí)戰(zhàn)
1. 代碼結(jié)構(gòu)
WeNet云端推理和部署代碼位于wenet/runtime/server/x86路徑下,編程語(yǔ)言為C++,其結(jié)構(gòu)如下所示:
其中:
語(yǔ)音文件讀入與特征提取相關(guān)代碼位于frontend文件夾下;
端到端模型導(dǎo)入、端點(diǎn)檢測(cè)與語(yǔ)音解碼識(shí)別相關(guān)代碼位于decoder文件夾下,WeNet支持CTC prefix beam search和融合了WFST的CTC beam search這兩種解碼算法,后者的實(shí)現(xiàn)大量借鑒了Kaldi,相關(guān)代碼放在kaldi文件夾下;
在服務(wù)化方面,WeNet分別實(shí)現(xiàn)了基于WebSocket和基于gRPC的兩套服務(wù)端與客戶(hù)端,基于WebSocket的實(shí)現(xiàn)位于websocket文件夾下,基于gRPC的實(shí)現(xiàn)位于grpc文件夾下,兩種實(shí)現(xiàn)的入口main函數(shù)代碼都位于bin文件夾下。
日志、計(jì)時(shí)、字符串處理等輔助代碼位于utils文件夾下。
WeNet提供了CMakeLists.txt和Dockerfile,使得用戶(hù)能方便地進(jìn)行項(xiàng)目編譯和鏡像構(gòu)建。
2. 前端:frontend文件夾
1)語(yǔ)音文件讀入
WeNet只支持44字節(jié)header的wav格式音頻數(shù)據(jù),wav header定義在WavHeader結(jié)構(gòu)體中,包括音頻格式、聲道數(shù)、采樣率等音頻元信息。WavReader類(lèi)用于語(yǔ)音文件讀入,調(diào)用fopen打開(kāi)語(yǔ)音文件后,WavReader先讀入WavHeader大小的數(shù)據(jù)(也就是44字節(jié)),再根據(jù)WavHeader中的元信息確定待讀入音頻數(shù)據(jù)的大小,最后調(diào)用fread把音頻數(shù)據(jù)讀入buffer,并通過(guò)static_cast把數(shù)據(jù)轉(zhuǎn)化為float類(lèi)型。