Skip to content

Instantly share code, notes, and snippets.

@ikumasa
Created July 14, 2017 07:41
Show Gist options
  • Save ikumasa/d9ca83b6a502d92c43754b39fb973975 to your computer and use it in GitHub Desktop.
Save ikumasa/d9ca83b6a502d92c43754b39fb973975 to your computer and use it in GitHub Desktop.
package org.gennai.audio_analyzer.analysis;
import java.io.IOException;
import java.util.List;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import org.gennai.audio_analyzer.analysis.AudioTest.Audio;
import org.gennai.audio_analyzer.analysis.audio.AudioSamples;
import org.gennai.audio_analyzer.analysis.config.FingerprintConfig;
import org.gennai.audio_analyzer.analysis.dao.IModelReference;
import org.gennai.audio_analyzer.analysis.dao.data.FingerprintData3;
import org.gennai.audio_analyzer.analysis.dao.data.SoundData;
import org.gennai.audio_analyzer.analysis.fft.SpectrumService;
import org.gennai.audio_analyzer.analysis.fft.SpectrumService.Mode;
import org.gennai.audio_analyzer.analysis.inmemory.InMemoryModelService;
import org.gennai.audio_analyzer.analysis.inmemory.RAMStorage;
import org.gennai.audio_analyzer.analysis.musicg.FingerprintManager;
import org.gennai.audio_analyzer.analysis.musicg.FingerprintProperties;
import org.gennai.audio_analyzer.analysis.musicg.FingerprintSimilarity;
import org.gennai.audio_analyzer.analysis.musicg.FingerprintSimilarityComputer;
public class MusicgSample {
private FingerprintConfig fingerprintConfig;
private FingerprintProperties config;
private InMemoryModelService modelService;
private FingerprintManager manager;
private SpectrumService spectrumService;
private MusicgSample() {
fingerprintConfig = new FingerprintConfig();
config = new FingerprintProperties();
RAMStorage storage = new RAMStorage(
fingerprintConfig.getHashingConfig().getNumberOfLSHTables());
modelService = new InMemoryModelService(storage);
manager = new FingerprintManager(config);
spectrumService = new SpectrumService();
}
private void insertHashData(String wavFile)
throws UnsupportedAudioFileException, IOException, LineUnavailableException {
// WAVEファイル読み込み
Audio audio = AudioTest.readWave("../samples4/nom1.wav");
AudioSamples audioSamples = new AudioSamples(audio.getData(), audio.getOrigin(),
(int) audio.getFormat().getSampleRate());
// magnitude 算出
double[][] spectrogram = spectrumService.spectrogram(audioSamples, Mode.MAGNITUDE,
fingerprintConfig.getSpectrogramConfig());
// ノーマライズ
spectrumService.normalize(spectrogram);
// Fingerprint の作成
byte[] fingerprint = manager.spectrogramToFingerprint(spectrogram);
// メタデータをモデルに登録
double length = (double) audio.getData().length / audio.getFormat().getSampleRate()
/ audio.getFormat().getChannels();
IModelReference<?> soundReference = modelService.saveSound(new SoundData(length));
// Fingerprint をモデルに登録
modelService.insertFingerprintForSound(fingerprint, soundReference);
}
private void query(String wavFile)
throws UnsupportedAudioFileException, IOException, LineUnavailableException {
// WAVEファイル読み込み
Audio audio = AudioTest.readWave("../samples4/nom1.wav");
AudioSamples audioSamples = new AudioSamples(audio.getData(), audio.getOrigin(),
(int) audio.getFormat().getSampleRate());
double[][] spectrogram = spectrumService.spectrogram(audioSamples, Mode.MAGNITUDE,
fingerprintConfig.getSpectrogramConfig());
spectrumService.normalize(spectrogram);
byte[] fingerprint = manager.spectrogramToFingerprint(spectrogram);
// モデルに登録されているすべての Fingerprint を取得
List<FingerprintData3> fingerprints = modelService.findAllFingerprints();
for (FingerprintData3 fingerprintData : fingerprints) {
// すべての Fingerprint と 検索条件の fingerprint の近傍を計算
FingerprintSimilarityComputer computer = new FingerprintSimilarityComputer(
fingerprint, fingerprintData.getFingerprint(), config);
FingerprintSimilarity similarity = computer.getFingerprintsSimilarity(config);
System.out.printf("id: %d, score: %f\n", fingerprintData.getSoundReference().getId(),
similarity.getSimilarity());
}
}
public static void main(String[] args)
throws UnsupportedAudioFileException, IOException, LineUnavailableException {
MusicgSample musicgSample = new MusicgSample();
musicgSample.insertHashData("../samples4/nom1.wav");
musicgSample.query("../samples4/nom1.wav");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment