到目前为止,我一直在尝试:我将最近的《星期六夜现场》一集中的五分钟节录切成两段。然后,我将这些标记为“笑”或“不笑”。然后,我使用Librosa的MFCC特征提取器对数据进行了K-Means聚类,并获得了良好的结果-这两个聚类非常整齐地映射到我的标签上。但是,当我尝试遍历较长的文件时,这些预测并没有成立。我将不进行盲目拆分和排序,而是手动提取它们,以使没有对话会污染信号。然后,我将它们分成四分之一秒剪辑,计算它们的MFCC,并用它们来训练SVM。
这时我的问题:
这有意义吗?
统计资料对您有帮助吗?我一直在Audacity的频谱图查看模式中滚动浏览,我可以很清楚地看到发生笑声的地方。在对数功率谱图中,语音具有非常独特的“皱纹”外观。相反,笑声相当均匀地覆盖了广泛的频率范围,几乎就像是正态分布一样。甚至可以通过掌声所代表的频率范围更有限的方式在视觉上将掌声与笑声区分开。这让我想到了标准偏差。我看到有一种叫做Kolmogorov–Smirnov的测试,可能对这里有用吗? )
线性频谱图似乎表明笑声在较低频率时更活跃,并在较高频率时逐渐消失-这是否意味着它相当于粉红噪声?如果是这样,那可以成为这个问题的立足点吗?如果我弄糊涂了,我会感到惊讶。
#1 楼
根据您的观察,可以清楚地区分信号的频谱,可以将其用作对语音笑声进行分类的功能。有很多方法可以解决问题。
方法#1
一旦出现这种情况,您只需看一下MFCC的向量即可。并将其应用于任何分类器。由于您在频域中有很多系数,因此您可能希望借助基于此的增强算法(例如Adaboost)查看Cascade分类器的结构,因此可以在语音课与笑课之间进行比较。
方法#2
您意识到语音实质上是随时间变化的信号。因此,一种有效的方法是查看信号本身的时间变化。为此,您可以将信号分成几批样本,然后查看该时间段的频谱。现在,您可能会意识到,在规定的持续时间内笑声可能会具有更多重复的模式,因为语音固有地具有更多信息,因此频谱变化会更大。您可以将其应用于HMM类型的模型,以查看您是否对于某个频谱始终保持在同一状态下,或者是否不断变化。在这里,即使偶尔的语调类似于笑声,也会有更多的时间变化。
方法3
强制对信号应用LPC / CELP类型的编码,并观察残留物。 CELP编码使语音产生模型非常精确。
参考文献中的内容:短期编码理论
短期预测和长期预测后,语音信号中的冗余几乎被消除语音信号的预测和残差几乎没有相关性。然后,搜索
激励以合成语音,并从固定码本中搜索码本
的索引和增益。最佳
码本索引选择标准基于本地合成语音与原始语音信号之间的MMSE。简单地说,毕竟分析器预测的语音是去除了-剩下的就是残留物,该残留物被传输以重建精确的波形。
如何解决您的问题?基本上,如果您使用CELP编码,则信号中的语音大部分会被去除,剩下的就是残留。在笑声的情况下,可能会保留大部分信号,因为CELP无法通过声道建模来预测这种信号,因为单个语音的残留量很小。您还可以在频域中分析此残留物,以查看它是笑声还是语音。
评论
我同意“不需要神经网络来获得可靠的笑声检测器”。考虑到如果您是对的,并且笑声轨迹是iid笑声的(加权)总和,我也同意您向信号发出Kolmogorov的信号,那么您应该会获得某种正常的功能。也许您仍然想提高频率分辨率。顺便说一句,对于那些“不喜欢” DSP的人,您的行话是很好的:)可悲的是,我不是音频专家,所以我可能不是很有帮助。我很乐意提供帮助。您有训练数据吗?最重要的事情之一是数据标记。垃圾进垃圾出。最简单,最有效的方法之一是训练一袋框架GMM并评估可能性。
您可能需要先检查一下,是否可以通过在给定时间检查信号的功率/幅度来将笑声与静默分开。使您有可能限制发生“事情”的时刻。然后,您可以尝试查看频率的分布。例如,语音可能有一些独特的尖峰(不必理会这些峰到底在哪里,只要它们存在),而笑声就如您所说的一样。跟踪它可能会产生一个值,以决定是否发笑。 (您需要音量信息,以确保您没有统一的沉默)