我每天录制2分钟的互联网广播。总是有相同的开始和结束叮当声。由于广播的确切时间可能会有所不同,大约需要6分钟,因此我必须录制大约15分钟的广播。
我希望确定15分钟录音中这些杂音的确切时间,以便提取所需的音频部分。
我已经启动了一个C#应用程序,在该应用程序中,我基于http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx将MP3解码为PCM数据并将PCM数据转换为频谱图。
我尝试在PCM数据上使用互相关算法,但是该算法在6分钟左右的过程中非常慢,步长为10ms,并且在某些情况下无法找到叮当声的开始时间。
对两个频谱图进行匹配比较的算法有什么想法吗?还是找到铃声开始时间的更好方法?
谢谢,
更新,抱歉造成延迟
首先,感谢所有的答案,其中大多数都是无关紧要的想法。
我尝试实现fonzo提出的Shazam算法。但是未能检测到光谱图中的峰。这是来自三个不同记录的起始铃声的三个频谱图。我尝试使用带有斑点过滤器的AForge.NET(但未能识别峰值),模糊图像并检查高度差,拉普拉斯卷积,斜率分析以检测一系列竖线(但错误太多)正)...
同时,我尝试了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的磁盘空间。
谢谢你的帮助。