1.引言
---- 随着嵌入式处理器的处理能力不断加强,网络技术的不断进展,嵌入式多媒体通讯已经迅速普及,其应用产品前途很越来越广泛,如IP电话, 音频会议产品,多媒体教学产品。这些产品的一个基本功能就是语音采集(数字化),语音传输和实时播放。但由于成本和设计资源的限制,一个终端一般只可能有一路(立体声)输出能力,这在一对一通话是不会产生任何问题。但在多个终端同时通话时(如音频会议),如果接收到的数字语音信号不经特殊处理,就很难模拟出多个与会者在一个会议室进行对话的情形。这就要求终端有能力将收到到多路数字语音合成(混合)成一路输出。因此必须采取多路音频流混合方案。
2.设计思想:
2.1 混音的合理性和必要性:
---- 传输话音这种连续的、时间要求严格的流与传输别的数据不同。这涉及声波转换为数字信号,数字信号恢复为声波。虽然AD/DA由硬件完成,但录音和播放由用户设置。特别需要注意的是,不象典型的视频流在空间/时间域占有唯一的位置,在同一时间和位置的图象元素叠加是无任何意义的,但人耳可以感知在同一空间/时间播放多个音频流。这就是混音的合理性和必要性。混音就是用一个输出设备播放多个音频流。
2.2 混音方案的理论依据:
---- 在时域上语音是短时平稳信号,对语音信号进行处理的一个基本概念就是对语音样本以缓冲区为单位处理,即对输入的语音样本分帧。为了满足合理的延时要求,语音帧的长度一般是选10~20ms。
---- 当多个音频源在一个房间播放时,人耳听到的声波是各个声源声波的线性叠加,这正是模拟混音的基础。该事实表明数字话音的混音也应线性相加。假设有n路输入音频流进行混音,Xi(t)是t时刻的第i路输入语音的采样值,则t时刻的混音值为:
---- m(t)=ΣXi(t),i=0,1,…,n-1
---- 数字音频的重要参数是采样率和采样位数,其中各路输入音频流的采样率相同是混音的前提。
3. 混音的实际算法:
考虑到数字音频的采样位数,其每点的的采用的最大最小值是被限定的,如8位采样,则采样值的范围是-127~+127。因此在混音计算时,m(t)=ΣXi(t)必须考虑其溢出的情况。简单的处理溢出的方法是m(t)=(ΣXi(t))/n, 其中n表示参与混音的路数,这样即可以保证每个采样点都不会溢出。
但这种算法的缺点也很明显,即每路音频的音量都被缩小了n倍,没有使每路的音频在不溢出的情况下达到最大的输出(与混音前的每路音频尽量接近)。要达到这种效果,就需要使用另外一种比较复杂的算法: 使用衰减因子f, m(t)=Σ(Xi(t)*f)。其中 (1/n)<= f <= 1, n为混音的路数。
如上面所说,一个语音帧是一个处理单元。初始化时令f=1,每次开始处理一个新的语音帧时,任何一个合成值m(t)超过了范围,将m(t)箝位,并且求得对应的新的f,在时序上位于此点之后的样本都采用新的f。可以看出这样一来,f有越来越小的趋势。为了避免语音不必要的被衰减,因此需要有让f变大的地方,这发生在每个新的语音帧开始处理的入口。新的语音帧样本仍然需要衰减的可能性是很大的,所以f不能每次都又从1开始,而是应该在某种程度上继承过去的值。即在每个新的样本缓冲区的入口处,只要f不等于1,就将其调整为比f稍大一些的值,让它成为新的衰减因子。若样本的确不需要衰减,经过若干帧后f会慢慢变回1。
流程图如下,每次处理语音帧样本长度在10~20ms内选取, 以16位采样为例, f可取1/16, 2/16,… 15/16,1 。 也可以根据不同的应用取不同的取值范围,和不同的 #1, #2 算法。
4.注意事项:
考虑到不同的处理器的处理能力,以及产品对时延的不同要求,我们可以合理的采用上述两种方法。值得注意的是,每点的采样值都是有符号数,不能用简单的无符号数进行处理和运算。
同时,随着需要混合的语音信号路数的增加,在用户不采取任何附加的预防措施的情况下,一些并不需要的信号(例如回声和噪音)就会累积起来并终将导致让人无法接受的质量劣化。这样,每个终端还可以进行输入音频的有声/无声检测,对无有效信号的音道直接丢弃。
5.结束语
---- 在笔者开发音频会议终端(采用ARM7处理器)上,对上述两种方法都进行了测试。结果证明两种方法都能取的比较满意的效果。