2016-09-08 41 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值,它甚至會以圖形方式顯示音頻文件中的匹配項,並且您可以直接聆聽它們。