【摘要】 WebRTC音频处理基础知识及实战
示例代码托管在:http://www.github.com/dashnowords/blogs
博客园地址:《大史住在大前端》原创博文目录
本文中最重要的信息:32为浮点数表示16bit
位深数据时是用-1~+1的小数来表示16位的-32768~+32767的!翻遍了MDN
都没找到解释,我的内心很崩溃!
最近不少朋友需要在项目中对接百度语音识别的REST API
接口,在读了我之前写的【Recorder.js+百度语音识别】全栈方案技术细节一文后仍然对Web音频采集和处理的部分比较困惑,本文仅针对音频流处理的部分进行解释,全栈实现方案的技术要点,可以参见上面的博文,本篇不再赘述。
一. PCM格式是什么
百度语音官方文档对于音频文件的要求是:
pcm
,wav
,arm
及小程序专用的m4a
格式,要求参数为16000采样率,16bit位深,单声道。
PCM
编码,全称为"脉冲编码调制",是一种将模拟信号转换成数字信号的方法。模拟信号通常指连续的物理量,例如温度、湿度、速度、光照、声响等等,模拟信号在任意时刻都有对应的值;数字信号通常是模拟信号经过采样、量化和编码等几个步骤后得到的。
比如现在麦克风采集到了一段2秒的音频模拟信号,它是连续的,我们有一个很菜的声卡,采集频率为10Hz
,那么经过采样后就得到了20个离散的数据点,这20个点对应的声音值可能是各种精度的,这对于存储和后续的使用而言都不方便,此时就需要将这些值也离散化,比如在上例中,信号的范围是0~52dB,假设我们希望将0~63dB的值都以整数形式记录下来,如果采用6个bit
位来存储,那么就可以识别(2^6-1=63)个数值,这样采集的信号通过四舍五入后都以整数形式保存就可以了,最小精度为1dB;如果用7个bit
位来保存,可存储的不同数值个数为(2^7-1=127)个,如果同样将0~63dB映射到这个范围上的话,那么最小精度就是0.5dB,很明显这样的处理肯定是有精度损失的,使用的位数越多精度越高,计算机中自然需要使用8的整数倍的bit
位来进行存储,经过上述处理后数据就被转换成了一串0
和1
组成的序列,这样的音频数据是没有经过任何压缩编码处理的,也被称为“裸流数据”或“原始数据”。从上面的示例中很容易看出,用10Hz
的采样率,8bit
位存储采样点数值时,记录2秒的数据一共会产生2X10X8 = 160个bit
位,而用16bit
位来存储采样点数据时,记录1秒的数据也会产生1X10X16 = 160个bit
位,如果没有任何附加的说明信息,就无法知道这段数据到底该怎么使用。按照指定要求进行编码后得到的序