确定在纯语音录音中唱歌的开始位置

信息处理 声音的 信号检测
2021-12-31 05:38:13

我有一个小卡拉 OK 风格的应用程序,用户在其中唱 4 行歌曲,每行之间有 1 秒的间隔。没有背景音乐,所以只有声音,希望能让问题更容易解决。

我正在寻找最可靠的方法来准确检测用户在录音中从第 1 行开始和结束的位置、第 2 行的开始和结束位置等。

我拼凑了一个简单的算法,当录音中的背景噪音非常少时(比如什么时候发生这种情况?),但在存在最小噪音的情况下它就会崩溃。

谁能指出我更强大的东西?

4个回答

如果背景噪声是白色的,您可以测量频谱平坦度并在幅度高于某个阈值且频谱平坦度低于某个阈值时将其视为语音。

基本上,您只需对一大块信号进行 FFT,然后将频谱幅度的几何平均值除以算术平均值。

您还可以使用带通滤波器仅强调人声通常所在的频率区域(就像在测量频谱平坦度之前将 FFT 的不需要的区域设置为 0 一样简单)

我过去使用过光谱通量,它似乎工作得很好。基本思想是,在您关心的频段上创建信号的频谱图。让我们假设您的频率在 y 轴上,而您的时间在 x 轴上,就像这样

这意味着您的频谱图是一个矩阵。每一列代表信号的一个快照的 FFT 绝对值,每一行代表一个波段的能量如何随时间变化。

现在,简单地取列的差异。也就是说,取一列,并从其自身减去它之前的列,并对所有列执行此操作。(显然不理会开始列)。然后对所有波段求和。也就是说,只需将所有行加在一起。

您最终会得到一个编码您的信号起始点的一维信号。这会告诉你你的声音从哪里开始。

编辑:

既然您已经检测到起始,如果您想检测相反的情况(即,当信号从有活动变为无活动时),光谱通量实际上会为您提供该信息。无论你在哪里开始,你都会有一个积极的高峰,而无论你在哪里有一个“deset”(因为没有更好的词),你都会有一个消极的高峰。

我会简单地取第一个正峰值和最后一个负峰值来标记我的信号的总开始和停止时间。

根据我的经验,我会尝试研究Mel-Frequency-Cepstrum-Coefficients (MFCCs)如果您有可用的 FFT 并且在语音处理中非常常用,则 MFCC 相当容易实现。

使用 MFCC,您应该能够区分实际语音数据和噪声。

光谱通量”(也称为“光谱差异”)是“发病检测”的常用方法。基本上,您对信号进行连续 FFT,并将 FFT 桶从一个样本到下一个样本的差异幅度相加。“开始”通常由该值的实质性“跳跃”表示。

谷歌“发病检测”以获取其他想法。