小波中的c#音频指纹识别

本文关键字:音频 指纹识别 | 更新日期: 2023-09-27 18:06:20

我需要在一个大约40个文件的小数据库中找到一个类似的wav文件,长度从5到7秒。

这些wav文件是电话服务提供商在你打电话时给你的记录。

的例子:https://clyp.it/lnz1aybd

我的针长1或2秒。

所有的波都是pcm编码的16位8000hz单声道

我尝试使用Aurio。AudioFingerPrint without success

https://github.com/protyposis/Aurio

// Setup the sources
var audioTrack1 = new AudioTrack(new FileInfo("Full5secs.wav"));
var audioTrack2 = new AudioTrack(new FileInfo("Part2Secs.wav"));
// Setup the fingerprint generator
var defaultProfile = FingerprintGenerator.GetProfiles()[0];
var generator = new FingerprintGenerator(defaultProfile);
// Create a fingerprint store
var store = new FingerprintStore(defaultProfile);
// Setup the generator event listener (a subfingerprint is a hash with its temporal index)
generator.SubFingerprintsGenerated += (sender, e) => {
    var progress = (double)e.Index / e.Indices;
    var hashes = e.SubFingerprints.Select(sfp => sfp.Hash);
    store.Add(e);
};
// Generate fingerprints for both tracks
generator.Generate(audioTrack1);
generator.Generate(audioTrack2);
// Check if tracks match
if (store.FindAllMatches().Count > 0) {
   Console.WriteLine("overlap detected!");
}

我的方法有什么问题?
有人知道我缺少小波的配置吗?

小波中的c#音频指纹识别

可能太晚了,但我是Aurio的作者,可以帮助您解决这个问题。我假设您正在使用Aurio.Matching.HaitsmaKalker2002名称空间中的FingerprintGenerator,但它也将与其他名称空间中的其他指纹识别方法相似。

你的问题是默认配置的指纹需要大约3秒的音频,这意味着2秒长的音频文件不会产生指纹,因此你无法得到匹配。

缺省情况下,HaitsmaKalker2002方法的指纹包含256个子指纹。这个长度在进行指纹匹配的FingerprintStore中配置。子指纹是计算从切片(窗口)采取下采样音频流与5512的采样率。窗口长2048个样本,每64个样本取一次。这些值在配置文件中设置,该配置文件用于配置提取指纹的FingerprintGenerator。您可以在DefaultProfile中找到上述值。使用这种配置,您至少需要1/5512 *(255 * 64 + 2048)=~ 3.4秒的音频才能生成指纹。每个指纹只需要64个音频样本,所以4秒音频你已经得到313个指纹,匹配的机会要高得多。

在您的情况下,您需要缩短指纹所需的音频长度,您可以通过为FingerprintGenerator创建自定义配置文件(扩展DefaultProfile或调整配置值)或调整FingerprintStore中匹配阶段的设置来实现这一点。要将最小音频时间减半,您可以将SampleRate加倍或将DefaultProfileFrameStep减半,或将指纹长度减半,或将所有这些可能性组合在一起。

// Setup the fingerprint generator
var defaultProfile = FingerprintGenerator.GetProfiles()[0];
defaultProfile.SampleRate = 11025; // Adjust the profile
var generator = new FingerprintGenerator(defaultProfile);
// Create a fingerprint store
var store = new FingerprintStore(defaultProfile);
// Set the fingerprint length to 128 instead of the default 256
store.FingerprintSize = 128;

另一种方法可能是通过使用silence填充来延长输入音频,但随后您可能必须提高store.Threshold以允许更高的误差范围(因为实际音频负载太短,永远不会完全匹配任何地方)。你必须在外部做填充,因为这个用例目前无法通过Aurio的API实现。

请记住,选择默认值是因为它们会导致良好的结果。在不知道自己在做什么的情况下更改它们可能会导致许多误报或遗漏,但由于输入文件非常短,您必须尝试一下。我建议尝试AudioAlign,这基本上是一个GUI围绕着Aurio,在那里你可以添加你的两个测试文件和实验FingerprintSizeThreshold值非常容易,它甚至会图形化地显示你匹配的音频文件,你可以直接听他们。