在寻找此问题的答案时,我发现此板决定从Stack Overflow交叉发布我的这个问题。


我正在寻找一种确定两个对象之间相似性的方法。音频段和人的声音,用数字表示。

我已经搜索了很多,但是到目前为止我发现的内容(下面详细介绍)确实不符合我的需求:<一种方法是使用语音识别软件从音频片段中获取单词。但是,这种方法无法提出与人类语音“相似”的音频。它通常可以判断音频中是否有单词,但是如果没有确定的单词,就无法判断音频是否包含这些单词。例如:CMU Sphinx,Dragonfly,SHoUT
更多有前途的方法称为语音活动检测(VAD)。但是,这往往会有相同的问题:使用VAD的算法/程序倾向于仅返回是否已达到活动阈值,并且在该阈值之前或之后都没有“相似性”值。另外,许多人只是在寻找音量,而不是与人类语音相似。例如:Speex,监听器,FreeSWITCH

评论

从您的问题尚不清楚您是否是A /录音并说它是否包含人类语音(应用示例:从广播节目的录制中检测并删除DJ谈话);或B /进行语音输入,并说出其声音与参考音频片段的相似程度。如果是B,则您要根据哪个条件来衡量相似度。在旋律轮廓上? (例如:将歌声与歌曲匹配)。在节奏和类类上? (例如:将节拍/拟声词与鼓循环相匹配)。在音色上? (使声音与声音效果匹配)。请告诉我们您的申请。

抱歉,我的问题是您在A中详述的内容。我想确定音频片段是否是人类语音。

我一直在研究一个相关的问题-试图确定打speech /呼吸的声音何时被语音或音乐“污染”了。很难做到任何可靠性,并且不求助于“高级”语音识别算法(如果它们甚至可以工作的话)。我的一个观察是,语音倾向于具有不规则的节奏,而音乐(通常)是规则的。也许还有“光谱平坦度”值得研究(我仍在出于我的目的评估其优点)。

(详细一点:我发现,根据音频的FFT计算出的频谱平坦度的标准化标准差似乎反映了某种音频质量。)

#1 楼

通常使用机器学习技术解决此类问题。

将信号分解为20ms或50ms的帧序列。提取每个帧上的特征。 MFCC通常适合这种应用,尽管它具有语音检测所特有的功能(4 Hz调制能量-大约是人们说话的速率;过零率)。

然后,使用您已手动标记为语音/非语音的音频训练集,在帧特征上训练分类器(高斯混合模型,SVM ...)。未标记的帧分为语音/非语音类。最后一步是使决策平滑(被数百个语音帧包围的被分类为非语音的帧很可能是分类错误),例如使用HMM或仅使用中值滤波器。

A少数参考文献:

音频文档中语音/音乐的鲁棒分类(Pinquier等人)
多媒体应用中的语音/音乐歧视(El-Maleh等人)
功能比较用于语音/音乐辨别(Carey等人)

请注意,它们描述的功能和分类技术也与检测语音的一类问题(而不是区分语音和其他事物)有关。在这种情况下,您可以使用1类建模技术(例如1类SVM),或者仅将针对语音数据训练的GMM中的似然度得分作为“语音”度量。

如果另一方面,您的问题实际上是区分语音与其他内容(例如音乐),您也可以很好地使用无监督方法,这些方法专注于检测相似音频内容之间的边界-而不是识别此内容本身。 >

评论


$ \ begingroup $
谢谢,这可以帮助很多!将信号分解为小窗口有什么好处?因为我正在寻找的输出是一个描述整个音频片段的数值,所以提取整个信号的特征而不是特定窗口的特征会更好吗?
$ \ endgroup $
– Jeff Gortmaker
2012年6月16日14:37

$ \ begingroup $
在很长的窗口内计算特征(尤其是频谱特征或倒频谱特征)将平均或抵消某些使语音脱颖而出的属性。您可以通过将许多简短的语音片段混合在一起来验证自己的身份-很难将结果识别为语音。因此最好对小段进行分类;并根据您的情况汇总得分(例如,计算GMM给出的似然得分的平均值;或计算由二进制分类器分类为语音的帧的百分比)。
$ \ endgroup $
–小食
2012年6月16日15:19

$ \ begingroup $
为了更加精确,请记住,当您查看频谱时,时间维是“折叠的”。例如,500 Hz音调的功率谱随时间跟随1kHz音调,类似于同时播放的这两个音调的功率谱;因此,在很长一段时间内,变化很大的信号的功率谱看起来并不能很好地代表信号的内容。
$ \ endgroup $
–小食
2012年6月16日15:22