離線語音識別庫有whisper蜘欲、kaldi邪财、pocketshpinx等洁段,在了解這些庫的時候应狱,發(fā)現(xiàn)了所謂“下一代Kaldi”的sherpa。從文檔和模型名稱看祠丝,它是一個很新的離線語音識別庫疾呻,支持中英雙語識別除嘹,文件和實時語音識別。我加了sherpa的交流群岸蜗,提了一個issue后工作人員馬上更新了代碼尉咕,看來至少目前的支持也很不錯。而sherpa-ncnn使用ncnn替代pytorch璃岳,“ncnn是一個為手機端極致優(yōu)化的高性能神經(jīng)網(wǎng)絡(luò)前向計算框架”年缎,更適合在小型的嵌入式平臺上運行。
這里我分別用我的樹莓派3B+和一臺小型Windows服務(wù)器測試下sherpa-ncnn的文件識別性能铃慷,記錄下供后續(xù)參考单芜。
樹莓派3B+的結(jié)果
安裝過程不表,按照官方教程即可犁柜,注意選擇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種預(yù)訓(xùn)練的模型,分別為zipformer股囊、LSTM和conv-enformer袜匿。測試音頻是一段英語教學(xué)音頻,所以這里都使用雙語模型稚疹。
以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比較準(zhǔn)時 IN TIME是及時叫他總是準(zhǔn)時教他的作業(yè)那用一般現(xiàn)在時是沒有什么感情色彩的陳述一個事實下一句話為什么要用現(xiàn)在進行時它的意思并不是說說他現(xiàn)在正在教他的
Elapsed seconds: 10.790 s
Real time factor (RTF): 17.640 / 10.790 = 0.612
結(jié)果中輸出了運行參數(shù)居灯,音頻文件信息,以及識別結(jié)果内狗。以上結(jié)果為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比較準(zhǔn)時 IN TIME是及時叫他總是準(zhǔn)時教他的作業(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ā)布的預(yù)訓(xùn)練雙語模型的結(jié)果如下赂鲤,其中CPU占用率為觀察的大致值:
Windows主機的結(jié)果
測試用的Windows主機是一臺做黑群暉的小型服務(wù)器噪径,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)境正確的話就沒有問題。
各雙語模型結(jié)果如下:
由于平臺性能的提升吮播,在識別速度方面大大改善变屁。
結(jié)論
測試音頻可能是取自一段課堂錄音,老師的語速較快薄料,其實際內(nèi)容應(yīng)該是:
“嗯敞贡,ON TIME叫準(zhǔn)時,IN TIME是及時交摄职。他總是準(zhǔn)時交他的作業(yè)誊役。那用一般現(xiàn)在時是沒有什么感情色彩的,陳述一個事實谷市。下一句話為什么要用現(xiàn)在進行時蛔垢,它的意思并不是說,說他現(xiàn)在正在交他的迫悠∨羝幔”
根據(jù)測試結(jié)果,識別結(jié)果與模型的關(guān)聯(lián)度較強创泄,與平臺性能沒有什么關(guān)系艺玲。
整體識別率都不錯。其中有3個錯字都是同音字鞠抑,確實不容易識別饭聚。只有l(wèi)stm-small的第二個jiao字正確,但也是因為它把后面的“他”誤識別為“談”搁拙,誤打誤撞組了詞的關(guān)系秒梳,因此并不能說它的識別率更好。僅從這一小段的測試結(jié)果來看箕速,大規(guī)模的模型效果好于小規(guī)模的模型酪碘,這是符合直覺的。所有模型在停頓上都一樣盐茎,可能是因為原文后半段的語速較快兴垦,在這方面沒有分出優(yōu)劣。
而在識別速度方面字柠,小規(guī)模的模型速度比大規(guī)模的更快滑进,這也是符合直覺的。但是lstm-small在樹莓派3B+上的優(yōu)勢沒有在Windows主機上的顯著募谎。在樹莓派3B+上,更多的線程可以略微提高識別速度阴汇,但收益不夠明顯数冬。而在Windows主機上,更多的線程未必能提高速度,可能是因為在更高性能的平臺上拐纱,少量線程已經(jīng)能使RTF達到較低水平的緣故铜异,與平臺類型應(yīng)該沒有什么關(guān)聯(lián)。
綜上秸架,我最終的選擇是將Windows主機上的sherpa-ncnn打包成服務(wù)揍庄,由樹莓派采集的語音通過局域網(wǎng)服務(wù)識別。模型方面东抹,5秒以下的語音蚂子,用conv-emformer;5~10秒的語音用zipformer缭黔;超過10秒的語音就用lstm-small食茎。這樣可以最大程度平衡識別速度和質(zhì)量。鑒于sherpa-ncnn的很多模型在樹莓派3B+上的RTF比較大馏谨,有些甚至超過了語音本身的時長别渔,只有zipformer-small-96還可以用一下。這個可以作為局域網(wǎng)方案的本地FAILSAFE惧互。
注
- zipformer-small-96模型指的是:A faster model of sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16哎媚。
- 所有測試沒有遍歷多少次,并不是嚴(yán)謹(jǐn)?shù)臏y試喊儡,僅供參考拨与。