public Alternation(ScenarioCast scenario, string syn, Func <Alternation, string> generateValue = null, int weight = 100)
 {
     Weight        = weight;
     Scenario      = scenario;
     Synonym       = syn;
     GenerateValue = generateValue ?? new Func <Alternation, string>((a) => string.Empty);
 }
        private Alternation[] ForToggle(string[] synonyms, ScenarioCast scenario, string source)
        {
            var alternates = new List <Alternation>();

            foreach (var synonym in synonyms)
            {
                alternates.Add(new Alternation(scenario, synonym, (a) => a.Scenario.Value == ToggleValueType.ValueOFF ? ToggleValueType.ValueON : ToggleValueType.ValueOFF));
                alternates.Add(new Alternation(scenario, "запустить " + synonym, (a) => ToggleValueType.ValueON, 90));
                alternates.Add(new Alternation(scenario, "запусти " + synonym, (a) => ToggleValueType.ValueON, 90));
                alternates.Add(new Alternation(scenario, "активировать " + synonym, (a) => ToggleValueType.ValueON, 90));
                alternates.Add(new Alternation(scenario, "активируй " + synonym, (a) => ToggleValueType.ValueON, 90));
                alternates.Add(new Alternation(scenario, "деактивировать " + synonym, (a) => ToggleValueType.ValueOFF, 90));

                // Распознаватель речи считает очень похожими эти фразы, поэтому разделяем их
                if (source.Contains("включ"))
                {
                    alternates.Add(new Alternation(scenario, "включить " + synonym, (a) => ToggleValueType.ValueON));
                    alternates.Add(new Alternation(scenario, "включай " + synonym, (a) => ToggleValueType.ValueON));
                    alternates.Add(new Alternation(scenario, "включи " + synonym, (a) => ToggleValueType.ValueON));
                }
                else if (source.Contains("отключ"))
                {
                    alternates.Add(new Alternation(scenario, "отключить " + synonym, (a) => ToggleValueType.ValueOFF));
                    alternates.Add(new Alternation(scenario, "отключи " + synonym, (a) => ToggleValueType.ValueOFF));
                }
                else if (source.Contains("выключ"))
                {
                    alternates.Add(new Alternation(scenario, "выключить " + synonym, (a) => ToggleValueType.ValueOFF));
                    alternates.Add(new Alternation(scenario, "выключи " + synonym, (a) => ToggleValueType.ValueOFF));
                }
            }
            return(alternates.ToArray());
        }
        private Alternation PrepareInfoAlternation(string synonym, string source, ScenarioCast scenario, int weight)
        {
            if (synonym.Length < source.Length)
            {
                var wordsCount       = synonym.Count(x => x == ' ') + 1;
                var wordsCountSource = source.Count(x => x == ' ') + 1;

                if (wordsCount >= wordsCountSource)
                {
                    return(null);
                }

                var sourceWords  = source.Split(' ');
                var prefixSource = sourceWords.Take(wordsCount).Aggregate((x1, x2) => x1 + ' ' + x2);

                var equalityNumber = _comparer.CalculateFuzzyEqualValue(synonym, prefixSource);

                if (equalityNumber > 0.6)
                {
                    var parameter =
                        sourceWords
                        .Skip(wordsCount)
                        .Take(wordsCountSource - wordsCount)
                        .Aggregate((x1, x2) => x1 + ' ' + x2);

                    return(new Alternation(scenario, synonym + " " + parameter, (a) => parameter, weight));
                }
                else
                {
                    return(null);
                }
            }
            return(null);
        }
Ejemplo n.º 4
0
 public ScenariosInfo(ScenarioCast[] allScenarios, ScenarioCast[] selectedScenarios, ScenarioCast[] withoutActivationScenarios, ScenarioCast volumeScenario, ScenarioCast infoScenario, ScenarioCast soundNotifyScenario, float activationConfidence, float executionConfidence, string captureDevice, string[] keywords)
 {
     AllScenarios               = allScenarios ?? throw new ArgumentNullException(nameof(allScenarios));
     SelectedScenarios          = selectedScenarios ?? throw new ArgumentNullException(nameof(selectedScenarios));
     WithoutActivationScenarios = withoutActivationScenarios;
     VolumeScenario             = volumeScenario;
     InfoScenario               = infoScenario;
     SoundNotifyScenario        = soundNotifyScenario;
     ExecutionConfidence        = executionConfidence;
     CaptureDevice              = captureDevice;
     Keywords             = keywords ?? throw new ArgumentNullException(nameof(keywords));
     ActivationConfidence = activationConfidence;
 }
        private Alternation[] ForButton(string[] synonyms, ScenarioCast scenario)
        {
            var alternates = new List <Alternation>();

            foreach (var synonym in synonyms)
            {
                alternates.Add(new Alternation(scenario, synonym));
                alternates.Add(new Alternation(scenario, "запустить " + synonym, weight: 90));
                alternates.Add(new Alternation(scenario, "запусти " + synonym, weight: 90));
                alternates.Add(new Alternation(scenario, "включить " + synonym, weight: 90));
                alternates.Add(new Alternation(scenario, "включи " + synonym, weight: 90));
                alternates.Add(new Alternation(scenario, "активировать " + synonym, weight: 90));
                alternates.Add(new Alternation(scenario, "активируй " + synonym, weight: 90));
            }
            return(alternates.ToArray());
        }
        private Alternation[] ForState(string[] synonyms, ScenarioCast scenario)
        {
            var alternates = new List <Alternation>();

            foreach (var state in scenario.ValueType.AcceptedValues)
            {
                var stateCur = state;
                foreach (var stateSyn in WithSynonyms(stateCur))
                {
                    alternates.Add(new Alternation(scenario, stateSyn, (a) => stateCur, 85));
                    foreach (var synonym in synonyms)
                    {
                        alternates.Add(new Alternation(scenario, synonym + " " + stateSyn, (a) => stateCur));
                        alternates.Add(new Alternation(scenario, "сделать " + synonym + " " + stateSyn, (a) => stateCur, 90));
                    }
                }
            }
            return(alternates.ToArray());
        }
        private Alternation[] ForInfo(string[] synonyms, ScenarioCast scenario, string source)
        {
            string[] prefixes = new[] { "отправить ", "отправь ", "вывести ", "выслать ", "вышли ", "" };

            var alternates = new List <Alternation>();

            foreach (var synonym in synonyms)
            {
                foreach (var prefix in prefixes)
                {
                    var alt = PrepareInfoAlternation(prefix + synonym, source, scenario, prefix == string.Empty ? 100 : 90);
                    if (alt != null)
                    {
                        alternates.Add(alt);
                    }
                }
            }

            return(alternates.ToArray());
        }
Ejemplo n.º 8
0
        public MainWindow()
        {
            InitializeComponent();

            VoicePluginData.Current.ActiveVoiceScenariosIds = new string[] { "1", "2", "3" };
            VoicePluginData.Current.WithoutActivationVoiceScenariosIds = new string[] { "2" };
            VoicePluginData.Current.CommandsViewScenarioId = "4";
            VoicePluginData.Current.VolumeLevelScenarioId = "1";

            var scenarios = new ScenarioCast[] {
                new ScenarioCastTest(new FloatValueType(){ AcceptedValues=new string[]{"0", "100" } }, "Звук", "1"),
                new ScenarioCastTest(new InfoValueType(), "Вывод", "4"),
                new ScenarioCastTest(new ButtonValueType(), "Тест", "2"),
                new ScenarioCastTest(new InfoValueType(), "сообщение наде", "3"),
            };

            var voicePlugin = new VoicePlugin();
            voicePlugin.SetCasts(() => scenarios);
            voicePlugin.Initialize();
            voicePlugin.SetValue(null, ToggleValueType.ValueON);

            voicePlugin.UserInitializeWith(null, false);
        }
        private Alternation[] ForNumeric(string[] synonyms, ScenarioCast scenario, bool containsNumbers, string source)
        {
            var actionOnPlus = new Func <Alternation, string>((a) => {
                var currentValue = a.Scenario.Value;
                if (scenario.ID == VoicePluginData.Current.VolumeLevelScenarioId && _prevSoundVolume != null)
                {
                    currentValue = _prevSoundVolume;
                }
                double.TryParse(currentValue, out double current);
                var valueType = a.Scenario.ValueType as FloatValueType;
                var min       = valueType.Min;
                var max       = valueType.Max;
                var plus      = current + (max - min) * 0.1;
                if (plus > max)
                {
                    plus = max;
                }
                return(plus.ToString());
            });

            var actionOnLow = new Func <Alternation, string>((a) => {
                var currentValue = a.Scenario.Value;
                if (scenario.ID == VoicePluginData.Current.VolumeLevelScenarioId && _prevSoundVolume != null)
                {
                    currentValue = _prevSoundVolume;
                }
                double.TryParse(currentValue, out double current);
                var valueType = a.Scenario.ValueType as FloatValueType;
                var min       = valueType.Min;
                var max       = valueType.Max;
                var low       = min + (max - min) * 0.08;
                if (low > current)
                {
                    low = 0;
                }
                return(low.ToString());
            });

            var actionOnMinus = new Func <Alternation, string>((a) => {
                var currentValue = a.Scenario.Value;
                if (scenario.ID == VoicePluginData.Current.VolumeLevelScenarioId && _prevSoundVolume != null)
                {
                    currentValue = _prevSoundVolume;
                }
                double.TryParse(currentValue, out double current);
                var valueType = scenario.ValueType as FloatValueType;
                var min       = valueType.Min;
                var max       = valueType.Max;
                var minus     = current - (max - min) * 0.1;
                if (minus < min)
                {
                    minus = min;
                }
                return(minus.ToString());
            });

            var actionOnMinimum = new Func <Alternation, string>((a) => {
                var valueType = a.Scenario.ValueType as FloatValueType;
                var min       = valueType.Min;
                return(min.ToString());
            });

            var actionOnMaximum = new Func <Alternation, string>((a) => {
                var valueType = a.Scenario.ValueType as FloatValueType;
                var max       = valueType.Max;
                return(max.ToString());
            });

            var alternates = new List <Alternation>();

            foreach (var synonym in synonyms)
            {
                alternates.Add(new Alternation(scenario, "выключить " + synonym, actionOnMinimum));
                alternates.Add(new Alternation(scenario, "отключить " + synonym, actionOnMinimum));
                alternates.Add(new Alternation(scenario, "максимум " + synonym, actionOnMaximum));
                alternates.Add(new Alternation(scenario, "минимум " + synonym, actionOnLow));
                alternates.Add(new Alternation(scenario, "тихо " + synonym, actionOnLow, 90));
                alternates.Add(new Alternation(scenario, "тише " + synonym, actionOnMinus, 90));
                alternates.Add(new Alternation(scenario, "сделай тише " + synonym, actionOnMinus, 90));
                alternates.Add(new Alternation(scenario, "убавь " + synonym, actionOnMinus, 90));
                alternates.Add(new Alternation(scenario, "громче " + synonym, actionOnPlus, 90));
                alternates.Add(new Alternation(scenario, "сделай громче " + synonym, actionOnPlus, 90));
                alternates.Add(new Alternation(scenario, "прибавь " + synonym, actionOnPlus, 90));
                alternates.Add(new Alternation(scenario, "сделай ярче " + synonym, actionOnPlus, 90));
                alternates.Add(new Alternation(scenario, "ярче " + synonym, actionOnPlus, 90));
                alternates.Add(new Alternation(scenario, "тусклее " + synonym, actionOnMinus, 90));

                alternates.Add(new Alternation(scenario, "сделай тихо " + synonym, actionOnLow, 90));
                alternates.Add(new Alternation(scenario, "сделай минимум " + synonym, actionOnLow, 90));
                alternates.Add(new Alternation(scenario, "сделай тише " + synonym, actionOnMinus, 90));
                alternates.Add(new Alternation(scenario, "сделай громче " + synonym, actionOnPlus, 90));
                alternates.Add(new Alternation(scenario, "сделай ярче " + synonym, actionOnPlus, 90));
                alternates.Add(new Alternation(scenario, "сделай тусклее " + synonym, actionOnMinus, 90));

                if (scenario.Name.ToLowerInvariant() == "звук")
                {
                    alternates.Add(new Alternation(scenario, "тихо", actionOnLow));
                    alternates.Add(new Alternation(scenario, "сделай тихо", actionOnLow));
                    alternates.Add(new Alternation(scenario, "тише", actionOnMinus));
                    alternates.Add(new Alternation(scenario, "сделай тише", actionOnMinus));
                    alternates.Add(new Alternation(scenario, "громче", actionOnPlus));
                    alternates.Add(new Alternation(scenario, "прибавь громкость", actionOnPlus));
                    alternates.Add(new Alternation(scenario, "прибавь музыку", actionOnPlus));
                    alternates.Add(new Alternation(scenario, "убавь громкость", actionOnMinus));
                    alternates.Add(new Alternation(scenario, "убавь музыку", actionOnMinus));
                    alternates.Add(new Alternation(scenario, "сделай громче", actionOnPlus));
                }

                // Два похожих слова, алгоритм может ошибиться в этом моменте
                if (source.Contains("прибавить"))
                {
                    alternates.Add(new Alternation(scenario, "прибавить " + synonym, actionOnPlus));
                }
                else
                {
                    alternates.Add(new Alternation(scenario, "убавить " + synonym, actionOnMinus));
                }

                alternates.Add(new Alternation(scenario, synonym + " ноль", (a) => "0"));
                alternates.Add(new Alternation(scenario, synonym + " один", (a) => "1"));
                alternates.Add(new Alternation(scenario, synonym + " два", (a) => "2"));
                alternates.Add(new Alternation(scenario, synonym + " три", (a) => "3"));
                alternates.Add(new Alternation(scenario, synonym + " четрые", (a) => "4"));
                alternates.Add(new Alternation(scenario, synonym + " пять", (a) => "5"));
                alternates.Add(new Alternation(scenario, synonym + " шесть", (a) => "6"));
                alternates.Add(new Alternation(scenario, synonym + " семь", (a) => "7"));
                alternates.Add(new Alternation(scenario, synonym + " восемь", (a) => "8"));
                alternates.Add(new Alternation(scenario, synonym + " девять", (a) => "9"));

                if (containsNumbers)
                {
                    for (int i = 0; i <= 100; i += 5)
                    {
                        var iCur            = i;
                        var actionOnPercent = new Func <Alternation, string>((a) => {
                            var valueType = a.Scenario.ValueType as FloatValueType;
                            var min       = valueType.Min;
                            var max       = valueType.Max;
                            var val       = (min + (max - min) * iCur / 100.0).ToString();
                            return(val);
                        });
                        var asString = Utils.ConvertToNormalString(i);
                        if (source.Contains(asString))
                        {
                            alternates.Add(new Alternation(scenario, "выставить " + synonym + " " + asString, actionOnPercent));
                            alternates.Add(new Alternation(scenario, "выставить " + synonym + " на " + asString, actionOnPercent));
                            alternates.Add(new Alternation(scenario, "яркость " + synonym + " " + asString, actionOnPercent, 90));
                            alternates.Add(new Alternation(scenario, "яркость " + synonym + " на " + asString, actionOnPercent, 90));
                            alternates.Add(new Alternation(scenario, "уровень " + synonym + " " + asString, actionOnPercent));
                            alternates.Add(new Alternation(scenario, "уровень " + synonym + " на " + asString, actionOnPercent));
                            alternates.Add(new Alternation(scenario, synonym + " на " + asString, actionOnPercent));
                        }
                    }
                }
            }

            return(alternates.ToArray());
        }
Ejemplo n.º 10
0
 public SimpleScenarioActivator(ScenarioCast cast)
 {
     Cast = cast;
     Word = cast.Name;
 }