Example #1
0
        /// <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);
        }
Example #3
0
        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);
            }
        }