离线语音识别库sherpa-ncnn安装和简单测试笔记

离线语音识别库有whisper、kaldi、pocketshpinx等,在了解这些库的时候,发现了所谓“下一代Kaldi”的sherpa。从文档和模型名称看,它是一个很新的离线语音识别库,支持中英双语识别,文件和实时语音识别。我加了sherpa的交流群,提了一个issue后工作人员马上更新了代码,看来至少目前的支持也很不错。而sherpa-ncnn使用ncnn替代pytorch,“ncnn是一个为手机端极致优化的高性能神经网络前向计算框架”,更适合在小型的嵌入式平台上运行。
这里我分别用我的树莓派3B+和一台小型Windows服务器测试下sherpa-ncnn的文件识别性能,记录下供后续参考。

树莓派3B+的结果

安装过程不表,按照官方教程即可,注意选择Embedded Linux (arm)章节。
测试文件就使用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是及时叫他总是准时教他的作业那用一般现在时是没有什么感情色彩的陈述一个事实下一句话为什么要用现在进行时它的意思并不是说说他现在正在教他的
Elapsed seconds: 10.790 s
Real time factor (RTF): 17.640 / 10.790 = 0.612

结果中输出了运行参数,音频文件信息,以及识别结果。以上结果为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是及时叫他总是准时教他的作业那用一般现在时是没有什么感情色彩的陈述一个事实下一句话为什么要用现在进行时它的意思并不是说说他现在正在教他的
Elapsed seconds: 8.930 s
Real time factor (RTF): 17.640 / 8.930 = 0.506

速度比2线程稍快,RTF=0.506。所有已发布的预训练双语模型的结果如下,其中CPU占用率为观察的大致值:


树莓派3B+

Windows主机的结果

测试用的Windows主机是一台做黑群晖的小型服务器,CPU是AMD 3000G,内存16GB, 可用内存14GB,操作系统是Windows 10 企业版 LTSM,划了4GB给VMWARE。
安装和编译sherpa-ncnn需要MSVC环境,同样跟着官网教程走,环境正确的话就没有问题。
各双语模型结果如下:

Windows Server

由于平台性能的提升,在识别速度方面大大改善。

结论

测试音频可能是取自一段课堂录音,老师的语速较快,其实际内容应该是:
“嗯,ON TIME叫准时,IN TIME是及时交。他总是准时交他的作业。那用一般现在时是没有什么感情色彩的,陈述一个事实。下一句话为什么要用现在进行时,它的意思并不是说,说他现在正在交他的。”
根据测试结果,识别结果与模型的关联度较强,与平台性能没有什么关系

识别率

整体识别率都不错。其中有3个错字都是同音字,确实不容易识别。只有lstm-small的第二个jiao字正确,但也是因为它把后面的“他”误识别为“谈”,误打误撞组了词的关系,因此并不能说它的识别率更好。仅从这一小段的测试结果来看,大规模的模型效果好于小规模的模型,这是符合直觉的。所有模型在停顿上都一样,可能是因为原文后半段的语速较快,在这方面没有分出优劣。
而在识别速度方面,小规模的模型速度比大规模的更快,这也是符合直觉的。但是lstm-small在树莓派3B+上的优势没有在Windows主机上的显著。在树莓派3B+上,更多的线程可以略微提高识别速度,但收益不够明显。而在Windows主机上,更多的线程未必能提高速度,可能是因为在更高性能的平台上,少量线程已经能使RTF达到较低水平的缘故,与平台类型应该没有什么关联。
综上,我最终的选择是将Windows主机上的sherpa-ncnn打包成服务,由树莓派采集的语音通过局域网服务识别。模型方面,5秒以下的语音,用conv-emformer;5~10秒的语音用zipformer;超过10秒的语音就用lstm-small。这样可以最大程度平衡识别速度和质量。鉴于sherpa-ncnn的很多模型在树莓派3B+上的RTF比较大,有些甚至超过了语音本身的时长,只有zipformer-small-96还可以用一下。这个可以作为局域网方案的本地FAILSAFE。

  1. zipformer-small-96模型指的是:A faster model of sherpa-ncnn-streaming-zipformer-small-bilingual-zh-en-2023-02-16。
  2. 所有测试没有遍历多少次,并不是严谨的测试,仅供参考。

参考

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容