C# аудио-дактилоскопия в небольших wavs
Мне нужно найти в похожем файле WAV в небольшой базе данных около 40 файлов с длиной от 5 до 7 секунд.
Эти wav-файлы - это записи, которые поставщик услуг телефонной связи дает вам, когда вы звоните.
Пример:
Моя игла длится 1 или 2 секунды.
все файлы WAV кодируются в 16 бит на 8000 Гц.
Я пытался использовать 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?
1 ответ
Может быть, уже слишком поздно, но я автор 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
разрешить более высокий запас ошибок (поскольку фактическая полезная нагрузка аудио слишком коротка и никогда нигде не будет полностью соответствовать. Однако вам придется выполнять внешнее заполнение, потому что этот вариант использования в настоящее время невозможен через API Aurio.
Пожалуйста, имейте в виду, что значения по умолчанию были выбраны, потому что они приводят к хорошим результатам. Изменение их без ведома того, что вы делаете, может привести к множеству ложных срабатываний или промахов, но поскольку ваши входные файлы очень короткие, вам придется попробовать. Я рекомендую попробовать AudioAlign, который в основном представляет собой графический интерфейс для Aurio, где вы можете добавить свои два тестовых файла и поэкспериментировать с FingerprintSize
а также Threshold
значения очень легко, и он даже графически покажет вам совпадения в аудиофайлах, и вы можете напрямую слушать их.