最早之前不管是视频录制还是视频直播,都是从麦克风获取音频后,直接交编码器,封装复用到不同媒体格式。在后面在IM场景中做短语音消息、短语音消息转文本以及语音输入设计到语音识别,也仍然是直接从麦克风拿数据。在整个语音SDK设计开发完成后自己规划了音效、语音分离合成、重采样等技术需求。
今年年初接手了一个类似于小爱、小度的语音交互系统的项目,整个链路包括:
这时候才知道原来自己规划的那些有个专业的术语叫“信号处理”,整个交互链路中有一个单独的“信号处理”模块。我们先看看什么是语音信号处理,信号处理包含哪些功能。
信号处理功能
语音信号处理是以语音语言学和数字信号处理技术相结合的交叉学科,它和认知科学、心理学、语言学、计算机科学、信号与信息处理、声学、模式识别和人工智能等学科联系紧密。生理学、语言学等多门学科的交叉学科。研究内容包括语音识别、说话人识别、语种识别、语音合成、语音前端处理(包括但不限于语音增强、语音分离、回声抵消、麦克风阵列信号处理等)、语音编码等。
上面是专业的定义,我们今天说的主要是语音前端信号处理。
回声消除AEC
在通信系统中,回声主要分为两类:电路回声和声学回声。我们这里介绍的回声消除(Acoustic Echo Cancellation,AEC )主要指声学回声,即在麦克风与扬声器互相作用影响的双工通信系统产生的“远端讲话者A–>麦克风A–>电话A–>电话B---->扬声器B—>麦克风B–>电话B–>电话A–>扬声器A—>麦克风A—>…"的无限循环。直观的描述就是两个人语音通话,其中一个人打开了扬声器,录音的时候把对方讲话的声音也同时录进去,导致对方听到了自己本身说的话。
如果回声在通话中只是造成很差的用户体验,那么在语音识别中将是灾难性的。所以AEC作为3A中的一员,是大部分信号处理系统要做的。在Android系统中大部分手机已经在Framework层提供了回声消除能力,如果要自己实现的话必须能拿到参考信号,但是很多手机都不会开放这部分权限,只能是自研系统的场景下用的到。
噪音抑制NS
噪声抑制(Noise Suppression, NS)技术用于消除背景噪声,改善语音信号的信噪比和可懂度,让人和机器听得更清楚。主要是去除一些背景噪音,比如敲击键盘声音、喝水声音、关门声音等等。
噪声抑制的两部分:噪声估计、增益因子估计
自动增益AGC
音频AGC是音频自动增益控制算法,更为准确的说是峰值自动增益控制算法,是一种根据输入音频信号水平自动动态地调整增益的机制。当音量(无论是捕捉到的音量还是再现的音量)超过某一门限值,信号就会被限幅。限幅指的是音频设备的输出不再随着输入而变化,输出实质上变成了最大音量位置上的一条水平线;当检测到音频增益达到了某一门限时,它会自动减小增益来避免限幅的发生。另一方面,如果捕捉到的音量太低时,系统将自动提高增益。当然,增益的调整不会使音量超过用户在调节向导中设置的值。
当我们说话音量比较低时,我们想通过拉幅的方式来提高音量,但是声音的幅度不是均匀的,可能某些地方已经要截幅了,另一些地方还幅值还是很小,如果固定增加分贝很难达到理想效果,所以就需要自动增益功能。
盲源分离BSS
麦克风阵列算法有两大类,一类是波束形成算法,另一类是盲源分离算法。
盲源分离(BSS,Blind Signal/Source Separation)是在不知道源信号及信号混合参数的情况下,仅根据观测到的混合信号估计源信号。
盲源分离算法的优点:
- 盲源分离不需要目标语音VAD的先验信息。这个先验信息对于波束形成算法是很关键的,其准确程度直接影响性能。而盲源分离不需要做自适应滤
- 盲源分离不需要目标语音的DOA信息。
波束成型BF
波束成型也是麦克风阵列的一种算法,我们在语音交互系统中主要用来将多路麦克风采集的信号生成为一路。
波达方向估计DOA
波达方向(DOA)估计的基本问题就是确定同时处在空间某一区域内多个感兴趣的信号的空间位置(即多个信号到达阵列参考阵元的方向角)。
去混响
声波在室内传播时,要被墙壁、天花板、地板等障碍物反射,每反射一次都要被障碍物吸收一些。这样,当声源停止发声后,声波在室内要经过多次反射和吸收,最后才消失,我们就感觉到声源停止发声后还有若干个声波混合持续一段时间(室内声源停止发声后仍然存在的声延续现象)。这种现象叫做混响,这段时间叫做混响时间。
混响信号也会对我们的语音识别结果产生影响,所以有时会针对特性的场景(比如固定客厅或者会议室)做去混响处理。
语音信号处理基础知识
上面主要介绍了信号处理是干什么事情的,对于原理我们一点都没提。市面上有一些开源的3A算法,比如webrtc等,但是他们是基于通用方案的实现,效果不是很理想。在识别处理场景,为了追求效果会针对特定的麦克风或者场景进行优化。
本节我们讨论信号处理设计到的一些算法及基础知识体系。
语音信号处理理论与算法
- 数字信号及其基本运算;
- 采样定理;
- 时频分析与傅里叶变换;
- 自适应滤波Overlap-save;
- 自适应滤波RLS算法;
- 自适应滤波AP算法;
- 自适应滤波LMS和RLS算法;
- 回声消除与噪音抑制算法;
- 麦克风阵列相关
看到这些是不是有点蒙圈,其实大学里面有一门信号处理的课程,可以先从这个课程学习或者复习起,掌握基础。
信号处理基础
- 信号与系统概念
- 信号概念
- 典型信号及其特征
- 信号的基本运算
- 信号的分解
- 连续时间系统的时域分析
- 连续时间系统的描述及响应
- 零输入响应和零状态响应
- 冲击响应和阶跃响应
- 卷积积分
- 单位冲激响应表示的系统特性
- 离散时间系统的时域分析
- 连续时间信号与系统的频域分析
- 信号的正交分解
- 周期信号的频谱–傅里叶级数
- 傅里叶级数的性质
- 非周期信号的频谱–傅里叶变换
- 傅里叶变换的性质
- 信号的功率频谱和能量频谱
- 离散时间信号与系统的频域分析
- 连续时间信号与系统的复频域分析
- 拉普拉斯变换
- 拉普拉斯变换的性质
- 拉普拉斯反变换
- 连续时间LTI系统的复频域分析
- 离散时间信号与系统的z域分析
- z变换
- z变换的性质
- z反变换
- 信号与系统理论的应用
- 信号的无失真传输
- 调制与解调
- 多路复用
- 信号滤波
- 系统的状态变量分析
里面涉及到高等数学的一些知识,学习的时候可以一起捡起来了。
信号处理相关工具
我们主要会用到Adobe Audition以及matlab。
总结
本文介绍了信号处理模块的各个功能点以及在移动端语音处理中的作用。还介绍了信号处理的基础知识以及常用工具。