private void openToolStripMenuItem_Click(object sender, EventArgs e) { var ofd = new OpenFileDialog(); if (ofd.ShowDialog() != DialogResult.OK) { return; } using (var stream = new FileStream(ofd.FileName, FileMode.Open)) { var waveFile = new WaveFile(stream); _signal = waveFile[Channels.Left]; } _stft = new Stft(_frameSize, _hopSize); var frameDuration = (double)_frameSize / _signal.SamplingRate; var hopDuration = (double)_hopSize / _signal.SamplingRate; var freqs = new[] { 300f, 600, 1000, 2000, 4000, 7000 }; var pitchExtractor = new PitchExtractor(_signal.SamplingRate, frameDuration, hopDuration, high: 900 /*Hz*/); var pitchTrack = pitchExtractor.ParallelComputeFrom(_signal) .Select(p => p.Features[0]) .ToArray(); var tdExtractor = new TimeDomainFeaturesExtractor(_signal.SamplingRate, "all", frameDuration, hopDuration); var spectralExtractor = new SpectralFeaturesExtractor(_signal.SamplingRate, "sc+sn", frameDuration, hopDuration, frequencies: freqs); var mpeg7Extractor = new Mpeg7SpectralFeaturesExtractor(_signal.SamplingRate, "all", frameDuration, hopDuration); mpeg7Extractor.IncludeHarmonicFeatures("all"); mpeg7Extractor.SetPitchTrack(pitchTrack); tdExtractor.AddFeature("pitch_zcr", (signal, start, end) => { return(Pitch.FromZeroCrossingsSchmitt(signal, start, end)); }); //spectralExtractor.AddFeature("pitch_hss", (spectrum, fs) => { return Pitch.FromHss(spectrum, _signal.SamplingRate); } ); var tdVectors = tdExtractor.ParallelComputeFrom(_signal); var spectralVectors = spectralExtractor.ParallelComputeFrom(_signal); var mpeg7Vectors = mpeg7Extractor.ParallelComputeFrom(_signal); _vectors = FeaturePostProcessing.Join(tdVectors, spectralVectors, mpeg7Vectors); //FeaturePostProcessing.NormalizeMean(_vectors); //FeaturePostProcessing.AddDeltas(_vectors); var descriptions = tdExtractor.FeatureDescriptions .Concat(spectralExtractor.FeatureDescriptions) .Concat(mpeg7Extractor.FeatureDescriptions); FillFeaturesList(_vectors, descriptions); spectrogramPlot.ColorMapName = "afmhot"; spectrogramPlot.MarklineThickness = 2; spectrogramPlot.Spectrogram = _stft.Spectrogram(_signal); }
private async Task ProcessAudioData() { var data = _data[0]; var filename = TempFileName; using (var tempStream = new FileStream(filename, FileMode.Create)) { // ==================================== main recording loop ======================================== while (_isRecording) { // ====================================== read data ============================================ //uncomment for PcmFloat mode: ============================ //await _recorder.ReadAsync(data, 0, _sizeInFloats, 0); //instead of Pcm16bit: await _recorder.ReadAsync(_bytes, 0, _bufferSize); ByteConverter.ToFloats16Bit(_bytes, _data); // ======================================================== // ===================================== process data ========================================== _pitchExtractor.ProcessFrame(data, _pitch); _pitchArgs.PitchZcr = Pitch.FromZeroCrossingsSchmitt(data, _samplingRate); _pitchArgs.PitchAutoCorr = _pitch[0]; PitchEstimated(this, _pitchArgs); // event _robotizer.Process(data, data); // ==================== write data to output stream (if necessary) ============================= //uncomment for PcmFloat mode: ========================= //Buffer.BlockCopy(data, 0, _bytes, 0, _bufferSize); // faster than writing float-after-float //await tempStream.WriteAsync(_bytes, 0, _bufferSize); //instead of Pcm16bit: Buffer.BlockCopy(data, 0, _temp, 0, _temp.Length); await tempStream.WriteAsync(_temp, 0, _temp.Length); // ===================================================== } } SaveToFile(); }