Example #1
0
 private void BtnQueryFromMicrophoneClick(object sender, EventArgs e)
 {
     DefaultFingerprintConfiguration configuration = new DefaultFingerprintConfiguration();
     int secondsToRecord = (int)_nudSecondsToRecord.Value;
     int sampleRate = (int)_nudSampleRate.Value;
     string pathToFile = "mic_" + DateTime.Now.Ticks + ".wav";
     _gbQueryMicrophoneBox.Enabled = false;
     Task<float[]>.Factory.StartNew(() => audioService.ReadMonoFromMicrophoneToFile(pathToFile, sampleRate, secondsToRecord)).ContinueWith(
         task =>
             {
                 _gbQueryMicrophoneBox.Enabled = true;
                 WinQueryResults winQueryResults = new WinQueryResults(
                     secondsToRecord,
                     0,
                     (int)_nudHashtables.Value,
                     (int)_nudKeys.Value,
                     (int)_nudThreshold.Value,
                     WinUtils.GetStride((StrideType)_cmbStrideType.SelectedIndex, (int)_nudQueryStrideMax.Value, (int)_nudQueryStrideMin.Value, configuration.SamplesPerFingerprint),
                     tagService,
                     modelService,
                     queryCommandBuilder);
                 winQueryResults.Show();
                 winQueryResults.Refresh();
                 winQueryResults.ExtractCandidatesUsingSamples(task.Result);
             },
         TaskScheduler.FromCurrentSynchronizationContext());
 }
 public QueryCommand(IFingerprintCommandBuilder fingerprintCommandBuilder, IQueryFingerprintService queryFingerprintService)
 {
     this.fingerprintCommandBuilder = fingerprintCommandBuilder;
     this.queryFingerprintService   = queryFingerprintService;
     FingerprintConfiguration       = new DefaultFingerprintConfiguration();
     QueryConfiguration             = new DefaultQueryConfiguration();
 }
Example #3
0
        private void BtnStartClick(object sender, EventArgs e)
        {
            DefaultFingerprintConfiguration configuration = new DefaultFingerprintConfiguration();
            switch (hashAlgorithm)
            {
                case HashAlgorithm.LSH:
                    if (!fileList.Any())
                    {
                        MessageBox.Show(Resources.SelectFolderWithSongs, Resources.Songs, MessageBoxButtons.OK, MessageBoxIcon.Information);
                        break;
                    }

                    WinQueryResults winQueryResults = new WinQueryResults(
                        _numSecondsToAnalyze.Enabled ? (int)_numSecondsToAnalyze.Value : 0,
                        _numStartAtSecond.Enabled ? (int)_numStartAtSecond.Value : 0,
                        (int)_nudHashtables.Value,
                        (int)_nudKeys.Value,
                        Convert.ToInt32(_nudThreshold.Value),
                        WinUtils.GetStride((StrideType)_cmbStrideType.SelectedIndex, (int)_nudQueryStrideMax.Value, (int)_nudQueryStrideMin.Value, configuration.SamplesPerFingerprint),
                        tagService,
                        modelService,
                        queryCommandBuilder);
                    winQueryResults.Show();
                    winQueryResults.Refresh();
                    winQueryResults.ExtractCandidatesWithMinHashAlgorithm(fileList);
                    break;
                case HashAlgorithm.NeuralHasher:
                    throw new NotImplementedException();
                case HashAlgorithm.None:
                    throw new NotImplementedException();
            }
        }
Example #4
0
 public IQueryCommand WithDefaultConfigs()
 {
     QueryConfiguration       = new DefaultQueryConfiguration();
     FingerprintConfiguration = new DefaultFingerprintConfiguration();
     createFingerprintMethod  = () => fingerprintingMethodFromSelector().WithFingerprintConfig(FingerprintConfiguration);
     return(this);
 }
        public void CreateFingerprintsTest()
        {
            float[] samples       = TestUtilities.GenerateRandomFloatArray(5512 * 10);
            var     configuration = new DefaultFingerprintConfiguration();

            float[][] logarithmizedSpectrum = new[]
            {
                TestUtilities.GenerateRandomFloatArray(2048),
                TestUtilities.GenerateRandomFloatArray(2048),
                TestUtilities.GenerateRandomFloatArray(2048)
            };
            List <float[][]> dividedLogSpectrum = new List <float[][]>
            {
                new[] { TestUtilities.GenerateRandomFloatArray(2048) },
                new[] { TestUtilities.GenerateRandomFloatArray(2048) },
                new[] { TestUtilities.GenerateRandomFloatArray(2048) }
            };

            spectrumService.Setup(service => service.CreateLogSpectrogram(samples, configuration)).Returns(logarithmizedSpectrum);
            spectrumService.Setup(service => service.CutLogarithmizedSpectrum(logarithmizedSpectrum, configuration.Stride, configuration.FingerprintLength, configuration.Overlap))
            .Returns(dividedLogSpectrum);
            waveletDecomposition.Setup(service => service.DecomposeImagesInPlace(dividedLogSpectrum));
            fingerprintDescriptor.Setup(descriptor => descriptor.ExtractTopWavelets(It.IsAny <float[][]>(), configuration.TopWavelets)).Returns(GenericFingerprint);

            List <bool[]> rawFingerprints = fingerprintService.CreateFingerprints(samples, configuration);

            Assert.AreEqual(3, rawFingerprints.Count);
            foreach (bool[] fingerprint in rawFingerprints)
            {
                Assert.AreEqual(GenericFingerprint, fingerprint);
            }
        }
Example #6
0
        public void QueryCommandIsBuiltWithCustomFingerprintConfigCorrectly()
        {
            var customConfig = new DefaultFingerprintConfiguration();
            var command      = queryCommandBuilder.BuildQueryCommand()
                               .From("path-to-file", 10, 0)
                               .WithFingerprintConfig(customConfig)
                               .UsingServices(modelService.Object, audioService.Object);

            Assert.AreSame(command.FingerprintConfiguration, customConfig);
        }
        public void CreateLogSpectrogramFromSamplesLessThanFourierTransformWindowLength()
        {
            var configuration = new DefaultFingerprintConfiguration();

            float[] samples = TestUtilities.GenerateRandomFloatArray(configuration.WdftSize - 1);

            logUtility.Setup(utility => utility.GenerateLogFrequenciesRanges(configuration)).Returns(new int[33]);

            float[][] result = spectrumService.CreateLogSpectrogram(samples, configuration);

            logUtility.Verify(utility => utility.GenerateLogFrequenciesRanges(configuration), Times.Once());

            Assert.AreEqual(0, result.Length); // 128
        }
        public void CreateFingerprintFromSamplesWhichAreExactlyEqualToMinimumLength()
        {
            var config = new DefaultFingerprintConfiguration();

            var samples = GenerateRandomAudioSamples(config.SamplesPerFingerprint + config.SpectrogramConfig.WdftSize);

            var hash = fingerprintCommandBuilder.BuildFingerprintCommand()
                       .From(samples)
                       .UsingServices(bassAudioService)
                       .Hash()
                       .Result;

            Assert.AreEqual(1, hash.Count);
        }
Example #9
0
        public void CreateFingerprintFromSamplesWhichAreExactlyEqualToMinimumLength()
        {
            DefaultFingerprintConfiguration config = new DefaultFingerprintConfiguration();

            float[] samples = TestUtilities.GenerateRandomFloatArray(config.SamplesPerFingerprint + config.WdftSize);

            var hash = fingerprintCommandBuilderWithBass
                       .BuildFingerprintCommand()
                       .From(samples)
                       .WithDefaultFingerprintConfig()
                       .Hash()
                       .Result;

            Assert.AreEqual(1, hash.Count);
        }
        public void SilenceIsNotFingerprinted()
        {
            var samples            = TestUtilities.GenerateRandomAudioSamples(5512 * 10);
            var configuration      = new DefaultFingerprintConfiguration();
            var dividedLogSpectrum = GetDividedLogSpectrum();

            spectrumService.Setup(service => service.CreateLogSpectrogram(samples, It.IsAny <DefaultSpectrogramConfig>())).Returns(dividedLogSpectrum);

            waveletDecomposition.Setup(decomposition => decomposition.DecomposeImageInPlace(It.IsAny <float[]>(), 128, 32, configuration.HaarWaveletNorm));
            fingerprintDescriptor.Setup(descriptor => descriptor.ExtractTopWavelets(It.IsAny <float[]>(), configuration.TopWavelets, It.IsAny <ushort[]>())).Returns(
                new TinyFingerprintSchema(1024));

            var rawFingerprints = fingerprintService.CreateFingerprintsFromAudioSamples(samples, configuration);

            Assert.IsTrue(!rawFingerprints.Any());
        }
        public void CutLogarithmizedSpectrumTest()
        {
            DefaultFingerprintConfiguration config = new DefaultFingerprintConfiguration();
            const int LogSpectrumLength            = 1024;
            var       stride      = new StaticStride(0, 0);
            var       logSpectrum = new float[LogSpectrumLength][];

            for (int i = 0; i < LogSpectrumLength; i++)
            {
                logSpectrum[i] = new float[32];
            }

            var cutLogarithmizedSpectrum = spectrumService.CutLogarithmizedSpectrum(logSpectrum, stride, config.FingerprintLength, config.Overlap);

            Assert.AreEqual(8, cutLogarithmizedSpectrum.Count);
        }
        public void CutLogarithmizedSpectrumWithAnIncrementalStaticStride()
        {
            DefaultFingerprintConfiguration config = new DefaultFingerprintConfiguration();
            int logSpectrumLength = (config.FingerprintLength * 24) + config.Overlap;
            var stride            = new IncrementalStaticStride(config.SamplesPerFingerprint / 2, config.SamplesPerFingerprint, 0);
            var logSpectrum       = new float[logSpectrumLength][];

            for (int i = 0; i < logSpectrumLength; i++)
            {
                logSpectrum[i] = new float[32];
            }

            var cutLogarithmizedSpectrum = spectrumService.CutLogarithmizedSpectrum(logSpectrum, stride, config.FingerprintLength, config.Overlap);

            Assert.AreEqual(48, cutLogarithmizedSpectrum.Count);
        }
        public void CutLogarithmizedSpectrumWithSpectrumWhichIsLessThanMinimalLengthOfOneFingerprintTest()
        {
            DefaultFingerprintConfiguration config = new DefaultFingerprintConfiguration();
            int logSpectrumLength = config.FingerprintLength - 1;
            var stride            = new StaticStride(0, 0);
            var logSpectrum       = new float[logSpectrumLength][];

            for (int i = 0; i < logSpectrumLength; i++)
            {
                logSpectrum[i] = new float[32];
            }

            var cutLogarithmizedSpectrum = spectrumService.CutLogarithmizedSpectrum(logSpectrum, stride, config.FingerprintLength, config.Overlap);

            Assert.AreEqual(0, cutLogarithmizedSpectrum.Count);
        }
Example #14
0
        public void AudioSamplesAreNormalized()
        {
            const int TenSeconds        = 5512 * 10;
            var       samples           = TestUtilities.GenerateRandomAudioSamples(TenSeconds);
            var       fingerprintConfig = new DefaultFingerprintConfiguration {
                NormalizeSignal = true
            };
            var dividedLogSpectrum = GetDividedLogSpectrum();

            spectrumService.Setup(service => service.CreateLogSpectrogram(samples, It.IsAny <DefaultSpectrogramConfig>())).Returns(dividedLogSpectrum);
            waveletDecomposition.Setup(service => service.DecomposeImageInPlace(It.IsAny <float[][]>()));
            fingerprintDescriptor.Setup(descriptor => descriptor.ExtractTopWavelets(It.IsAny <float[][]>(), fingerprintConfig.TopWavelets))
            .Returns(GenericFingerprint);
            audioSamplesNormalizer.Setup(normalizer => normalizer.NormalizeInPlace(samples.Samples));

            fingerprintService.CreateFingerprints(samples, fingerprintConfig);
        }
Example #15
0
        public void SilenceIsNotFingerprinted()
        {
            var samples            = TestUtilities.GenerateRandomAudioSamples(5512 * 10);
            var configuration      = new DefaultFingerprintConfiguration();
            var spectrogramConfig  = SpectrogramConfig.Default;
            var dividedLogSpectrum = GetDividedLogSpectrum();

            spectrumService.Setup(service => service.CreateLogSpectrogram(samples, spectrogramConfig)).Returns(dividedLogSpectrum);

            waveletDecomposition.Setup(decomposition => decomposition.DecomposeImageInPlace(It.IsAny <float[][]>()));
            fingerprintDescriptor.Setup(descriptor => descriptor.ExtractTopWavelets(It.IsAny <float[][]>(), configuration.TopWavelets)).Returns(
                new[] { false, false, false, false, false, false, false, false });

            var rawFingerprints = fingerprintService.CreateFingerprints(samples, configuration);

            Assert.IsTrue(rawFingerprints.Count == 0);
        }
Example #16
0
        public void ShouldCalculateQueryLengthCorrectly()
        {
            var   config = new DefaultFingerprintConfiguration();
            float delta  = 0.05f;
            int   runs   = 1000;
            var   bag    = new ConcurrentBag <HashedFingerprint>();

            Parallel.For(0, runs, i =>
            {
                var hashed = new HashedFingerprint(new int[0], (uint)i, i * delta);
                bag.Add(hashed);
            });


            double length = bag.QueryLength(config);

            Assert.AreEqual(length, delta * (runs - 1) + config.FingerprintLengthInSeconds, 0.0001);
        }
Example #17
0
        public void ShoudUseCorrectFingerprintConfigurationIsUsedWithInstanceConfig()
        {
            const string PathToAudioFile = "path-to-audio-file";

            var configuration = new DefaultFingerprintConfiguration {
                SpectrogramConfig = new DefaultSpectrogramConfig {
                    ImageLength = 1234
                }
            };

            var fingerprintCommand = fingerprintCommandBuilder.BuildFingerprintCommand()
                                     .From(PathToAudioFile)
                                     .WithFingerprintConfig(configuration)
                                     .UsingServices(audioService.Object);

            Assert.AreSame(configuration, fingerprintCommand.FingerprintConfiguration);
            Assert.AreEqual(configuration.SpectrogramConfig.ImageLength, fingerprintCommand.FingerprintConfiguration.SpectrogramConfig.ImageLength);
        }
        public void ShouldSaveOriginalPoints()
        {
            var random = new Random();
            var frames = Enumerable.Range(0, 100)
                         .Select(index =>
            {
                byte[] bytes = new byte[128 * 72 * sizeof(float)];
                random.NextBytes(bytes);
                float[] frame = new float[128 * 72];
                Buffer.BlockCopy(bytes, 0, frame, 0, bytes.Length);
                return(new Frame(frame, 128, 72, (float)index / 30, (uint)index));
            })
                         .ToList();

            var fs = new Frames(frames.Select(frame => new Frame(frame.GetImageRowColsCopy(), frame.Rows, frame.Cols, frame.StartsAt, frame.SequenceNumber)), string.Empty, 30);

            var config = new DefaultFingerprintConfiguration
            {
                FrameNormalizationTransform = new NoFrameNormalization(),
                GaussianBlurConfiguration   = GaussianBlurConfiguration.None,
                OriginalPointSaveTransform  = frame =>
                {
                    byte[] original = new byte[frame.Length * sizeof(float)];
                    Buffer.BlockCopy(frame.ImageRowCols, 0, original, 0, original.Length);
                    return(original);
                }
            };

            var hashes = FingerprintService.Instance.CreateFingerprintsFromImageFrames(fs, config);

            Assert.AreEqual(hashes.Count, frames.Count);
            var originalPoints = hashes
                                 .OrderBy(_ => _.SequenceNumber)
                                 .Select(_ => _.OriginalPoint)
                                 .Select(point =>
            {
                float[] pt = new float[point.Length / 4];
                Buffer.BlockCopy(point, 0, pt, 0, point.Length);
                return(pt);
            })
                                 .ToList();

            CollectionAssert.AreEqual(frames.Select(_ => _.ImageRowCols).ToList(), originalPoints);
        }
        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 #20
0
        public async Task CreateFingerprintsFromFileAndAssertNumberOfFingerprints()
        {
            const int staticStride = 5096;

            var fingerprintConfiguration = new DefaultFingerprintConfiguration {
                Stride = new IncrementalStaticStride(staticStride)
            };

            var command = FingerprintCommandBuilder.Instance.BuildFingerprintCommand()
                          .From(PathToWav)
                          .WithFingerprintConfig(fingerprintConfiguration)
                          .UsingServices(audioService);

            double seconds = audioService.GetLengthInSeconds(PathToWav);
            int    samples = (int)(seconds * fingerprintConfiguration.SampleRate);
            int    expectedFingerprints = (samples - fingerprintConfiguration.SamplesPerFingerprint) / staticStride;

            var fingerprints = await command.Hash();

            Assert.AreEqual(expectedFingerprints, fingerprints.Count);
        }
        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[][]>()));
            fingerprintDescriptor.Setup(descriptor => descriptor.ExtractTopWavelets(It.IsAny <float[][]>(), fingerprintConfig.TopWavelets))
            .Returns(GenericFingerprint);

            var fingerprints = fingerprintService.CreateFingerprints(samples, fingerprintConfig);

            Assert.AreEqual(dividedLogSpectrum.Count, fingerprints.Count);
            for (int index = 0; index < fingerprints.Count; index++)
            {
                Assert.AreEqual(GenericFingerprint, fingerprints[index].Signature);
                Assert.AreEqual(dividedLogSpectrum[index].Timestamp, fingerprints[index].Timestamp, Epsilon);
            }
        }
        public void FingerprintConfigurationInheritsDefaultValues()
        {
            var customConfiguration  = new CustomFingerprintConfiguration();
            var defaultConfiguration = new DefaultFingerprintConfiguration();

            Assert.AreEqual(defaultConfiguration.FingerprintLength, customConfiguration.FingerprintLength);
            Assert.AreEqual(defaultConfiguration.LogBase, customConfiguration.LogBase);
            Assert.AreEqual(defaultConfiguration.LogBins, customConfiguration.LogBins);
            Assert.AreEqual(defaultConfiguration.MaxFrequency, customConfiguration.MaxFrequency);
            Assert.AreEqual(defaultConfiguration.MinFrequency, customConfiguration.MinFrequency);
            Assert.AreEqual(defaultConfiguration.NormalizeSignal, customConfiguration.NormalizeSignal);
            Assert.AreEqual(defaultConfiguration.NumberOfLSHTables, customConfiguration.NumberOfLSHTables);
            Assert.AreEqual(defaultConfiguration.NumberOfMinHashesPerTable, customConfiguration.NumberOfMinHashesPerTable);
            Assert.AreEqual(defaultConfiguration.Overlap, customConfiguration.Overlap);
            Assert.AreEqual(defaultConfiguration.SampleRate, customConfiguration.SampleRate);
            Assert.AreEqual(defaultConfiguration.SamplesPerFingerprint, customConfiguration.SamplesPerFingerprint);
            Assert.IsTrue(defaultConfiguration.Stride.GetType() == customConfiguration.Stride.GetType());
            Assert.AreEqual(defaultConfiguration.TopWavelets, customConfiguration.TopWavelets);
            Assert.AreEqual(defaultConfiguration.UseDynamicLogBase, customConfiguration.UseDynamicLogBase);
            Assert.AreEqual(defaultConfiguration.WdftSize, customConfiguration.WdftSize);
        }
Example #23
0
        public void ShouldSerializeDeserializeSameArray()
        {
            var fingerprintService = FingerprintService.Instance;
            var image = GetOneImage();

            var configuration = new DefaultFingerprintConfiguration
            {
                FrameNormalizationTransform = new NoFrameNormalization(),
                OriginalPointSaveTransform  = EncodeFrame
            };

            var hashes = fingerprintService.CreateFingerprintsFromImageFrames(new Frames(new[] { new Frame(image, 0, 0) }, string.Empty, 30), configuration);

            var decodedFrame = DecodeFrame(hashes.First().OriginalPoint);

            Assert.AreEqual(image.Length, decodedFrame.Length);

            for (int i = 0; i < image.Length; ++i)
            {
                CollectionAssert.AreEqual(image[i], decodedFrame[i]);
            }
        }
Example #24
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 IUsingQueryServices WithDefaultConfigs()
 {
     QueryConfiguration       = new DefaultQueryConfiguration();
     FingerprintConfiguration = new DefaultFingerprintConfiguration();
     return(this);
 }
 internal FingerprintCommand(IFingerprintService fingerprintService, ILocalitySensitiveHashingAlgorithm lshAlgorithm)
 {
     this.fingerprintService  = fingerprintService;
     this.lshAlgorithm        = lshAlgorithm;
     FingerprintConfiguration = new DefaultFingerprintConfiguration();
 }
Example #27
0
 internal FingerprintCommand(IFingerprintService fingerprintService)
 {
     this.fingerprintService  = fingerprintService;
     FingerprintConfiguration = new DefaultFingerprintConfiguration();
 }