如何从立体声音频信号中提取人声部分?

信息处理 声音的 下采样 mp3 背景减法
2022-01-07 03:08:16

我现在正在处理 MP3 文件并遇到这个问题。我的 MP3 是立体声编码的。我想要做的是提取人声部分以进行进一步处理(无论输出信号的模式,单声道或立体声都可以)。

据我所知,音频在 MP3 中被编码成不同的不相交的子频带。我想我可以通过适当设置截止频率的高通/低通滤波器将信号限制在人声范围内。但是,在这种情况下,结果必须包含部分纯音乐信号。或者在谷歌搜索之后,我想我可以先计算背景信号(通过将一个通道与另一个通道的信号相加,假设人声部分位于立体声音频的中心,称为相位消除)。经过这种转换,信号是单声道的。然后我应该将原始立体声合并为从中提取背景信号的单声道。

鉴于有效性,哪个是首选(或任何其他解决方案:)?如果第二个,让两个通道A和B,计算背景时会使用(BA)还是(AB)?与合并两个通道一样,算术意味着足够准确吗?或者我可以将每个通道下采样两倍并将下采样的信号作为单声道结果​​交错?

谢谢和最好的问候。

2个回答

首先,数据在 mp3 文件中的编码方式与问题无关,除非您的目标是进行压缩域处理​​(这将是非常愚蠢的)。因此,您可以假设您的算法适用于解压缩的时域数据。

和/差是一个非常非常基本的声音抑制技巧(不是提取)。它基于这样的假设,即人声在立体声场的中心混合,而其他乐器则横向平移。这很少是真的。LR 和 RL 听起来是一样的(人耳对全局相移不敏感)并且会给你一个单声道混音,而不是在中心混合乐器。问题是,一旦你恢复了背景,你会用它做什么?尝试从中心(平均)信号中抑制它?这行不通,你会做 (L + R) / 2 - (L - R),这不是很有趣......你可以尝试这些的任何线性组合(平均和“中心移除”),什么都没有会出来的!

关于滤波方法:声音的 f0 很少超过 1000 Hz,但其谐波可以超过该值。去掉最高频率会使辅音(尤其是 sss、chhh)不愉快。一些男性声音低于 100 Hz。不过,您可以安全地切掉任何低于 50 或 60 Hz(低音、底鼓)的声音

语音分离方面的一些最新发展值得探索:

  • Jean Louis Durrieu 的背景 NMF + 谐波梳 > 滤波器模型。Python代码在这里
  • Rafii 的背景提取方法代码直截了当,并且在计算机制作的音乐中表现出色,具有非常重复的模式,如电子、嘻哈......
  • Hsu 的方法是基于 f0 检测、跟踪和掩蔽。“从音乐伴奏中歌唱音高提取和语音分离的串联算法”(找不到可访问的 PDF)。

感谢您的参考!您忘记提及您在鼓增强方面的工作,这可能对 Summer_More_More_Tea 的应用程序也很感兴趣。好吧,这一切都取决于你想用它做什么。你有一个特定的“最终应用程序”吗?

我完全同意皮切内特的上述说法。不过,为了完整起见,我应该说,您提到的人声增强功能也已用于 Matti Ryynänen 在卡拉 OK 音轨生成方面的一些作品中,以增强效果。

要回答您的问题:

鉴于有效性,哪个是首选(或任何其他解决方案:)?

正如 pichenettes 所说,似乎两者都不适合您的需要:由于人声的谐波结构(以及更普遍的任何“有趣”声音 - 即正弦曲线之外的任何东西...... )。

如果第二个,让两个通道A和B,计算背景时会使用(BA)还是(AB)?与合并两个通道一样,算术意味着足够准确吗?

同样,您提到的第二种方法不会这样做,因为您只能删除中心的信号,而不是检索它。换句话说,即使人声在“中心”,也没有简单的数学来获得只有人声的信号。

或者我可以将每个通道下采样两倍并将下采样的信号作为单声道结果​​交错?

呃......如上所述,平均通道以获得单通道信号是有意义的,并且不会破坏信号的频谱特性(假设立体声信号没有退化)。因此,您获得了一个单声道信号,其中基本上具有与以前相同的音乐内容。

正确地对每个通道进行下采样意味着您首先应用低通滤波器(在您的情况下,截止频率为 sampling_rate/4),然后您可以安全地每 2 个样本进行采样。然而,关于交错这样下采样的通道并没有太多可说的:在大多数情况下,这会破坏信号的频谱特性。你可能不希望那样。

实际上,低通滤波的操作随后每 2 个样本设置为 0,并在傅里叶域中保持这些 0 的引线,以“镜像”保留在高频分量上的低频分量。记住关于采样理论的信号处理课程:乘以一系列脉冲(或狄拉克)会导致与傅里叶域中的另一个狄拉克序列进行卷积,即在这种情况下,信号的频谱是重复的(周期化的)沿频率轴,周期等于采样率。

通常,在下采样时,您会删除 0(因为您假设新的采样率)。但是在这里,保留它们会导致非常烦人的额外高频分量。交织这些信号并不能纠正这一点。

好吧,总而言之,简短的回答是:不要那样做:-)

最后,我可能还建议您使用我为 LVAICA 2012 会议开发的 GUI:它有一个git repo我仍在调试和改进它,欢迎评论:D

希望有帮助!