internal static IDetailProvider GetDetailProvider(DetectionEngine detectionEngine)
        {
            var providers = new Dictionary <DetectionEngine, Func <IDetailProvider> >()
            {
                { DetectionEngine.WindowsDefender, () => new WindowsDefenderDetailProvider() }
            };

            return(providers.TryGetValue(detectionEngine, out var factory)
                ? factory()
                : null);
        }
        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;
            }
        }
        private void Train()
        {
            Dictionary<string, IList<ISoundSignalReader>> learningWordSignals = new Dictionary<string, IList<ISoundSignalReader>>();

            List<string> learningDirectories = new List<string>();
            foreach (var folder in ConfigurationSettings.LearningsFolders)
            {
                learningDirectories.AddRange(Directory.GetDirectories(folder));
            }

            foreach (var directory in learningDirectories.Where(item => !item.Contains("catalog")))
            {
                var word = new DirectoryInfo(directory).Name;
                learningWordSignals.Add(word, new List<ISoundSignalReader>());
                var wavFiles = Directory.GetFiles(directory).Select(item => new FileInfo(item)).Where(fItem => fItem.Extension.Contains("wav"));
                foreach (var file in wavFiles)
                {
                    learningWordSignals[word].Add(new WavSoundSignalReader(file.FullName));
                }
            }

            var catalogSignals = new List<ISoundSignalReader>();
            catalogSignals.AddRange(learningWordSignals.SelectMany(item => item.Value));

            var codeBook = CodeBookFactory.FromWaves(catalogSignals, EngineParameters.Default);

            var recognitionEngine = new DetectionEngine(codeBook);
            var result = recognitionEngine.Train(learningWordSignals);
            //result.Hmm.Save("HMModels.dat");
            _models = result.Models;
            _codebook = result.Catalog;

            result.Save("SavedData", "model");
        }