开源语音识别平台VoskKaldi和Asterisk/FreeSWITCH媒体服务器集成方案 开源的语音识别
大家好,今天给各位同享开源语音识别平台VoskKaldi和Asterisk/FreeSWITCH媒体服务器集成方法的一些姿势,其中也会对进行解释,文章篇幅也许偏长,如果能碰巧化解你现在面临的难题,别忘了关注本站,现在就马上开始吧!
所谓语音,核心就是指人说的话,在人类天然语言交互中,大家通过聆听和阅读 收集数据,通过进一步的语言处理获取语义信息,再依靠文字、声音等方法表达 出来,而智能语音进步的意义则存在于实现机器“听说读写”的经过中。进一步说,现在大家讨论的语音绝大部分是来自于语音通话中的RTP语音流。
因此,智能语音应用场景基本上都是通过呼叫通话中的RTP语音采集,通过和语音识别引擎的交互获取语音或者文本的生成。在当前异常火爆的语音识别平台的争夺战中,绝大部分厂家都是互联网行业的头部厂家,它们的服务成本也特别昂贵,而且也许还存在数据安全的难题。Kaldi是语音识别平台中壹个开源的语音识别引擎,很多厂家通过Kaldi对自己的业务体系进行训练,实现其灵活性支持和需求的二次开发。Daniel Povey也是Kaldi之父前几年加入了小米,采访新闻也是轰动一时。小米给了他产学研结合的环境平台,它希望通过小米验证其技术的可行性,小米也许是Daniel Povey愿望起飞的地方。笔者以前说明过Vosk开源项目和MRCP协议,读者有兴趣的话,可以查看历史文档也可以进修MRCP协议。
大家这里仅说明通过Websocket API(ws接口配置文件)方法实现的Asterisk媒体服务器集成。如果用户运用FreeSWITCH的话,配置方法和Asterisk基本上是一致的,可以参考官方文档来实现。这里,大家主要说明Vosk/Kaldi和Asterisk的集成。集成部署包括Asterisk配置,Vosk-asterisk模块配置配置Vosk服务器端容器配置等主要流程。
1)配置Asterisk或者FreeSWITCH媒体引擎
配置asterisk前需要用户配置各种环境支持包,这是特别决定因素的一步,或者执行下面内容命令。
// 在Asterisk 源代码下找到下面内容途径,执行配置前检查,体系会自动配置必要的支持包。contrib/scripts/install_prereq install如果支持包成功配置以后,绝大部分的配置应该不会出现难题,这里不再讨论。笔者是下载的Asterisk-20 tar文件,接着解压配置就可以实现。这里不再说明关于Asterisk配置。
2)配置Vosk-asterisk支持包
配置好asterisk以后,用户需要再配置Vosk模块。下载Vosk-asterisk模块,执行配置编译。
root@iZj6c1a8vgbkumvc45lcr8Z:/usr/src/vosk/vosk-asterisk# ./bootstrap+ libtoolize --force --automake --copy+ autoheader+ aclocal -I m4+ automake --foreign --add-missing --copyconfigure.ac:5: installing './compile'configure.ac:2: installing './missing'res-speech-vosk/Makefile.am: installing './depcomp'+ autoconf+ rm -rf autom4te.cacheroot@iZj6c1a8vgbkumvc45lcr8Z:/usr/src/vosk/vosk-asterisk# ./configure --with-asterisk=/usr/src/asterisk-20.5.2/ --prefix=/usrchecking for a BSD-compatible install... /usr/bin/install -c按照以上命令进行编译。
执行配置后支持包查询命令,确保在指定的配置途径。
root@iZj6c1a8vgbkumvc45lcr8Z:/usr/src/vosk/vosk-asterisk# find / -name res_speech_vosk.so -print/usr/src/vosk/vosk-asterisk/res-speech-vosk/.libs/res_speech_vosk.so/usr/lib/asterisk/modules/res_speech_vosk.so这里读者要注意, 原始配置代码指给了错误的配置途径,需要手动拷贝到正确的途径中。如果熟悉asterisk的读者应该了解这个默认的配置途径。
test -d /usr/etc/asterisk || /bin/bash /usr/src/vosk/vosk-asterisk/install-sh -d /usr/etc/asterisk// 应该是/etc/asterisk cp res_speech_vosk.conf /etc/asterisk拷贝配置文件到/etc/asterisk环境下:
root@iZj6c1a8vgbkumvc45lcr8Z:/usr/src/vosk/vosk-asterisk/conf# lsres_speech_vosk.confroot@iZj6c1a8vgbkumvc45lcr8Z:/usr/src/vosk/vosk-asterisk/conf# cp res_speech_vosk.conf /etc/asterisk/root@iZj6c1a8vgbkumvc45lcr8Z:/usr/src/vosk/vosk-asterisk/conf#确认这多少已经编译的模块在asterisk目录下。
在配置途径中查询这些模块/usr/lib/asterisk/modules/或者/usr/lib64/asterisk/modules/确认这些模块在默认配置目录下以后,接着在模块配置文件中添加新的模块,启动asterisk时会加载大家刚才编译的模块。读者修改modules.conf 配置文件,加载vosk模块。注意,这些模块名称在CLI后台还查询差点。
另外,如果有必要的话,用户可以通过配置文件修改其端口和服务器IP地址。用户可以编辑asterisk配置文件/conf/res_speech_vosk.conf。
[general]url = ws://localhost:2700 // 通过ws实现和Vosk服务器端通信创建壹个Asterisk拨号制度测试呼叫。用户可以运用pjsip注册壹个SIP分机,呼叫到拨号制度以后,执行下面内容流程。
[from-internal]exten = 1,1,Answer same = n,Wait(1)same = n,SpeechCreatesame = n,SpeechBackground(hello) // 体系回放欢迎语// // 打印出分机用户所说的内容same = n,Verbose(0,Result was ${SPEECH_TEXT(0)})以上是关于Asterisk的配置测试环境。
https://github.com/alphacep/freeswitch/tree/master/src/mod/asr_tts/mod_vosk
3)Vosk服务器端容器配置
再次说明,首先用户需要配置容器工具的支持包。关于支持包配置和docker这里不再做太多说明。配置好支持包以后,可以先进行测试,支持的是Python 3.9版本。接着启动vosk服务器。Vosk服务器端镜像支持多个语言的镜像,用户可以配置英文版本或者中文版本的容器镜像。笔者配置的是vosk的CN版本。用户可以根据部署环境到官方网站下载不同的model。
如果用户要根据不同model测试的话,用户需要修改测试代码中的model途径.
下载链接如下:
https://alphacephei.com/vosk/models
当然,用户可以根据自己的环境,配置相应的语言支持版本,笔者配置的是:
docker run -d -p 2700:2700 alphacep/kaldi-cn:latest笔者现在的体系已经配置了docker,因此不再做更多说明。关于debian环境下docker配置的资料很多,提议用户自己进修。
启动容器以后,执行下面内容命令配置
// 默认配置英文版本, 这里大家测试中文语言识别,因此配置中文cn版本docker run -d -p 2700:2700 alphacep/kaldi-cn:latest配置好vosk服务器端以后,通过docker命令启动情形。
dockers ps -a // 体系已经启动了docker,配置kaldi-cn 镜像root@iZj6c1a8vgbkumvc45lcr8Z:~# docker run -d -p 2700:2700 alphacep/kaldi-cn:latestUnable to find image 'alphacep/kaldi-cn:latest' locallylatest: Pulling from alphacep/kaldi-cndf5590a8898b: Pull completeb07d59199e84: Pull complete0e4f6ce137fd: Pull complete0139dee2664a: Pull completeDigest: sha256:34272dddd7eddb0c511ac5aac8b2132f8d01b895a427f117fe475c70ef7a27dfStatus: Downloaded newer image for alphacep/kaldi-cn:latest2bc95389b7a18c23770317b9d7ac8885058b1518507c25a82b1d7702c507a660root@iZj6c1a8vgbkumvc45lcr8Z:~#确认Vosk服务器端启动以后,登录到Vosk容器中,执行测试:
root@iZj6c1a8vgbkumvc45lcr8Z:~# docker run -it alphacep/kaldi-cn:latest /bin/bashroot@9937544c3dd4:/opt/vosk-server/websocket# lsasr_server.py test.py test.wav test16k.wav test_alternatives.py test_ffmpeg.py test_microphone.py test_srt.py test_words.pyroot@9937544c3dd4:/opt/vosk-server/websocket#如果要在启用asterisk集成前进行测试的话,需要修改test.py 文件中的IP地址,如果是本地IP的话,应该可以不要修改此地址。
root@4a0d122a913c:/opt/vosk-server/websocket# cat test.py#!/usr/bin/env python3import asyncioimport websocketsimport sysimport waveasync def run_test(uri): async with websockets.connect(uri) as websocket: wf = wave.open(sys.argv[1], "rb") await websocket.send('{ "config" : { "sample_rate" : %d } }' % (wf.getframerate())) buffer_size = int(wf.getframerate() * 0.2) # 0.2 seconds of audio while True: data = wf.readframes(buffer_size) if len(data) == 0: break await websocket.send(data) print (await websocket.recv()) await websocket.send('{"eof" : 1}') print (await websocket.recv())// 修改为测试地址,在asterisk中对应的也是此地址。asyncio.run(run_test('ws://localhost:2700'))Vosk的cn模型配置,用户如果需要优化或者增加自己的一些语料配置的话,可以根据这些配置来优化。
root@4a0d122a913c:/opt/vosk-model-cn# cd model/root@4a0d122a913c:/opt/vosk-model-cn/model# lsREADME am conf graph ivector rescore rnnlmroot@4a0d122a913c:/opt/vosk-model-cn/model# cd conf/root@4a0d122a913c:/opt/vosk-model-cn/model/conf# lsmfcc.conf model.confroot@4a0d122a913c:/opt/vosk-model-cn/model/conf#root@4a0d122a913c:/opt/vosk-model-cn/model/conf# cat model.conf--min-active=200--max-active=7000--beam=13.0--lattice-beam=6.0--acoustic-scale=1.0--frame-subsampling-factor=3--endpoint.silence-phones=1:2:3:4:5:6:7:8:9:10--endpoint.rule2.min-trailing-silence=0.5--endpoint.rule3.min-trailing-silence=1.0--endpoint.rule4.min-trailing-silence=2.0由于启动Vosk服务器和Asterisk实现测试的话,用户服务器需要至少16G内存的配置,防止体系资源不能支持kaldi的正常职业。在Asterisk服务器端启动以后,大家已经看到了Asterisk加载的模块记录
用户注册壹个SIP分机以后,可以根据拨号制度的配置,呼入以后,如果用户开始说话的时候,Asterisk会打印出相应的文本内容。由于笔者的测试机体系内存资源有限,启动时出现了资源难题,不能特别完整测试余下的呼叫流程,用户可以根据以上流程基本上可以搭建一套基于Vosk-kaldi-Asterisk的智能语音体系。
Vosk其它应用集成支持
Vosk是基于Kaldi封装的开源语音识别引擎,它充分利用了kaldi强大的语音识别引擎功能以外,同时增加了第三方集成的应用场景和各种API支持,真正站在了巨人肩膀上,实现了多开发语言集成和多场景支持,极大降低了语音识别应用开发门槛。除了支持大家刚才说的Asterisk和FreeSWITCH媒体服务器以外,还支持了很多和语音关联的其它场景,包括了开源视频服务器-jitsi的支持,unimrcp支持,离线PC桌面应用的实时语音识别支持,副深入了解生成功能支持,网络收音机控制支持,语音助手和视频搜索功能,移动端的支持。
拓展资料
参考资料:
https://alphacephei.com/vosk/
https://github.com/alphacep/vosk-asterisk
https://github.com/alphacep/vosk-server
www.sip.org.cn
https://hub.docker.com/u/alphacep
https://github.com/kaldi-asr/kaldi
https://xueqiu.com/9217191040/145539282
The Kaldi Speech Recognition Toolkit,Daniel Povey1 , Arnab Ghoshal2 , Gilles Boulianne3 , Luka´s Burget ˇ 4,5 , Ondˇrej Glembek4 , Nagendra Goel6 , Mirko Hannemann4 , Petr Motl´ıcek ˇ 7 , Yanmin Qian8 , Petr Schwarz4 , Jan Silovsky´ 9 , Georg Stemmer10, Karel Vesely´ 4