離線語音識別庫sherpa-ncnn安裝和簡單測試筆記

離線語音識別庫有whisper、kaldi、pocketshpinx等,在了解這些庫的時候,發(fā)現(xiàn)了所謂“下一代Kaldi”的sherpa。從文檔和模型名稱看,它是一個很新的離線語音識別庫,支持中英雙語識別,文件和實時語音識別。我加了sherpa的交流群,提了一個issue后工作人員馬上更新了代碼,看來至少目前的支持也很不錯。而sherpa-ncnn使用ncnn替代pytorch,“ncnn是一個為手機端極致優(yōu)化的高性能神經(jīng)網(wǎng)絡前向計算框架”,更適合在小型的嵌入式平臺上運行。
這里我分別用我的樹莓派3B+和一臺小型Windows服務器測試下sherpa-ncnn的文件識別性能,記錄下供后續(xù)參考。

樹莓派3B+的結果

安裝過程不表,按照官方教程即可,注意選擇Embedded Linux (arm)章節(jié)。
測試文件就使用sherpa-ncnn自帶的wav文件,單通道采樣率16000,選其中最長的一個(17s),具體信息如下:

pi@raspberrypi:~/sherpa-ncnn $ soxi sherpa-ncnn-conv-emformer-transducer-2022-12-06/test_wavs/4.wav

Input File : 'sherpa-ncnn-conv-emformer-transducer-2022-12-06/test_wavs/4.wav'
Channels : 1
Sample Rate : 16000
Precision : 16-bit
Duration : 00:00:17.64 = 282240 samples ~ 1323 CDDA sectors
File Size : 565k
Bit Rate : 256k
Sample Encoding: 16-bit Signed Integer PCM

sherpa提供了3種預訓練的模型,分別為zipformer、LSTM和conv-enformer。測試音頻是一段英語教學音頻,所以這里都使用雙語模型。
以zipformer小模型為例:

pi@raspberrypi:~/sherpa-ncnn $ build-arm-linux-gnueabihf/bin/sherpa-ncnn
./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/tokens.txt
./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/encoder_jit_trace-pnnx.ncnn.param
./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/encoder_jit_trace-pnnx.ncnn.bin
./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/decoder_jit_trace-pnnx.ncnn.param
./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/decoder_jit_trace-pnnx.ncnn.bin
./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/joiner_jit_trace-pnnx.ncnn.param
./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/joiner_jit_trace-pnnx.ncnn.bin
./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/test_wavs/4.wav
2 greedy_search
Disable fp16 for Zipformer encoder
Don't Use GPU. has_gpu: 0, config.use_vulkan_compute: 1
ModelConfig(encoder_param="./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/encoder_jit_trace-pnnx.ncnn.param", encoder_bin="./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/encoder_jit_trace-pnnx.ncnn.bin", decoder_param="./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/decoder_jit_trace-pnnx.ncnn.param", decoder_bin="./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/decoder_jit_trace-pnnx.ncnn.bin", joiner_param="./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/joiner_jit_trace-pnnx.ncnn.param", joiner_bin="./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/joiner_jit_trace-pnnx.ncnn.bin", tokens="./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/tokens.txt", encoder num_threads=2, decoder num_threads=2, joiner num_threads=2)
DecoderConfig(method="greedy_search", num_active_paths=4, enable_endpoint=False, endpoint_config=EndpointConfig(rule1=EndpointRule(must_contain_nonsilence=False, min_trailing_silence=2.4, min_utterance_length=0), rule2=EndpointRule(must_contain_nonsilence=True, min_trailing_silence=1.4, min_utterance_length=0), rule3=EndpointRule(must_contain_nonsilence=False, min_trailing_silence=0, min_utterance_length=20)))
wav filename: ./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/test_wavs/4.wav
wav duration (s): 17.64
Started!
Done!
Recognition result for ./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/test_wavs/4.wav
嗯 ON TIME比較準時 IN TIME是及時叫他總是準時教他的作業(yè)那用一般現(xiàn)在時是沒有什么感情色彩的陳述一個事實下一句話為什么要用現(xiàn)在進行時它的意思并不是說說他現(xiàn)在正在教他的
Elapsed seconds: 10.790 s
Real time factor (RTF): 17.640 / 10.790 = 0.612

結果中輸出了運行參數(shù),音頻文件信息,以及識別結果。以上結果為2個線程,識別17s的文件用了10.79s,RTF=0.612。改用4線程:

Recognition result for ./sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16/test_wavs/4.wav
嗯 ON TIME比較準時 IN TIME是及時叫他總是準時教他的作業(yè)那用一般現(xiàn)在時是沒有什么感情色彩的陳述一個事實下一句話為什么要用現(xiàn)在進行時它的意思并不是說說他現(xiàn)在正在教他的
Elapsed seconds: 8.930 s
Real time factor (RTF): 17.640 / 8.930 = 0.506

速度比2線程稍快,RTF=0.506。所有已發(fā)布的預訓練雙語模型的結果如下,其中CPU占用率為觀察的大致值:


樹莓派3B+

Windows主機的結果

測試用的Windows主機是一臺做黑群暉的小型服務器,CPU是AMD 3000G,內(nèi)存16GB, 可用內(nèi)存14GB,操作系統(tǒng)是Windows 10 企業(yè)版 LTSM,劃了4GB給VMWARE。
安裝和編譯sherpa-ncnn需要MSVC環(huán)境,同樣跟著官網(wǎng)教程走,環(huán)境正確的話就沒有問題。
各雙語模型結果如下:

Windows Server

由于平臺性能的提升,在識別速度方面大大改善。

結論

測試音頻可能是取自一段課堂錄音,老師的語速較快,其實際內(nèi)容應該是:
“嗯,ON TIME叫準時,IN TIME是及時交。他總是準時交他的作業(yè)。那用一般現(xiàn)在時是沒有什么感情色彩的,陳述一個事實。下一句話為什么要用現(xiàn)在進行時,它的意思并不是說,說他現(xiàn)在正在交他的。”
根據(jù)測試結果,識別結果與模型的關聯(lián)度較強,與平臺性能沒有什么關系

識別率

整體識別率都不錯。其中有3個錯字都是同音字,確實不容易識別。只有l(wèi)stm-small的第二個jiao字正確,但也是因為它把后面的“他”誤識別為“談”,誤打誤撞組了詞的關系,因此并不能說它的識別率更好。僅從這一小段的測試結果來看,大規(guī)模的模型效果好于小規(guī)模的模型,這是符合直覺的。所有模型在停頓上都一樣,可能是因為原文后半段的語速較快,在這方面沒有分出優(yōu)劣。
而在識別速度方面,小規(guī)模的模型速度比大規(guī)模的更快,這也是符合直覺的。但是lstm-small在樹莓派3B+上的優(yōu)勢沒有在Windows主機上的顯著。在樹莓派3B+上,更多的線程可以略微提高識別速度,但收益不夠明顯。而在Windows主機上,更多的線程未必能提高速度,可能是因為在更高性能的平臺上,少量線程已經(jīng)能使RTF達到較低水平的緣故,與平臺類型應該沒有什么關聯(lián)。
綜上,我最終的選擇是將Windows主機上的sherpa-ncnn打包成服務,由樹莓派采集的語音通過局域網(wǎng)服務識別。模型方面,5秒以下的語音,用conv-emformer;5~10秒的語音用zipformer;超過10秒的語音就用lstm-small。這樣可以最大程度平衡識別速度和質量。鑒于sherpa-ncnn的很多模型在樹莓派3B+上的RTF比較大,有些甚至超過了語音本身的時長,只有zipformer-small-96還可以用一下。這個可以作為局域網(wǎng)方案的本地FAILSAFE。

  1. zipformer-small-96模型指的是:A faster model of sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16。
  2. 所有測試沒有遍歷多少次,并不是嚴謹?shù)臏y試,僅供參考。

參考

https://k2-fsa.github.io/sherpa/ncnn/

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容