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

離線語音識別庫有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占用率為觀察的大致值:


樹莓派3B+

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é)果如下:

Windows Server

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

結(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惧互。

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

參考

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市管宵,隨后出現(xiàn)的幾起案子截珍,更是在濱河造成了極大的恐慌,老刑警劉巖箩朴,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岗喉,死亡現(xiàn)場離奇詭異,居然都是意外死亡炸庞,警方通過查閱死者的電腦和手機钱床,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埠居,“玉大人查牌,你說我怎么就攤上這事±暮荆” “怎么了纸颜?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绎橘。 經(jīng)常有香客問我胁孙,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任涮较,我火速辦了婚禮稠鼻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狂票。我一直安慰自己候齿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布闺属。 她就那樣靜靜地躺著慌盯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屋剑。 梳的紋絲不亂的頭發(fā)上润匙,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音唉匾,去河邊找鬼孕讳。 笑死,一個胖子當(dāng)著我的面吹牛巍膘,可吹牛的內(nèi)容都是我干的厂财。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼峡懈,長吁一口氣:“原來是場噩夢啊……” “哼璃饱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肪康,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤荚恶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后磷支,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谒撼,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年雾狈,在試婚紗的時候發(fā)現(xiàn)自己被綠了廓潜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡善榛,死狀恐怖辩蛋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情移盆,我是刑警寧澤悼院,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站咒循,受9級特大地震影響据途,放射性物質(zhì)發(fā)生泄漏钮呀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一昨凡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚁署,春花似錦便脊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至久妆,卻和暖如春晌杰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筷弦。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工肋演, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烂琴。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓爹殊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奸绷。 傳聞我的和親對象是個殘疾皇子梗夸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容