发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种语音电话回音消除方法、存储介质、电子设备及系统,保证音频录制与音频播放过程中数据的同步对齐,有效消除麦克风录制音频数据时的回音。
为达到以上目的,本发明采取的技术方案是:一种语音电话回音消除方法:
获取用户预设的延迟帧数,以及音频播放和音频录制中音频帧占用内存的位置大小;
在内存中申请用于存储播放音频数据第一空间,定义所述第一空间中用于存放播放音频数据的位置,所述存放播放音频数据的位置默认值为所述延迟帧数与音频帧占用内存的位置大小之乘积;
当音频播放线程需要获取播放音频数据时,调用音频播放函数将当前播放音频数据存放于所述存放播放音频数据的位置的开始之处;
当音频录制线程产生音频采集数据时,调用音频录制函数从所述第一空间的开始位置获取一个音频帧占用内存的位置大小的播放音频数据作为回声参考数据;
调用回声消除函数使用所述回声参考数据进行回声消除。
在上述技术方案的基础上,当音频播放线程需要获取播放音频数据时,将当前播放音频数据存放于所述存放播放音频数据的位置的开始之处包括:
通过音频播放函数将播放音频数据复制到所述第一空间中,存放在所述存放播放音频数据的位置处,并将所述存放播放音频数据的位置的开始之处增加一个音频帧占用内存的位置大小;若所述存放播放音频数据的位置<所述延迟帧数与音频帧占用内存的位置大小之乘积,则重复将播放音频数据复制到所述第一空间中,直至所述存放播放音频数据的位置的开始之处为所述延迟帧数与音频帧占用内存的位置大小之乘积。
在上述技术方案的基础上,调用音频录制函数从所述第一空间的开始位置获取一个音频帧占用内存的位置大小的播放音频数据作为回声参考数据后,将所述第一空间中从一个音频帧占用内存的位置大小开始到所述延迟帧数与音频帧占用内存的位置大小之乘积结束的所有播放音频数据复制到所述第一空间的开始位置,同时将所述存放播放音频数据的位置的开始之处减去一个音频帧占用内存的位置大小。
在上述技术方案的基础上,当音频播放线程需要获取音频数据时,若所述存放播放音频数据的位置大于等于所述第一空间的大小或所述存放播放音频数据的位置<(延迟帧数-1)乘以音频帧占用内存的位置大小时,重置所述第一空间。
在上述技术方案的基础上,当音频录制线程产生音频采集数据时,若所述第一空间中没有播放音频数据,重置所述第一空间。
本发明还公开了一种存储介质,该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现语音电话回音消除方法。
本发明还公开了一种电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,处理器执行计算机程序时实现语音电话回音消除方法。
本发明还公开了一种语音电话回音消除系统,包括:
参数获取模块,其用于获取用户预设的延迟帧数,以及音频播放和音频录制中音频帧占用内存的位置大小;
内存空间设置模块,其用于在内存中申请用于存储播放音频数据第一空间,定义所述第一空间中用于存放播放音频数据的位置,所述存放播放音频数据的位置默认值为所述延迟帧数与音频帧占用内存的位置大小之乘积;
数据存放模块,其用于当音频播放线程需要获取播放音频数据时,调用音频播放函数将当前播放音频数据存放于所述存放播放音频数据的位置的开始之处;
数据获取模块,其用于当音频录制线程产生音频采集数据时,调用音频录制函数从所述第一空间的开始位置获取一个音频帧占用内存的位置大小的播放音频数据作为回声参考数据;
回声消除模块,其用于调用回声消除函数使用所述回声参考数据进行回声消除。
在上述技术方案的基础上,所述数据存放模块用于通过音频播放函数将播放音频数据复制到所述第一空间中,存放在所述存放播放音频数据的位置处,并将所述存放播放音频数据的位置的开始之处增加一个音频帧占用内存的位置大小;若所述存放播放音频数据的位置<所述延迟帧数与音频帧占用内存的位置大小之乘积,则重复将播放音频数据复制到所述第一空间中,直至所述存放播放音频数据的位置的开始之处为所述延迟帧数与音频帧占用内存的位置大小之乘积。
在上述技术方案的基础上,所述数据获取模块用于调用音频录制函数从所述第一空间的开始位置获取一个音频帧占用内存的位置大小的播放音频数据作为回声参考数据后,将所述第一空间中从一个音频帧占用内存的位置大小开始到所述延迟帧数与音频帧占用内存的位置大小之乘积结束的所有播放音频数据复制到所述第一空间的开始位置,同时将所述存放播放音频数据的位置的开始之处减去一个音频帧占用内存的位置大小。
与现有技术相比,本发明的优点在于:
本发明获取用户预设的延迟帧数,以及音频播放和音频录制中音频帧占用内存的位置大小;在内存中申请用于存储播放音频数据第一空间,定义第一空间中用于存放播放音频数据的位置;当音频播放线程需要获取播放音频数据时,调用音频播放函数将当前播放音频数据存放于存放播放音频数据的位置的开始之处;当音频录制线程产生音频采集数据时,调用音频录制函数从第一空间的开始位置获取一个音频帧占用内存的位置大小的播放音频数据作为回声参考数据;调用回声消除函数进行回声消除,实现克服麦克风录制与扬声器播放音频数据之间延时间隔,保证音频录制与音频播放过程中数据的同步对齐,有效消除麦克风录制音频数据时的回音。
具体实施方式
以下结合附图及实施例对本发明作进一步详细说明。
参见图1所示,本发明实施例提供一种语音电话回音消除方法:
S1,获取用户预设的延迟帧数,以及音频播放和音频录制中音频帧占用内存的位置大小;
S2,在内存中申请用于存储播放音频数据第一空间,定义第一空间中用于存放播放音频数据的位置,存放播放音频数据的位置默认值为延迟帧数与音频帧占用内存的位置大小之乘积,即表示存放播放音频数据的位置与第一空间的开始之处的位置之差等于延迟帧数与音频帧占用内存的位置大小之乘积;
S3,当音频播放线程需要获取播放音频数据时,调用音频播放函数将当前播放音频数据存放于存放播放音频数据的位置的开始之处;
通过音频播放函数将播放音频数据复制到第一空间中,存放在存放播放音频数据的位置处,并将存放播放音频数据的位置的开始之处增加一个音频帧占用内存的位置大小;若存放播放音频数据的位置小于存放播放音频数据的位置的默认值,即小于延迟帧数与音频帧占用内存的位置大小之乘积,则重复将播放音频数据复制到第一空间中,直至存放播放音频数据的位置的开始之处为延迟帧数与音频帧占用内存的位置大小之乘积。
当音频播放线程需要获取音频数据时,若存放播放音频数据的位置大于等于第一空间的大小或存放播放音频数据的位置<(延迟帧数-1)乘以音频帧占用内存的位置大小时,重置第一空间。
S4,当音频录制线程产生音频采集数据时,调用音频录制函数从第一空间的开始位置获取一个音频帧占用内存的位置大小的播放音频数据作为回声参考数据;
调用音频录制函数从第一空间的开始位置获取一个音频帧占用内存的位置大小的播放音频数据作为回声参考数据后,将第一空间中从一个音频帧占用内存的位置大小开始到延迟帧数与音频帧占用内存的位置大小之乘积结束的所有播放音频数据复制到第一空间的开始位置,同时将存放播放音频数据的位置的开始之处减去一个音频帧占用内存的位置大小。
当音频录制线程产生音频采集数据时,若第一空间中没有播放音频数据,重置第一空间。
S5,调用回声消除函数使用回声参考数据进行回声消除。
本发明实现克服麦克风录制与扬声器播放音频数据之间延时间隔,保证音频录制与音频播放过程中数据的同步对齐,有效消除麦克风录制音频数据时的回音。
上述方法实现需要的结构和相关函数如下:
void onAudioPlayback(unsigned short*audio_frame,int size);//音频播放函数
void onAudioCapture(unsigned short*audio_frame,int size);//音频录制函数
void echoCancellation(unsigned short*input_frame,unsigned short*echo_frame,int size);//回声消除函数
其中,stEchoSyncParam结构用于进行回声消除时,选择播放音频数据作为回声参考数据的策略判断。宏RECORD_DELAY为用户预设的音频录制与播放之间的时间延迟,即扬声器的声音进入麦克风的延后时间,用音频帧数表示,本实施例中根据经验默认设置为2。
上述步骤的具体实现过程如下:
定义一个stEchoSyncParam结构的对象m_EchoParam,并对对象m_EchoParam中的变量进行初始化。m_EchoParam.frame_size为音频帧占用内存的位置大小,播放和录制的音频帧占用内存的位置大小都为该值;m_EchoParam.play_buf_size的大小为(RECORD_DELAY+1)*m_EchoParam.frame_size;m_EchoParam.play_buf为申请的m_EchoParam.play_buf_size的大小的内存,并初始化为0;m_EchoParam.play_buf_pos默认为RECORD_DELAY*m_EchoParam.frame_size,表示录制和播放存在RECORD_DELAY帧音频数据的延后,作为回声参考的播放音频数据,会直接放在m_EchoParam.play_buf_pos开始的位置,而录制时获得其同步对齐的音频回声数据则从m_EchoParam.play_buf的开始位置获取。m_EchoParam.play_buf_started设置为false。为了描述的方便,onAudioPlayback、onAudioCapture函数传递的音频帧数的大小均与m_EchoParam.frame_size大小一致。
当音频播放需要音频数据时,函数onAudioPlayback将会被调用:
a)如果m_EchoParam.play_buf_started为flase表示没有开始,直接返回;否则进入下一步骤。
b)判断m_EchoParam.play_buf_pos>=m_EchoParam.play_buf_size,如果为真,则表示m_EchoParam.play_buf中的音频数据已满,说明播放线程与录制线程的同步出现了问题,进入步骤d)。判断m_EchoParam.play_buf_pos<(RECORD_DELAY-1)*m_EchoParam.frame_size,如果为真,那么播放线程太慢,同样说明播放线程与录制线程的同步出现了问题,进入步骤d)。否则进入步骤c)。注意这里播放线程与录制线程容许非同步的尺度为2。
c)把onAudioPlayback函数的参数audio_frame音频数据中的数据复制到从m_EchoParam.play_buf_pos处开始的m_EchoParam.play_buf中,并把m_EchoParam.play_buf_pos的大小增加m_EchoParam.frame_size,如果此时m_EchoParam.play_buf_pos小于m_EchoParam.play_buf_pos的默认值,即小于RECORD_DELAY*m_EchoParam.frame_size,把audio_frame中的数据再填一次到m_EchoParam.play_buf中,并调整m_EchoParam.play_buf_pos的大小,然后返回。返回后m_EchoParam.play_buf_pos的大小一定为RECORD_DELAY*m_EchoParam.frame_size,以保证RECORD_DELAY帧时间后,该音频数据帧将作为回声参考数据。对m_EchoParam中所有变量的操作都需要使用m_EchoParam.lock上锁。
d)运行到此步骤,说明播放与录制线程非常不稳定,需要重新设置m_EchoParam对象,并重置回音消除算法相关模块,即回音消除重新开始,避免回声消除算法中滤波器的发散。
当音频录制产生音频采集数据时,函数onAudioCapture将会被调用:
a)设置m_EchoParam.play_buf_started为true,表示开始;另外根据m_EchoParam.play_buf_pos变量是否为0判断当前m_EchoParam.play_buf中的音频数据是否为空。如果不为空进入下一步骤,否则进入步骤c)。
b)取m_EchoParam.play_buf起始位置的m_EchoParam.frame_size大小的数据作为回音相关数据,调用echoCancellation函数进行回声消除;然后更新m_EchoParam.play_buf中有效的音频回声参考数据,即把m_EchoParam.play_buf中的以m_EchoParam.frame_size开始到m_EchoParam.play_buf_pos结束的所有音频数据复制到m_EchoParam.play_buf起始的位置,同时把m_EchoParam.play_buf_pos减去m_EchoParam.frame_size。对m_EchoParam中所有变量的操作都需要使用m_EchoParam.lock上锁。
c)当m_EchoParam.play_buf中没有数据,说明播放线程中没有数据,也就没有相对应的回声数据了,音频采集数据不会含有回声,这时候不需要进行回声消除函数调用。此时需要重置m_EchoParam对象,同样重置m_EchoParam对象需要使用m_EchoParam.lock上锁,重置m_EchoParam对象主要是为了保证播放与录制同步的状态,因为后面播放线程马上产生的音频数据不应该马上作为回声数据。重置后由于m_EchoParam.play_buf中的数据都为0,下次onAudioCapture函数被调用时,调用echoCancellation函数,也不会对数据产生影响。
对回声参考参数中所有变量的操作都需要使用m_EchoParam.lock上锁,保障多线程运行的稳定性。
本实施例还公开了一种存储介质,该存储介质上存储有计算机程序,计算机程序被处理器执行时实现语音电话回音消除方法。
本实施例还公开了一种电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序:处理器执行计算机程序时实现语音电话回音消除方法。
参见图2所示,本发明实施例还公开了一种语音电话回音消除系统,包括:
参数获取模块,其用于获取用户预设的延迟帧数,以及音频播放和音频录制中音频帧占用内存的位置大小;
内存空间设置模块,其用于在内存中申请用于存储播放音频数据第一空间,定义第一空间中用于存放播放音频数据的位置,存放播放音频数据的位置默认值为延迟帧数与音频帧占用内存的位置大小之乘积;
数据存放模块,其用于当音频播放线程需要获取播放音频数据时,调用音频播放函数将当前播放音频数据存放于存放播放音频数据的位置的开始之处;
数据获取模块,其用于当音频录制线程产生音频采集数据时,调用音频录制函数从第一空间的开始位置获取一个音频帧占用内存的位置大小的播放音频数据作为回声参考数据;
回声消除模块,其用于调用回声消除函数使用回声参考数据进行回声消除。
数据存放模块用于通过音频播放函数将播放音频数据复制到第一空间中,存放在存放播放音频数据的位置处,并将存放播放音频数据的位置的开始之处增加一个音频帧占用内存的位置大小;若存放播放音频数据的位置<延迟帧数与音频帧占用内存的位置大小之乘积,则重复将播放音频数据复制到第一空间中,直至存放播放音频数据的位置的开始之处为延迟帧数与音频帧占用内存的位置大小之乘积。
数据获取模块用于调用音频录制函数从第一空间的开始位置获取一个音频帧占用内存的位置大小的播放音频数据作为回声参考数据后,将第一空间中从一个音频帧占用内存的位置大小开始到延迟帧数与音频帧占用内存的位置大小之乘积结束的所有播放音频数据复制到第一空间的开始位置,同时将存放播放音频数据的位置的开始之处减去一个音频帧占用内存的位置大小。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。