小 wav 中的 C# 音频指纹

Fra*_*aga 3 c# fft spectrum audio-fingerprinting

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

这些 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!");
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_* Gu 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;
Run Code Online (Sandbox Code Playgroud)

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

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