2016-09-08 2 views
2

Мне нужно найти в подобном wav-файле в небольшой базе данных около 40 файлов длиной от 5 до 7 секунд.C# audio-fingerprintting in small wavs

Эти 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!"); 
} 

Что случилось с моим подходом?
Кто-нибудь знает конфигурацию, которую мне не хватает для небольших wavs?

+0

Кстати, запрос на «другую библиотеку» обычно считается вне темы и заставляет вопрос приостанавливать или закрывать вопрос. Я думал об этом, но в случае этого поста главное, почему ваш фрагмент представленного кода не находит соответствия, так что это отлично по теме. Просто будьте осторожны с просьбой о библиотеках. Библиотеки меняются, развиваются и умирают с течением времени. Вот почему такие вопросы не считаются «хорошими» - нет вопроса о том, что вопрос, требующий библиотеки, может быть «полностью удовлетворен». Всегда есть что-то новое или кто-то считает, что еще одна библиотека лучше – quetzalcoatl

+0

Вы проверили, сможет ли fingerprinter найти совпадение для идеального случая? Получите один из этих 40 аудиофайлов и запустите программу с этим файлом в качестве иглы. При отличном вводе любой (рабочий) сервис отпечатка пальца должен возвращать хотя бы одно совпадение. Если он работает на идеальной игле, но не на вашем фактическом входе, то, возможно, это вопрос конфигурации, а не код сам (т. Е. Некоторые пороговые значения или временные окна слишком низкие/высокие и т. Д.). – quetzalcoatl

+0

Спасибо, что ты прав. Я удалил вопрос «другая библиотека». – Fraga

ответ

4

Возможно, слишком поздно, но я автор 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 или половину FrameStepDefaultProfile, или уменьшите длину отпечатка пальца на половину или воспользуйтесь комбинацией всех этих возможностей.

// 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, чтобы позволить более высокий предел погрешности (поскольку фактическому аудио полезной нагрузки слишком коротка, и никогда не будете полностью соответствовать в любом месте Вам придется делать внешнюю оболочку извне, потому что этот прецедент в настоящее время невозможен с помощью API Aurio.

Пожалуйста, обратите внимание, что значения по умолчанию выбраны, потому что они приводят к хорошим результатам. Изменение их, не зная, что вы делаете, может привести к множеству ложных срабатываний или промахов, но поскольку ваши входные файлы очень короткие, вам придется попробовать. Я рекомендую попробовать AudioAlign, который в основном представляет собой графический интерфейс вокруг Aurio, где вы можете добавить два тестовых файла и поэкспериментировать с значениями FingerprintSize и Threshold очень легко, и он даже графически покажет вам совпадения в аудиофайлах, и вы можете их напрямую прослушать ,