我每天录制来自互联网的 2 分钟广播。总是有相同的开始和结束的叮当声。由于无线电广播的确切时间可能会或多或少 6 分钟,因此我必须录制大约 15 分钟的广播。
我希望确定这些叮当声在 15 分钟记录中的确切时间,这样我就可以提取我想要的音频部分。
我已经启动了一个 C# 应用程序,在其中我将 MP3 解码为 PCM 数据并将 PCM 数据转换为基于http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx的频谱图
我尝试对 PCM 数据使用互相关算法,但该算法在 6 分钟左右非常慢,步长为 10 毫秒,有时它无法找到叮当声的开始时间。
有什么算法可以比较两个频谱图进行匹配吗?还是找到叮当声开始时间的更好方法?
谢谢,
更新,抱歉耽搁了
首先,感谢所有的回答者,他们中的大多数都是相关的或有趣的想法。
我尝试实现 fonzo 提出的 Shazam 算法。但未能检测到频谱图中的峰值。这是来自三个不同记录的起始铃声的三个频谱图。我尝试了 AForge.NET 与 blob 过滤器(但它无法识别峰值),模糊图像并检查高度差异,拉普拉斯卷积,斜率分析,检测一系列垂直条(但有太多错误积极的)...
同时,我尝试了 Dave Aaron Smith 提出的 Hough 算法。我在哪里计算每列的 RMS。是的,是每一列,它是 O(N*M) 但 M << N (注意一列大约有 8k 个样本)。所以总体来说还不错,算法仍然需要大约 3 分钟,但从未失败过。
我可以采用那个解决方案,但如果可能的话,我更喜欢 Shazam,因为它是 O(N) 并且可能更快(也更酷)。多亏了添加评论,你们中的任何人是否都知道一种算法可以始终检测这些频谱图中的相同点(不一定是峰值)。
新更新
最后,我使用了上面解释的算法,我尝试实现 Shazam 算法,但未能在频谱图中找到合适的峰值,即从一个声音文件到另一个声音文件的识别点不是恒定的。理论上,Shazam 算法是这类问题的解决方案。Dave Aaron Smith 提出的 Hough 算法更加稳定有效。我拆分了大约 400 个文件,其中只有 20 个无法正确拆分。磁盘空间从 8GB 到 1GB。
谢谢你的帮助。