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); }
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()); }
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()); }
public SimpleScenarioActivator(ScenarioCast cast) { Cast = cast; Word = cast.Name; }