我有一个小型的karaoke风格的应用程序,用户在其中唱歌4行,每行之间有一秒钟的间隔。没有背景音乐,所以只有声音,希望可以使问题更容易解决。
我正在寻找一种最可靠的方法来准确检测用户在录音中从哪里开始和结束唱歌第1行,从开始和结束唱歌第2行,等等。
我整理了一个思路简单的算法,该算法可以在录音中的背景噪音很小时(例如何时发生?)工作,但是在噪音最小的情况下会崩溃。
有人可以指出我要更强大的东西吗?
我有一个小型的karaoke风格的应用程序,用户在其中唱歌4行,每行之间有一秒钟的间隔。没有背景音乐,所以只有声音,希望可以使问题更容易解决。
我正在寻找一种最可靠的方法来准确检测用户在录音中从哪里开始和结束唱歌第1行,从开始和结束唱歌第2行,等等。
我整理了一个思路简单的算法,该算法可以在录音中的背景噪音很小时(例如何时发生?)工作,但是在噪音最小的情况下会崩溃。
有人可以指出我要更强大的东西吗?
Answers:
如果背景噪声为白色,则可以测量频谱平坦度,并在幅度高于某个阈值且频谱平坦度低于某个阈值时将其视为语音。
基本上,您只需对一部分信号进行FFT,然后将频谱幅度的几何平均值除以算术平均值即可。
您还可以使用带通滤波器仅强调人的声音通常所在的频率区域(就像在测量频谱平坦度之前将FFT的不需要区域设置为0一样简单)
我过去曾经使用过光谱通量,它似乎工作得很好。基本思想是,在您关心的频段上创建信号的频谱图。让我们假设您的频率在y轴上,您的时间在x轴上,就像这样。
这意味着您的频谱图是一个矩阵。每一列代表信号一次快照的FFT的绝对值,每一行代表一个频段的能量随时间变化的方式。
现在,只需考虑不同的列。也就是说,取一列,并从其自身减去前一列,然后对所有列进行计算。(显然,不要将开始列放在首位)。然后汇总所有频段。也就是说,将所有行加在一起。
您将最终得到一维信号,该信号将您的信号开始进行编码。这将告诉您声音的开始位置。
编辑:
现在,您已经检测到发作,如果您想检测相反的情况(也就是说,当信号从活动变为无活动时),频谱通量实际上就会为您提供该信息。无论在何处发作,都会有一个正峰,而在任何“偏位”(因为缺少更好的单词)都会有一个负峰。
我只用第一个正峰值和最后一个负峰值来标记信号的总开始和停止时间。
根据我的经验,我会尝试研究梅尔频率倒谱系数(MFCC)。如果您有FFT可用,则MFCC相当容易实现,并且在语音处理中非常普遍地使用。
使用MFCC,您应该能够将实际的语音数据与噪声区分开。
“ 谱通量 ”(也称为“谱差”)是“起始检测”的常用方法。基本上,您需要对信号进行顺序FFT,然后对一个采样点到下一个采样点的FFT桶的差值求和。“开始”通常由该值的实质“跳跃”表示。
谷歌“发病检测”的其他想法。