小波中的 C# 音频指纹

标签 c# fft spectrum audio-fingerprinting

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

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

例子:

https://clyp.it/lnz1aybd

我的针有 1 或 2 秒长。

所有的 wavs 都是 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 的配置吗?

最佳答案

可能为时已晚,但我是 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 .要将最短音频时间减半,您可以例如双倍SampleRateFrameStep 的一半的 DefaultProfile ,或者将指纹长度减半,或者将所有这些可能性结合起来。

// 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,您可以在其中添加两个测试文件并使用 FingerprintSize 进行试验。和 Threshold值非常容易,它甚至会以图形方式显示音频文件中的匹配项,您可以直接收听它们。

关于小波中的 C# 音频指纹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39400516/

相关文章:

c# - 序列化强类型对象列表

c# - 如何将通用集合转换为通用祖先集合?

python - 如何像 Python numpy.fft.rfft 中那样在 cv::dft 中指定 FFT 长度

python - 将 FFT 频谱幅度归一化为 0dB

android - 访问 MediaPlayer 中的音频缓冲区

c# - 带有 ExecuteReaderAsync CommandBehavior.SequentialAccess 的 ASP.NET webapi HttpResponseMessage

c# - 自动化 Windows 防火墙

java - 为什么我的 FFT 给出的可视化器输出与 Windows Media Player 不同?

python快速傅里叶系数过滤和阈值判定

transform - 如何从傅里叶变换绘制频谱