/// <summary> /// Find Similar Tracks using passed audio samples as input and return a Dictionary /// </summary> /// <param name="lshHashTables">Number of hash tables from the database</param> /// <param name="lshGroupsPerKey">Number of groups per hash table</param> /// <param name="thresholdTables">Minimum number of hash tables that must be found for one signature to be considered a candidate (0 and 1 = return all candidates, 2+ = return only exact matches)</param> /// <param name="param">Audio File Work Unit Parameter Object</param> /// <returns>a dictionary of perceptually similar tracks</returns> public Dictionary <Track, double> FindSimilarFromAudioSamples( int lshHashTables, int lshGroupsPerKey, int thresholdTables, WorkUnitParameterObject param) { DbgTimer t = new DbgTimer(); t.Start(); // Get fingerprints double[][] logSpectrogram; List <bool[]> signatures = fingerprintService.CreateFingerprintsFromAudioSamples(param.AudioSamples, param, out logSpectrogram); long elapsedMiliseconds = 0; // Query the database using Min Hash Dictionary <int, QueryStats> allCandidates = QueryFingerprintManager.QueryOneSongMinHash( signatures, dbService, minHash, lshHashTables, lshGroupsPerKey, thresholdTables, ref elapsedMiliseconds); IEnumerable <int> ids = allCandidates.Select(p => p.Key); IList <Track> tracks = dbService.ReadTrackById(ids); // Order by Hamming Similarity // Using PLINQ //OrderedParallelQuery<KeyValuePair<int, QueryStats>> order = allCandidates.AsParallel() IOrderedEnumerable <KeyValuePair <int, QueryStats> > order = allCandidates .OrderBy((pair) => pair.Value.OrderingValue = pair.Value.HammingDistance / pair.Value.NumberOfTotalTableVotes + 0.4 * pair.Value.MinHammingDistance); // Join on the ID properties. var joined = from o in order join track in tracks on o.Key equals track.Id select new { track, o.Value.Similarity }; Dictionary <Track, double> stats = joined.ToDictionary(Key => Key.track, Value => Value.Similarity); Dbg.WriteLine("Find Similar From Audio Samples - Total Execution Time: {0} ms", t.Stop().TotalMilliseconds); return(stats); }
public void CreateFingerprints() { const int tenSeconds = 5512 * 10; var samples = TestUtilities.GenerateRandomAudioSamples(tenSeconds); var fingerprintConfig = new DefaultFingerprintConfiguration(); var dividedLogSpectrum = GetDividedLogSpectrum(); spectrumService.Setup(service => service.CreateLogSpectrogram(samples, It.IsAny <DefaultSpectrogramConfig>())).Returns(dividedLogSpectrum); waveletDecomposition.Setup(service => service.DecomposeImageInPlace(It.IsAny <float[]>(), 128, 32, fingerprintConfig.HaarWaveletNorm)); fingerprintDescriptor.Setup(descriptor => descriptor.ExtractTopWavelets(It.IsAny <float[]>(), fingerprintConfig.TopWavelets, It.IsAny <ushort[]>())).Returns(new TinyFingerprintSchema(8192).SetTrueAt(0, 1)); localitySensitiveHashingAlgorithm.Setup(service => service.Hash(It.IsAny <Fingerprint>(), fingerprintConfig.HashingConfig)) .Returns(new HashedFingerprint(new int[0], 1, 0f, Array.Empty <byte>())); var fingerprints = fingerprintService.CreateFingerprintsFromAudioSamples(samples, fingerprintConfig) .OrderBy(f => f.SequenceNumber) .ToList(); Assert.AreEqual(dividedLogSpectrum.Count, fingerprints.Count); }
public void ShouldRunCorrectlyForSpecificUseCase() { int sequenceNumber = 334; float[] samples = GetAudioSamples().Samples; int start = sequenceNumber * 1536; float[] troubledPart = new float[8192 + 2048]; Array.Copy(samples, start, troubledPart, 0, 8192 + 2048); var audioSamples = new AudioSamples(troubledPart, "test", 5512); var fingerprintService = new FingerprintService( new SpectrumService(new LomontFFT(), new LogUtility()), LocalitySensitiveHashingAlgorithm.Instance, new StandardHaarWaveletDecomposition(), new FingerprintDescriptor()); var fastFingerprintService = new FingerprintService( new SpectrumService(new LomontFFT(), new LogUtility()), LocalitySensitiveHashingAlgorithm.Instance, new StandardHaarWaveletDecomposition(), new FastFingerprintDescriptor()); int runs = 10; var configuration = new DefaultFingerprintConfiguration(); for (int i = 0; i < runs; ++i) { var x = fingerprintService.CreateFingerprintsFromAudioSamples(audioSamples, configuration).ToList(); var y = fastFingerprintService.CreateFingerprintsFromAudioSamples(audioSamples, configuration).ToList(); for (int j = 0; j < x.Count; ++j) { CollectionAssert.AreEqual(x[j].HashBins, y[j].HashBins); } } }
public CompareAudioForm() { // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); // // TODO: Add constructor code after the InitializeComponent() call. // // Instansiate Soundfingerprinting Repository FingerprintService fingerprintService = Analyzer.GetSoundfingerprintingService(); this.databaseService = DatabaseService.Instance; IPermutations permutations = new LocalPermutations("Soundfingerprinting\\perms.csv", ","); //IPermutations permutations = new LocalPermutations("Soundfingerprinting\\perms-new.csv", ","); IFingerprintingConfiguration fingerprintingConfigCreation = new FullFrequencyFingerprintingConfiguration(); repository = new Repository(permutations, databaseService, fingerprintService); ImageService imageService = new ImageService(fingerprintService.SpectrumService, fingerprintService.WaveletService); FileInfo filePathAudio1 = new FileInfo(@"C:\Users\perivar.nerseth\Music\Test Samples Database\VDUB1 Snare 004.wav"); FileInfo filePathAudio2 = new FileInfo(@"C:\Users\perivar.nerseth\Music\Test Samples Search\VDUB1 Snare 004 - Start.wav"); int fingerprintsPerRow = 2; double[][] logSpectrogram1 = null; double[][] logSpectrogram2 = null; List <bool[]> fingerprints1 = null; List <bool[]> fingerprints2 = null; WorkUnitParameterObject file1Param = Analyzer.GetWorkUnitParameterObjectFromAudioFile(filePathAudio1); if (file1Param != null) { file1Param.FingerprintingConfiguration = fingerprintingConfigCreation; // Get fingerprints fingerprints1 = fingerprintService.CreateFingerprintsFromAudioSamples(file1Param.AudioSamples, file1Param, out logSpectrogram1); pictureBox1.Image = imageService.GetSpectrogramImage(logSpectrogram1, logSpectrogram1.Length, logSpectrogram1[0].Length); pictureBoxWithInterpolationMode1.Image = imageService.GetImageForFingerprints(fingerprints1, file1Param.FingerprintingConfiguration.FingerprintLength, file1Param.FingerprintingConfiguration.LogBins, fingerprintsPerRow); } WorkUnitParameterObject file2Param = Analyzer.GetWorkUnitParameterObjectFromAudioFile(filePathAudio2); if (file2Param != null) { file2Param.FingerprintingConfiguration = fingerprintingConfigCreation; // Get fingerprints fingerprints2 = fingerprintService.CreateFingerprintsFromAudioSamples(file2Param.AudioSamples, file2Param, out logSpectrogram2); pictureBox2.Image = imageService.GetSpectrogramImage(logSpectrogram2, logSpectrogram2.Length, logSpectrogram2[0].Length); pictureBoxWithInterpolationMode2.Image = imageService.GetImageForFingerprints(fingerprints2, file2Param.FingerprintingConfiguration.FingerprintLength, file2Param.FingerprintingConfiguration.LogBins, fingerprintsPerRow); } MinHash minHash = repository.MinHash; // only use the first signatures bool[] signature1 = fingerprints1[0]; bool[] signature2 = fingerprints2[0]; if (signature1 != null && signature2 != null) { int hammingDistance = MinHash.CalculateHammingDistance(signature1, signature2); double jaqSimilarity = MinHash.CalculateJaqSimilarity(signature1, signature2); lblSimilarity.Text = String.Format("Hamming: {0} JAQ: {1}", hammingDistance, jaqSimilarity); } }