2016-09-08 44 views
2

我需要找到一个类似的wav文件中的一个小型数据库约40个文件的长度从5和7秒。C#音频指纹在小wavs

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

实施例:

https://clyp.it/lnz1aybd

我的针是1或2秒长。

所有的wavs都是pcm在8000hz mono编码的16位

我尝试没有成功

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.AudioFingerPrint
任何人都知道我缺少的小wavs的配置?

+0

顺便说一句,要求'另一个图书馆'通常被认为是脱离主题,并导致问题被搁置或关闭。我想过,但在这篇文章的情况下,主要原因是为什么你的代码片段找不到匹配,所以这是完美的主题。只是要小心要求图书馆。随着时间的推移,图书馆会随着时间的推移而变化,发展并消亡这就是为什么这些问题没有被考虑为“好”的原因 - 要求图书馆提出的问题不可能被“完全解答”。总是有新的东西或某人相信另一个图书馆更好 – quetzalcoatl

+0

您是否检查过指纹识别器是否能找到适合理想情况的匹配项?获取这40个音频文件中的一个并使用该文件作为针运行程序。有了完美的输入,任何(工作)指纹服务应至少返回一个匹配。如果它在一个完美的针上,但不是在你的实际输入上工作,那么也许这是一个配置问题,而不是自我编码(即某些阈值或时间窗口太低/高等)。 – quetzalcoatl

+0

谢谢你是对的我删除了“其他图书馆”的问题。 – Fraga

回答

4

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

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

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

在你的情况,你需要缩短指纹所需的音频长度,你可以做到这一点通过创建为FingerprintGenerator自定义配置文件(扩展DefaultProfile或调整配置值)或调整匹配阶段的设置FingerprintStore。要将最短音频时间缩短一半,您可以加倍SampleRateDefaultProfileFrameStep的一半,或减半指纹长度,或者综合所有这些可能性。

// 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值,它甚至会以图形方式显示音频文件中的匹配项,并且您可以直接聆听它们。