FreeSWITCH 语音识别 电话机器人 VAD 打断 ASR集成 全功能开源代码
gitcode地址: https://gitcode.net/iyaosan/FreeSWITCH-ASR
github地址: https://github.com/cdevelop/FreeSWITCH-ASR
最近很多人都对FreeSWITCH和ASR对接比较感谢兴趣,我之前已经做了一个商业模块(商业模块请点击这里http://www.ddrj.com/callcenter/asr.html),考虑到大部分人,只是研究一下,并不准确购买商业模块,特意做一个开源项目给大家提供一个参考。
mod_asr.cpp 第二个版本,使用了顶顶通VAD(支持噪音人声识别)本程序包的授权文件是10并发1个月的体验授权,仅用于体验和测试使用。
顶顶通VAD介绍
语音活动检测(Voice Activity Detection,VAD),就是检测是否有声音,常规的算法是通过声音音量和频谱特诊来判断是否有声音的,但是无法区分是噪音还是人声,在电话机器人中噪音打断和噪音识别错误的关键词始终是一个痛点,机器学习算法可以通过大量噪音和人声数据训练出判别人声还是噪音的神经网络模型,VAD算法结合深度神经网络就可以彻底解决这个痛点了。 顶顶通的最新VAD算法已经集成了人声噪音判别引擎。
噪音识别的用处
- 防止错误的意向判断
噪音识别成关键词(是,恩,哦),导致把无意向客户判断成有意向客户,通过噪音识别模块,过滤掉噪音,可以大大提高机器人的意向判断准确度。
- 防止噪音打断机器人说话
大部分机器人只要开了打断功能,有一点噪音就给错误打断了,根本没法在生产环境开打断功能,有了噪音识别模块,就可以避免噪音打断了。 - 机器人反应更灵敏
噪音环境VAD无法判断用户说话结束,会导致用户说话完成了,机器人还一直傻等,有了噪音识别模块,可以让机器人反应更加灵敏。
- 节约ASR费用
在电话机器人业务中,大量的无效声音(各种噪音)调用ASR,浪费ASR调用费用,有了噪音人声判别功能,就可以噪音不再调用ASR接口,节约大量ASR费用。
噪音人声识别算法原理
基于20G的噪音声音文件和100G的正常人声的声音文件,使用tdnn(时延神经网络)和 lstm(长短期记忆网络)训练出噪音人声音判别模型。
噪音人声识别的准确率
准确率取决训练数据的准确性,目前的模型大于1秒声音准确率大于99.9%, 300毫秒以内短时人声和质量很差的人声,有少量识别成噪音的错误率,因为噪音库包含了大量的背景人声。
2023-2-28 第二版本代码提交
请在FreeSWITCH 1.8以上版本测试,低于1.8版本需要修改代码:switch_buffer.c没有switch_buffer_get_head_pointer这个函数。
安装 libsad
目录 copy到 /var目录,最后的路径是
- 授权文件 /var/libsad/license.jon
- 模型目录 /var/libsad/model/
- lib文件 /var/libsad/libsad.so
- mod_asr.so copy到 fs的mod目录
- fs_cli 执行 load mod_asr 加载模块。
申请ASR 本例子使用多方asr接口,注册地址 http://ai.hiszy.com/#/user/register?code=RK9RD7W 注册后可以联系ASR服务商微信 aohu6789 获取免费次数
在fs安装目录/etc/vars.xml 配置asr key
<X-PRE-PROCESS cmd="set" data="appKey=asr后台的appkey"></X-PRE-PROCESS> <X-PRE-PROCESS cmd="set" data="appSecret=asr后台的appSecret"></X-PRE-PROCESS>
测试
执行动作 play_and_asr 参数 playfilename waittime maxspeaktime allowbreak recordfilename
语音识别结果存入通道变量asr_result,如果没有检测到声音设置为silence- playfilename 放音文件
- waittime 等待说话时间,放音完成开始计算
- maxspeaktime 最大说话时间
- allowbreak 是否允许打断,检测到说话就停止放音
recordfilename 本次说话录音文件
例子
<action application="play_and_asr" data="welcome.wav 5000 10000 true /tmp/speak.wav"/> <action application="log" data="open=${asr_result}"/>
- 编译
如果修改了代码编译方法是
g++ -shared -fPIC -o mod_asr.so mod_asr.cpp -I /usr/local/freeswitch/include/freeswitch -L /usr/local/freeswitch/lib -lfreeswitch -L /var/libsad/ -lsad -Wl,-rpath=/var/libsad