背景
在直播时主播经常会受到一些外部环境音、噪音等影响,直播时音频采集会一并采集所有音频推流到观众设备上,从而影响观众收听体验。因此需要在直播主播端主动进行降噪处理,提高观众收听体验。
58直播为了实现这个功能,通过综合对比调研常见的开源降噪方案Speex、WebRTC、RNNoise,以及结合降噪之后的处理效果和58直播使用体验,最终选择WebRTC降噪方案。我们对其进行了优化兼容,将其移植应用到58视频直播中,提升直播效果和体验。
降噪方案
常见的开源降噪方案
- Speex
Speex是一套主要针对语音的开源免费,无专利保护的应用集合,它不仅包括编解码器,还包括VAD(语音检测)、DTX(不连续传输)、AEC(回声消除)、NS(去噪)等实用模块。
- WebRTC
WebRTC提供了视频会议的核心技术,包括音视频的采集、编解码、网络传输、显示等功能,并且还支持跨平台:Windows、Linux、Mac、Android。我们这里使用的就是WebRTC的音频处理模块audio_processing。
- RNNoise
RNNoise降噪算法是根据纯语音以及噪声通过GRU训练来做。包含特征点提取、预料等核心部分。
RNNoise降噪算法与传统算法对比分析
传统降噪算法大部分是估计噪声+维纳滤波,噪声估计的准确性是整个算法效果的核心。根据噪声的不同大部分处理是针对平稳噪声以及瞬时噪声来做。
RNNoise的优点主要是一个算法通过训练可以解决所有噪声场景以及可以优化传统噪声估计的时延和收敛问题。
RNNoise的缺点是深度学习算法落地问题。因为相对大部分传统算法,RNNoise训练要得到一个很好的效果,由于特征点个数、隐藏单元的个数以及神经网络层数的增加,导致模型增大,运行效率。
现在就WebRTC和RNNoise的降噪集成效果进行对比验证分析。
降噪音频数据对比
音频原始PCM数据可通过Audacity软件进行分析
下图是58公司司庆直播时的截取一段音频数据,音频为双声道、44100采样率。分别用RNNoise和WebRTC进行降噪处理得出效果对比图如下:
下图是网络下载的一段带有噪音的音频数据,音频为单声道、32000采样率。分别用RNNoise和WebRTC进行降噪处理得出效果对比图如下:
综合上面两张效果图可以结论出:
RNNoise处理之后的数据更干净些,几乎没有电流音和杂音,但是受限于训练集、特征点问题,在处理一些数据时候会把正常的原声数据一并错误处理掉。
WebRTC处理之后的数据也相对干净,能更好的保持原有声音的数据,数据丢失较少。
降噪方案在直播实现
降噪方案调研过程
RNNoise过程
RNNoise的代码是基于C开源的,集成到Android中需要使用NDK。
开源项目提供的一个测试方法,但是该方法是针对文件处理的,可以把一个带噪音的PCM文件处理成无噪音文件。直播SDK中的音频数据是分段的byte数组数据,所以中间需要添加一些接口来让RNNoise来支持分段数据的降噪处理。
根据RNNoise的降噪过程和业务接口流程,把接口定义成init、process、free三个接口。
在process数据时发现RNNosie的处理窗口大小是480,所以传入的数据也必须是480的正整数倍。如果不是的话处理之后会有明显的新引入