我需要在一个小型数据库中找到一个类似的 wav 文件,该数据库包含大约 40 个文件,长度从 5 秒到 7 秒不等。
这些 wav 文件是电话服务提供商在您调用电话时提供给您的记录。
例子:
我的针有 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
.要将最短音频时间减半,您可以例如双倍SampleRate
或 FrameStep
的一半的 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/