一种基于能量统计的语音音量自动调整方法
技术领域
本发明属于计算机数字语音处理通信领域,具体来说是一种基于能量统计的语音音量自动调整方法。
背景技术
在语音处理通信领域,比如在线教育系统、视频会议系统等,从麦克风输入的语音数据由于各种情况的影响,语音有可能太小,也有可能太大,通过音量调整模块对语音音量进行相应的增加或减少,可以维持音量大小的相对稳定,让人听起来比较舒适。
在各种语音处理通信系统中,大部分系统都有音量自动调整的功能,实现方法主要有两大类,一是通过调整系统麦克风音量来改变从麦克风采集到的源语音的音量来实现,二是通过软件对采集到的语音数据进行放大和缩小来实现,而第二种通过软件来实现的方法又可以进一步进行细分为在时域和频域中进行实现。在通过调整系统麦克风音量实现时,当判断出音量需要增强或者减少时,通过调用系统的麦克风接口,对麦克风的增益和音量进行相应的增加和减少来达到音量的自动调整,优点是可以降低软件处理时需要的计算量,对语音音质不会造成影响,缺点是会对系统音量进行频繁调整,会影响到用户体验;在通过软件在时域中进行处理时,会直接对pcm语音数据进行缩放运算,其优点是算法简单,计算量小,缺点是理论上会对一些语音中的噪音也进行相应的发大和缩小,但是实际使用过程中发现对用户体验影响并不大,而在频域中处理时需要先将pcm数据变换到频域中,在频域中进行相应的处理后再把频域中的数据通过逆变换转换为pcm数据,在频域中处理的优点是可以对各个频段的数据进行控制,更有目的地对需要的频段和数据进行缩放,缺点是算法复杂度高,计算量比较大。通过软件对语音数据进行音量调整时,优点是不需要对系统麦克风音量进行操作,对系统音量不会造成影响,缺点是需要一定的计算量,对音质也会有些影响。
各个系统根据实际需求情况来决定使用哪种方法进行自动音量调整,一般都是在满足需求的基础上力求简单,从而达到节省资源的目的。
发明内容
本发明的目的是针对现有技术的不足,提供一种基于能量统计的语音音量自动调整方法。本发明对判定为语音的数据进行处理,对噪声等非语音数据不进行处理,语音数据的判定通过vad算法进行,本发明不对vad算法进行讨论。
本发明解决其技术问题所采用的技术方案包括如下步骤:
步骤(1)、统计每帧采样点的能量平均值energy和该帧中所有采样点能量值的绝对值中的最大值峰值peak,计算公式如下:
energy=(|sample[0]|+...+|sample[count-1]|)÷count;
peak=max(|sample[0]|,...,|sample[count-1]|);
即能量平均值energy为每个采样点的能量值的绝对值之和再除以该帧中总的采样点个数;sample[i]表示当前语音数据帧中第i个采样点的值,0≤i≤count-1,sample[i]数据类型为16位的short型,取值范围为32767≥sample[i]≥-32768;
步骤(2)、计算0到frame_index帧中每帧采样点的能量平均值energy的平均值energy_avg和最大值峰值peak的平均值peak_avg,计算公式如下:
energy_avg=(energy[0]+...+energy[frame_index])÷frame_count;
即energy_avg为每帧的采样点的能量平均值energy相加再除以总的帧数frame_count;frame_count=time÷frame_len,其中frame_len为语音数据帧的长度,该长度为10或20毫秒;
peak_avg=(peak[0]+...+peak[frame_index])÷frame_count;
即peak_avg为每帧中采样点的最大值峰值peak相加再除以总的帧数frame_count;其中,frame_count为time时间内总的帧数,即时间段time内要统计的帧数;frame_index表示当前处理的语音数据帧的索引;
步骤(3)、计算下个时间段time内的放大因子factor_max′和缩小因子factor_min′;所述的放大因子和缩小因子在最开始的时间段time内不进行缩放操作,其初始值都均为1.0,当frame_index>=frame_count时(即time时间内统计结束),计算一次缩放因子;
所述的缩放判定条件和计算公式如下:
3-1.当peak_avg<peak_max_threshold时,预测下个时间段time内的音量偏小,则下个时间段time内的放大因子factor_max′和缩小因子factor_min′需如下操作:
factor_temp=peak_max_threshold÷peak_avg;
factor_max′=factor_max×0.6+factor_temp×0.4;
factor_min′=factor_min×0.6+1.0×0.4;
其中,factor_temp为临时因子,是计算下个时间段time内放大因子factor_max′和缩小因子factor_min′的临时变量;peak_max_threshold为最大峰值均值peak_avg的放大阈值(即峰值均值阈值下限);factor_max为当前时间段time内放大因子,factor_min为当前时间段time内缩小因子;
具体的,下个时间段time内放大因子factor_max′通过临时因子factor_temp的计算,尽量将语音数据帧的peak_avg放大到放大阈值peak_max_threshold的大小附近,下个时间段time内放大因子factor_max′通过权重来分配当前时间段time内的放大因子factor_max和临时因子factor_temp的比重,使下个时间段time内的放大因子factor_max′平滑进行增大最终稳定在一个大于1.0的浮点值附近;由于此时是音量偏小,所以下个时间段time内缩小因子factor_min′通过计算最终会趋向初始值1.0附近;
3-2.当peak_avg>peak_min_threshold时,预测下个时间段time内的音量偏大,则下个时间段time内的放大因子factor_max′和缩小因子factor_min′需如下操作:
factor_temp=peak_avg÷peak_min_threshold;
factor_min′=factor_min×0.6+factor_temp×0.4;
factor_max′=factor_max×0.6+1.0×0.4;
其中,peak_min_threshold为语音数据帧的采样点的峰值均值peak_avg的缩小阈值(即峰值均值阈值上限);
具体的,下个时间段time内缩小因子factor_min′通过临时因子factor_temp的计算,尽量将语音数据帧的peak_avg缩小到缩小阈值peak_min_threshold的大小附近,下个时间段time内缩小因子factor_min′通过权重来分配当前时间段time内的缩小因子factor_min和临时因子factor_temp的比重,使下个时间段time内的缩小因子factor_min′平滑进行增大最终稳定在一个大于1.0的浮点值附近;由于此时是音量偏大,所以下个时间段time内放大因子factor_max′通过计算最终会趋向初始值1.0附近;
3-3.当peak_min_threshold≤peak_avg≤peak_max_threshold时,预测下个时间段time内音量正常,不需要对音量进行缩小放大,则下个时间段time内的放大因子factor_max′和缩小因子factor_min′需如下操作:
factor_min′=factor_min×0.6+1.0×0.4;
factor_max′=factor_max×0.6+1.0×0.4;
其中,下个时间段time内的放大因子factor_max′和缩小因子factor_min′通过上述公式计算最终会趋向初始值1.0附近。
步骤(4)、对下个时间段time内的每帧语音数据进行判定,当需要缩放时,通过缩放因子进行放大或者缩小;
4-1.当energy<energy_avg_max_threshold,或者peak<peak_max_threshold时,该语音数据帧需要放大;
其中,energy_avg_max_threshold为能量平均值energy的放大阈值(即能量均值阈值下限);
4-1-1.判断是否需要修正放大因子factor_max′,防止放大后的最大值峰值peak超出其放大峰值上限peak_max_volume;若factor_max′>factor_temp′>1.0,则放大因子factor_max′修正如下:放大因子factor_max′=factor_temp′;
其中,另一个临时因子factor_temp′=peak_max_volume÷peak;
通过计算临时因子factor_temp′来防止放大因子factor_max′过大,造成放大后的音量超过放大峰值上限peak_max_volume的情况发生;
4-1-2.对该语音数据帧中的每个采样点的音量进行如下放大:
sample[i]=sample[i]×factor_max′;且32767≥sample[i]≥-32768;
4-2.当energy>energy_avg_min_threshold或者peak>peak_min_threshold时,该语音数据帧需要缩小;
4-2-1.判断是否需要修正缩小因子factor_min′,防止缩小后的最大值峰值peak超出其缩小峰值下限peak_min_volume;如果factor_min′>factor_temp″>1.0,则缩小因子factor_min′修正如下:缩小因子factor_min′=factor_temp″;
其中,另一个临时因子factor_temp″=peak÷peak_min_volume
通过计算另一个临时因子factor_temp″来防止缩小因子factor_min′过大造成缩小后的数据小于缩小峰值下限peak_min_volume的情况发生,
4-2-2.对该语音数据帧中的每个采样点的音量进行如下缩小:
sample[i]=sample[i]÷factor_min′;且32767≥sample[i]≥-32768;
4-3.其他情况下,音量在正常范围,不进行放大和缩小。
步骤(5)、将处理好后的语音数据帧输出,结束。
本发明会尽量将采样点的绝对值维持在放大峰值上限peak_max_volume和缩小峰值下限peak_min_volume之间,正常音数据量的采样点值并不会被放大和缩小。
本发明有益效果如下:
本发明从简单实用的角度出发,能够对在语音音量小的时候对音量进行放大,音量过大的时候对音量进行减小,音量适中的时候不进行操作,从而保持音量在一定范围内,使人听起来比较舒适。
本发明通过对过去一段时间内的语音数据的采样点进行峰值统计和能量统计,通过统计出来的特征数据和判定条件来计算出相应的放大因子和缩小因子,利用放大因子和缩小因子对下一时间段满足判定条件的语音数据进行放大或者缩小,从而将语音音量维持在一定范围内,达到音量自动调节的目的。
本发明利用语音数据的相似性和持续性,根据前一段时间的语音数据统计信息,来预测下一段时间需要用到的放大因子和缩小因子,在满足实用性的同时尽量降低算法的复杂度。
附图说明
图1为本发明的流程图。
具体实施方式
下面对本发明的具体实施方式进行说明。
如图1所示,一种基于能量统计的语音音量自动调整方法,包括如下步骤:
步骤(1)、统计每帧采样点的能量平均值energy和该帧中所有采样点能量值的绝对值中的最大值峰值peak,计算公式如下:
energy=(|sample[0]|+...+|sample[count-1]|)÷count;
peak=max(|sample[0]|,...,|sample[count-1]|);
即能量平均值energy为每个采样点的能量值的绝对值之和再除以该帧中总的采样点个数;sample[i]表示当前语音数据帧中第i个采样点的值,0≤i≤count-1,sample[i]数据类型为16位的short型,取值范围为32767≥sample[i]≥-32768;
步骤(2)、计算0到frame_index帧中每帧采样点的能量平均值energy的平均值energy_avg和最大值峰值peak的平均值peak_avg,计算公式如下:
energy_avg=(energy[0]+...+energy[frame_index])÷frame_count;
即energy_avg为每帧的采样点的能量平均值energy相加再除以总的帧数frame_count;frame_count=time÷frame_len,其中frame_len为语音数据帧的长度,该长度为10或20毫秒;
peak_avg=(peak[0]+...+peak[frame_index])÷frame_count;
即peak_avg为每帧中采样点的最大值峰值peak相加再除以总的帧数frame_count;其中,frame_count为time时间内总的帧数,即时间段time内要统计的帧数;frame_index表示当前处理的语音数据帧的索引;
步骤(3)、计算下个时间段内放大因子factor_max′和缩小因子factor_min′;所述的放大因子和缩小因子在最开始的时间段time内不进行缩放操作,其初始值都均为1.0,当frame_index>=frame_count时(即time时间内统计结束),计算一次缩放因子;
所述的缩放判定条件和计算公式如下:
3-1.当peak_avg<peak_max_threshold时,预测下个时间段time内的音量偏小,则下个时间段time内的放大因子factor_max′和缩小因子factor_min′需如下操作:
factor_temp=peak_max_threshold÷peak_avg;
factor_max′=factor_max×0.6+factor_temp×0.4;
factor_min′=factor_min×0.6+1.0×0.4;
其中,factor_temp为临时因子,是计算下个时间段time内放大因子factor_max′和缩小因子factor_min′的临时变量;peak_max_threshold为最大值峰值均值peak_avg的放大阈值(即峰值均值阈值下限);factor_max为当前时间段time内放大因子,factor_min为当前时间段time内缩小因子;
具体的,下个时间段time内放大因子factor_max′通过临时因子factor_temp的计算,尽量将语音数据帧的peak_avg放大到放大阈值peak_max_threshold的大小附近,下个时间段time内放大因子factor_max′通过权重来分配当前时间段time内的放大因子factor_max和临时因子factor_temp的比重,使下个时间段time内的放大因子factor_max′平滑进行增大最终稳定在一个大于1.0的浮点值附近;由于此时是音量偏小,所以下个时间段time内缩小因子factor_min′通过计算最终会趋向初始值1.0附近;
3-2.当peak_avg>peak_min_threshold时,预测下个时间段time内的音量偏大,则下个时间段time内的放大因子factor_max′和缩小因子factor_min′需如下操作:
factor_temp=peak_avg÷peak_min_threshold;
factor_min′=factor_min×0.6+factor_temp×0.4;
factor_max′=factor_max×0.6+1.0×0.4;
其中,peak_min_threshold为语音数据帧的采样点的最大值峰值均值peak_avg的缩小阈值(即峰值均值阈值上限);
具体的,下个时间段time内缩小因子factor_min′通过临时因子factor_temp的计算,尽量将语音数据帧的peak_avg缩小到缩小阈值peak_min_threshold的大小附近,下个时间段time内缩小因子factor_min′通过权重来分配当前时间段time内的缩小因子factor_min和临时因子factor_temp的比重,使下个时间段time内的缩小因子factor_min′平滑进行增大最终稳定在一个大于1.0的浮点值附近;由于此时是音量偏大,所以下个时间段time内放大因子factor_max′通过计算最终会趋向初始值1.0附近;
3-3.当peak_min_threshold≤peak_avg≤peak_max_threshold时,预测下个时间段time内音量正常,不需要对音量进行缩小放大,则下个时间段time内的放大因子factor_max′和缩小因子factor_min′需如下操作:
factor_min′=factor_min×0.6+1.0×0.4;
factor_max′=factor_max×0.6+1.0×0.4;
其中,下个时间段time内的放大因子factor_max′和缩小因子factor_min′通过上述公式计算最终会趋向初始值1.0附近。
步骤(4)、对下个时间段time内的每帧语音数据进行判定,当需要缩放时,通过缩放因子进行放大或者缩小,其中
peak_max_threshold<peak_max_volume,
peak_min_threshold>peak_min_volume,
peak_max_threshold<peak_min_threshold;
4-1.当energy<energy_avg_max_threshold,或者peak<peak_max_threshold时,该语音数据帧需要放大;
其中,energy_avg_max_threshold为能量平均值energy的放大阈值(即能量均值阈值下限);
4-1-1.判断是否需要修正放大因子factor_max′,防止放大后的最大值峰值peak超出其放大峰值上限peak_max_volume;若factor_max′>factor_temp′>1.0,则放大因子factor_max′修正如下:放大因子factor_max′=factor_temp′;
其中,另一个临时因子factor_temp′=peak_max_volume÷peak;
通过计算临时因子factor_temp′来防止放大因子factor_max′过大,造成放大后的音量超过放大峰值上限peak_max_volume的情况发生;
4-1-2.对该语音数据帧中的每个采样点的音量进行如下放大:
sample[i]=sample[i]×factor_max′;且32767≥sample[i]≥-32768;
4-2.当energy>energy_avg_min_threshold或者peak>peak_min_threshold时,该该语音数据帧需要缩小;
4-2-1.判断是否需要修正缩小因子factor_min′,防止缩小后的最大值峰值peak超出其缩小峰值下限peak_min_volume;如果factor_min′>factor_temp″>1.0,则缩小因子factor_min′修正如下:缩小因子factor_min′=factor_temp″;
其中,另一个临时因子factor_temp″=peak÷peak_min_volume
通过计算另一个临时因子factor_temp″来防止缩小因子factor_min′过大造成缩小后的数据小于缩小峰值下限peak_min_volume的情况发生,
4-2-2.对该语音数据帧中的每个采样点的音量进行如下缩小:
sample[i]=sample[i]÷factor_min′;且32767≥sample[i]≥-32768;
4-3.其他情况下,音量在正常范围,不进行放大和缩小。
步骤(5)、将处理好后的语音数据帧输出,结束。
本发明会尽量将采样点的绝对值维持在放大峰值上限peak_max_volume和缩小峰值下限peak_min_volume之间,正常音量数据的采样点值并不会被放大和缩小。