3

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

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

例子:

https://clyp.it/lnz1aybd

我的针长 1 到 2 秒。

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

我尝试使用Aurio.AudioFingerPrint没有成功

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!");
}

我的方法有什么问题?
任何人都知道我缺少小型 wav 的配置吗?

4

1 回答 1

5

可能为时已晚,但我是 Aurio 的作者,可以为您提供帮助。我假设您正在使用FingerprintGenerator来自Aurio.Matching.HaitsmaKalker2002命名空间的 ,但它也与来自其他命名空间的其他指纹识别方法相似。

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

默认情况下,该HaitsmaKalker2002方法的指纹由 256 个子指纹组成。这个长度是在FingerprintStore指纹匹配发生的地方配置的。子指纹是根据从采样率为 5512 的下采样音频流中获取的切片(窗口)计算的。窗口长 2048 个样本,每 64 个样本获取一次。这些值在用于配置FingerprintGenerator提取指纹的配置文件中设置。您可以在 中找到提到的值DefaultProfile。使用此配置,您需要至少 1 / 5512 * (255 * 64 + 2048) =~ 3.4 秒的音频才能生成指纹。每个后续指纹只需要多出 64 个音频样本,因此使用 4 秒的音频,您已经获得了 313 个指纹,并且匹配的机会要高得多。

在您的情况下,您需要缩短指纹所需的音频长度,您可以通过为FingerprintGenerator(扩展DefaultProfile或调整配置值)创建自定义配置文件或调整FingerprintStore. 要将最小音频时间减半,您可以例如将 的 加倍或SampleRate减半,或将指纹长度减半,或将所有这些可能性结合起来。FrameStepDefaultProfile

// 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;

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

请记住,已选择默认值是因为它们会带来良好的结果。在不知道您在做什么的情况下更改它们可能会导致大量误报或遗漏,但由于您的输入文件非常短,您必须尝试一下。我建议尝试AudioAlign,它基本上是一个围绕 Aurio 的 GUI,您可以在其中添加两个测试文件并非常轻松地试验FingerprintSizeThreshold值,它甚至会以图形方式显示音频文件中的匹配项,您可以直接收听它们。

于 2016-11-22T19:29:30.913 回答