private void StartStopRecognition(object sender, RoutedEventArgs e)
        {
            if (_currentState == AppState.Idle)
            {

                txtRecognizedText.Text = string.Empty;
                var recognitionEngine = new DetectionEngine(_codebook, _models);
                _signal = new MicrophoneSoundSignalReader();

                var length = (_signal.SampleRate / 1000.0) * EngineParameters.Default.StepSizeMiliseconds;
                if (_aggregator != null)
                {
                    _aggregator.SampleReady -= AggregatorSampleReady;
                }
                _aggregator = new SampleAggregator(Convert.ToInt32(length));

                _aggregator.SampleReady += AggregatorSampleReady;
                _signal.Start();
                Action action = () =>
                {
                    Thread.Sleep(3000);
                    recognitionEngine.RecognizeAsync(_signal, OnMessageReceived, _aggregator);
                };

                action.BeginInvoke(null, null);

                btnRecog.Content = "Stop Recognition";
                _currentState = AppState.Recognition;
            }
            else
            {
                btnRecog.Content = "Start Recognition";
                _signal.Close();
                _currentState = AppState.Idle;
                _aggregator.SampleReady -= AggregatorSampleReady;
                _aggregator = null;
            }
        }
        public TrainResult Train(Dictionary<string, IList<ISoundSignalReader>> signalsDictionary,
            SampleAggregator aggregator = null)
        {
            Parallel.ForEach(signalsDictionary, item =>
            {
                BuildModel(item.Value, item.Key, aggregator);
            });

            return new TrainResult { Catalog = _codeBook, Models = _models.Values.ToArray() };
        }
 private void AggregatorSampleReady(object sender, SampleAggregator.SamplePointEventArgs e)
 {
     renderer.AddValue(e.Point);
 }
 public void AddValue(SampleAggregator.SamplePoint samplePoint)
 {
     _queue.Enqueue(samplePoint);
     var action = new Action(Refresh);
     Dispatcher.BeginInvoke(action, DispatcherPriority.Render);
 }