View on GitHub

Cycle263 Blog

Stay hungry, stay foolish.

语音识别

语音相关概念

语音识别优化


web端的语音技术

WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC包含的这些标准使用户在无需安装任何插件或者第三方的软件的情况下,创建点对点(Peer-to-Peer)的数据分享和电话会议成为可能。

  // 默认采样率和采样位数
  录音接口(navigator.mediaDevices.getUserMedia) -> promise对象参数MediaStream对象 -> URL.createObjectURL 或者 赋值给video.srcObject -> videoaudio直接播放

  // 修改采样率思路
  录音接口(navigator.mediaDevices.getUserMedia) -> promise对象参数MediaStream对象 -> audioContext.createMediaStreamSource(stream), audioContext.createScriptProcessor(buffersize,1,1), 并且mediaStreamSource.connect(scriptProcessorNode), scriptProcessorNode.connect(audioContext.destination);  -> scriptProcessorNode.onaudioprocess(audioProcessingEvent)  -> audioProcessingEvent.inputBuffer, audioProcessingEvent.outputBuffer -> getChannelData return Float32Array, 缓存buffer和length -> 修改采样率chrome默认48k, 16/48可以理解为三个点取一点 -> 新起arraybuffer定义pcm文件头信息(44), 将缓存的buffer换算成Int16Array缓冲到新buffer的44之后 -> 最后将新buffer转换成wav类型的Blob文件

  // 读取本地wav文件
  xhr以arraybuffer类型读取wav文件 -> audioContext.decodeAudioData解码音频文件, 回调传入audioBuffer参数 -> audioContext.createBufferSource,  audioContext.createScriptProcessor(buffersize,1,1)  -> bufferSource.connect(scriptNode); scriptNode.connect(audioContext.destination); -> bufferSource.start()开始播放bufferSource只可以消费一次停止播放buffer会被清洗

chrome 常见的webrtc接口案例

参考:MDN - MediaDevices

语音合成(TTS)

其他概念

  举几个例子。正数 233 的二进制形式是 11101001,它用不同长度的无符号数和有符号数的表示如下图,红色的 0 表示符号 位。注意图中没有 8 位有符号数,因为 233 超出了 8 位有符号数的范围。

整数在计算机中的表示

再如,负数 -23 用不同长度的有符号数的表示如下图,红色的 1 表示符号位。-23 用 8 位有符号数表示的形式跟 233 用 8 位无符号数表示的形式是一样的,请读者自行验证。

整数在计算机中的表示

  -(1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。

  -(2)M表示有效数字,大于等于1,小于2。

  -(3)2^E表示指数位。

十进制的-5.0,写成二进制是-101.0,相当于-1.01×2^2。那么,s=1,M=1.01,E=2。

IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M