小波中的 C# 音频指纹
C# audio-fingerprintting in small wavs
我需要在一个小型数据库中找到类似的 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!");
}
我的方法有什么问题?
有人知道我缺少的小波的配置吗?
可能为时已晚,但我是 Aurio 的作者,可以为您提供帮助。我假设您正在使用 Aurio.Matching.HaitsmaKalker2002
命名空间中的 FingerprintGenerator
,但它也与其他命名空间中的其他指纹识别方法类似。
您的问题是默认配置的指纹需要大约 3 秒的音频,这意味着 2 秒长的音频文件不会产生指纹,因此您无法匹配。
默认情况下,HaitsmaKalker2002
方法的指纹由256个子指纹组成。此长度在 FingerprintStore
中进行指纹匹配。子指纹是根据从采样率为 5512 的下采样音频流中获取的切片 (windows) 计算得出的。window 的长度为 2048 个样本,每 64 个样本获取一次。这些值在用于配置提取指纹的 FingerprintGenerator
的配置文件中设置。您可以在 DefaultProfile
中找到提到的值。使用此配置,您至少需要 1 / 5512 * (255 * 64 + 2048) =~ 3.4 秒的音频才能生成指纹。接下来的每个指纹只需要 64 个以上的音频样本,所以对于 4 秒的音频你已经得到 313 个指纹并且匹配的机会要高得多。
在您的情况下,您需要缩短指纹所需的音频长度,您可以通过为 FingerprintGenerator
创建自定义配置文件(扩展 DefaultProfile
或调整配置值) 或调整 FingerprintStore
中匹配阶段的设置。要将最短音频时间减半,您可以例如SampleRate
的两倍或 DefaultProfile
的 FrameStep
的一半,或指纹长度减半,或将所有这些可能性结合起来。
// 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
值进行试验,它甚至会以图形方式向您展示在音频文件中匹配,您可以直接收听它们。
我需要在一个小型数据库中找到类似的 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!");
}
我的方法有什么问题?
有人知道我缺少的小波的配置吗?
可能为时已晚,但我是 Aurio 的作者,可以为您提供帮助。我假设您正在使用 Aurio.Matching.HaitsmaKalker2002
命名空间中的 FingerprintGenerator
,但它也与其他命名空间中的其他指纹识别方法类似。
您的问题是默认配置的指纹需要大约 3 秒的音频,这意味着 2 秒长的音频文件不会产生指纹,因此您无法匹配。
默认情况下,HaitsmaKalker2002
方法的指纹由256个子指纹组成。此长度在 FingerprintStore
中进行指纹匹配。子指纹是根据从采样率为 5512 的下采样音频流中获取的切片 (windows) 计算得出的。window 的长度为 2048 个样本,每 64 个样本获取一次。这些值在用于配置提取指纹的 FingerprintGenerator
的配置文件中设置。您可以在 DefaultProfile
中找到提到的值。使用此配置,您至少需要 1 / 5512 * (255 * 64 + 2048) =~ 3.4 秒的音频才能生成指纹。接下来的每个指纹只需要 64 个以上的音频样本,所以对于 4 秒的音频你已经得到 313 个指纹并且匹配的机会要高得多。
在您的情况下,您需要缩短指纹所需的音频长度,您可以通过为 FingerprintGenerator
创建自定义配置文件(扩展 DefaultProfile
或调整配置值) 或调整 FingerprintStore
中匹配阶段的设置。要将最短音频时间减半,您可以例如SampleRate
的两倍或 DefaultProfile
的 FrameStep
的一半,或指纹长度减半,或将所有这些可能性结合起来。
// 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
值进行试验,它甚至会以图形方式向您展示在音频文件中匹配,您可以直接收听它们。