如何检测音频通话中的连续噪音?
我的建议是在频域中进行处理,因为有可用的方法可以直接用于解决您的问题。在许多情况下,语音“质量”与信号的信噪比 (SNR) 有关。至少,我认为您的应用程序就是这种情况——即电话通信。一般来说,“质量”的一些衡量标准可以从 SNR 中得出,低 SNR 表示“质量差”,相反,高 SNR 表示“质量好”。
因此,解决您的问题的一种方法是尝试估计记录的 SNR。为了估计SNR,可以使用众所周知的噪声功率谱密度(PSD)估计算法,例如“最小统计”算法[1]或基于最小均方误差的算法[2]。然后可以根据噪声 PSD 计算 SNR 的估计值:
$$ \hat{\text{SNR}} = \frac{P_{xx}}{\hat{P}_{nn}}-1, $$
$P_{xx}$是噪声输入信号的 PSD,$ \hat{P}_{nn}$是噪声 PSD 的估计值。可以为完整信号计算单个 SNR 估计值,但随着 SNR 随时间强烈变化,计算短信号块的 SNR 估计值可能很有用 - 典型块长度约为 $20\,$ - $30\,\文本{毫秒}$。
代替首先估计噪声 PSD,可以直接估计 SNR,例如,使用 [3] 中提出的方法。
或者,可以对语音质量或语音清晰度使用一些非侵入式(即,不需要干净的参考信号)测量。您可以尝试语音混响调制能量比测量 [4],其中 Python 和 MATLAB 中的实现是直接可用的。
参考
[1] Rainer Martin,“基于最优平滑和最小统计的噪声功率谱密度估计”,IEEE Transactions on Speech and Audio Processing,vol。9,没有。5,第 504-512 页,2001 年 7 月。PDF MATLAB 实现
[2] T. Gerkmann 和 RC Hendriks,“具有低复杂性和低跟踪延迟的无偏 MMSE-Based Noise Power Estimation”,音频、语音和语言处理,IEEE Transactions on,vol。20,没有。4,第 1383-1393 页,2012 年 5 月。PDF MATLAB 实现
[3] E. Nemer、R. Goubran 和 S. Mahmoud,“使用子带和四阶统计的语音信号的 SNR 估计”,IEEE 信号处理快报,第一卷。6,没有。7,第 171-174 页,1999 年 7 月。IEEE Xplore
[4] TH Falk、C. Zheng 和 WY Chan,“混响和去混响语音的非侵入式质量和可理解性测量”,IEEE 音频、语音和语言处理汇刊,第一卷。18,没有。7,第 1766–1774 页,2010 年 9 月。IEEE Xplore Python 实现 MATLAB 实现
您可以在较短的连续时间范围内计算能量和 fft。如果频率内容和能量在给定数量的帧内没有变化,那么您可以假设您存在噪声。(考虑到您在白噪声损坏的频道上有语音)