**
语音识别技术:
**
主要应用了两个模块的技术:
H5里面监听声音分贝的大小来判断有无人说话。
Recorder插件来实现有关音频的输入和输出,将音频以文件的形式传输和后端
技术背景:实现人机对话功能,其中主要是通过电脑音频输入,然后给出一个音频处理后的反馈的过程。
具体实现逻辑:
第一、首先思考这几个问题
1.如何实时监控音频?
2.以什么作为起止条件?
3.结果反馈如果也是语音播放的话如何规避音频再次发送请求?也就是说如何实现语音播放时候暂时切断原有前后端交互。
4.如何实现与后端交互,文件传输怎么实现?
二、那么就按照这个思路我们开始整智能语音识别
首先实时监控,这个我们可以采用前端定时器setsetInterval来作为页面实时监控的点
其次就是有关起止条件,我们实时监听从什么时候开始,又从什么时候结束呢?在这个里面我用了H5方式来实现的,其中通过点击按钮的方式来触发函数,然后实时获取到电脑输入音频的实时分贝值,这些值都是实时变化的(MediaStreamRecorder.js),具体实现效果和测试地址如下:
https://codepen.io/huooo/pen/LBKPZp
可以实时获取您音量的输入。
那么起止条件,这个就不是问题啦,比如说我们可以通过设置定时器,去不断的监听语音,只要语音的分贝值高于40你就可以默认有人说话,这个时候就可以执行录音操作了,那么我们还可以约定一个结束的条件,比如实时监听的分贝值小于20且持续了3秒,那么我们就默认结束音频的录入了,这样的话就可以有效的获取前端音频输入的文件。给后端处理也能做到实时性。
如何让返回音频播放不影响自身播放,这边做的处理是在发送ajax请求的时候就清了原先的定时器,然后获取返回音频的时长,根据时长设置一个延时再重新开启音频可输入的函数定时器,这样的话就可以在一定程度上进行了规避。
具体初步效果如下:
然后文件怎么实现传输呢?这个主要就是看有关这个音频数据如何用文件的方式进行传输,(其实网上还有就是一种流的方式来实现的),这次着重介绍文件传输,众所周知input有个file类型是可以直接上传文件的,
但是我们这个又没有输入框的地方,所有的交互全靠嘴遁,那么废话不多说直接上代码吧:
let file2 = new File([o.blob], name, { type: 'audio/wav' });
let formData = new FormData()
formData.append('voiceFile', file2);
这个时候就不禁有朋友问这个变量都是怎么来的啊,尤其是o.blob怎么来的,那么请看上文:
这个里面的id是一个随机数,然后针对这个进行blob赋值.
到了这里我们的前端就告一段落了。后面就是通过接口请求后端进行TTS和ASR来进行识别,也就是文本转语音和语音转文本,其中先是语音转文字,然后将文字作为提问传递给机器学习作为训练条件,然后得到一段训练后的文字,最后将这个结果文本转成音频通过创建ftp连接存在服务中,将URL返回给前端即可播放,但是ftp建立连接可能存在问题,个人推荐sftp来做(踩过坑的教训)。最后就是前端播放的时候将原先的定时器清除后就可以啦。
然后通过获取音频时长作为延时开启条件,避免自身播放语音干扰。
上文说到的TTS和ASR都是依赖百度的语音识别技术,存在的缺陷就是语音转文字的过程耗时较长,相对体验较差些。有人说科大讯飞不错,这个没试过有待商榷。
那么就到这里了,大家对语音识别有什么问题欢迎随时留言,一起探讨一起进步。