Проблема
Наш клиент запросил инструмент для определения того, используются ли их звуковые эффекты / звуки как часть других игр / библиотек. Их звуковые эффекты имеют длину около 200-500 мс.
Они уже получили более 50000 звуковых эффектов (разной длины), которые они хотят проверить.
Звуковые эффекты, которые мы пытаемся обнаружить, будут быть практически идентичным по звуку, с небольшой потерей данных из-за преобразования из wav в mp3. SFX можно использовать как часть более длинного звука. Например, они уже видели, как звуковые эффекты длительностью около 300 мс используются в середине 5-секундных звуковых эффектов другой игры.
То, что мы уже пробовали
Мы пробовали библиотеки, такие как dejavu (Python) и musicg (Java), которые используют отпечатки пальцев, но по умолчанию отпечатки пальцев не подходят для очень маленьких звуковых образцов, они, похоже, дают много ложных срабатываний.
Что мы ищем:
Мы больше всего довольны API musicg. Но мы изо всех сил пытаемся найти правильную конфигурацию, чтобы с высокой точностью сопоставить небольшую часть звуков. Мы хотели бы получить совет о том, как настроить musicg, чтобы он мог обнаруживать фрагменты длиной ~ 250 мс?
private int numRobustPointsPerFrame=4; // number of points in each frame, i.e. top 4 intensities in fingerprint
private int sampleSizePerFrame=2048; // number of audio samples in a frame, it is suggested to be the FFT Size
private int overlapFactor=4; // 8 means each move 1/8 nSample length. 1 means no overlap, better 1,2,4,8 ... 32
private int numFilterBanks=4;
private int upperBoundedFrequency=1500; // low pass
private int lowerBoundedFrequency=400; // high pass
private int fps=5; // in order to have 5fps with 2048 sampleSizePerFrame, wave's sample rate need to be 10240 (sampleSizePerFrame*fps)
private int sampleRate=sampleSizePerFrame*fps; // the audio's sample rate needed to resample to this in order to fit the sampleSizePerFrame and fps
private int numFramesInOneSecond=overlapFactor*fps; // since the overlap factor affects the actual number of fps, so this value is used to evaluate how many frames in one second eventually
private int refMaxActivePairs=1; // max. active pairs per anchor point for reference songs
private int sampleMaxActivePairs=10; // max. active pairs per anchor point for sample clip
private int numAnchorPointsPerInterval=10;
private int anchorPointsIntervalLength=4; // in frames (5fps,4 overlap per second)
private int maxTargetZoneDistance=4; // in frame (5fps,4 overlap per second)
private int numFrequencyUnits=(upperBoundedFrequency-lowerBoundedFrequency+1)/fps+1; // num frequency units