From 8b0dd351b3ab31fec68139e42a16d3efabd9ee0d Mon Sep 17 00:00:00 2001 From: LexiconCode Date: Fri, 9 Oct 2020 23:11:17 -0500 Subject: [PATCH] Implemented microphone modes (#853) --- CasterQuickReference.pdf | Bin 101692 -> 104202 bytes castervoice/lib/const.py | 2 +- castervoice/lib/ctrl/configure_engine.py | 27 ++- castervoice/lib/ctrl/mgr/engine_manager.py | 196 ++++++++++++------ castervoice/lib/ctrl/nexus.py | 5 - .../apps/speech_engine/dragon_rules/dragon.py | 2 - .../core/engine_manager_rules/mic_rules.py | 24 +++ docs/CasterQuickReference.pdf | Bin 101692 -> 104202 bytes docs/CasterQuickReference.tex | 2 + 9 files changed, 174 insertions(+), 84 deletions(-) create mode 100644 castervoice/rules/core/engine_manager_rules/mic_rules.py diff --git a/CasterQuickReference.pdf b/CasterQuickReference.pdf index 376da8c85e18d00a83bf3d43b4be06efe43fb9ab..c5b94a8faa0904f9792f078899908602366dcbbd 100644 GIT binary patch delta 19338 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 I`vjQ&AJJq5p8x;= diff --git a/castervoice/lib/const.py b/castervoice/lib/const.py index 6fabb7b70..52950f62d 100644 --- a/castervoice/lib/const.py +++ b/castervoice/lib/const.py @@ -13,7 +13,7 @@ class CCRType(object): # Original Caster CCR "core" set: "Alphabet", "Navigation", "NavigationNon", "Numbers", "Punctuation", # Rules which were split out of _caster.py: - "CasterRule", "HardwareRule", "MouseAlternativesRule", "WindowManagementRule", + "CasterRule", "CasterMicRule", "HardwareRule", "MouseAlternativesRule", "WindowManagementRule", # Alternate mouse grid controls: "DouglasGridRule", "RainbowGridRule", "SudokuGridRule", # HMC GUI control rules: diff --git a/castervoice/lib/ctrl/configure_engine.py b/castervoice/lib/ctrl/configure_engine.py index daff0453e..03ad439e1 100644 --- a/castervoice/lib/ctrl/configure_engine.py +++ b/castervoice/lib/ctrl/configure_engine.py @@ -1,7 +1,7 @@ # TODO: Create and utilize base class. These classes should be initialized only once. # TODO: Add a function for end-user user to overload in EngineConfigEarly and EngineConfigLate -class EngineConfigEarly(): +class EngineConfigEarly: """ Initializes engine specific customizations before Nexus initializes. Grammars are not loaded @@ -23,43 +23,40 @@ def set_cancel_word(self): SymbolSpecs.set_cancel_word("escape") -class EngineConfigLate(): +class EngineConfigLate: """ Initializes engine specific customizations after Nexus has initialized. Grammars are loaded into engine. """ from castervoice.lib import settings - from castervoice.lib import printer from dragonfly import get_current_engine engine = get_current_engine().name def __init__(self): - from castervoice.lib import control # Access to Nexus instance - self.instannce = control.nexus()._engine_modes_manager + from castervoice.lib.ctrl.mgr.engine_manager import EngineModesManager + self.EngineModesManager = EngineModesManager.initialize() if self.engine != "text": self.set_default_mic_mode() self.set_engine_default_mode() - def set_default_mic_mode(self): """ Sets the microphone state on Caster startup. """ # Only DNS supports mic_state 'off'. Substituts `sleep` mode on other engines" - if self.settings.SETTINGS["engine"]["default_mic"]: # Default is `False` - default_mic_state = self.settings.SETTINGS["engine"]["mic_mode"] # Default is `on` - if self.engine != "natlink" and default_mic_state == "off": - default_mic_state == "sleep" - self.instannce.set_mic_mode(default_mic_state) - + if self.settings.SETTINGS["engine"]["default_mic"]: # Default is `False` + default_mic_state = self.settings.SETTINGS["engine"]["mic_mode"] # Default is `on` + if self.engine != "natlink" and default_mic_state == "off": + default_mic_state = "sleep" + self.EngineModesManager.set_mic_mode(default_mic_state) def set_engine_default_mode(self): """ Sets the engine mode on Caster startup. """ # Only DNS supports 'normal'. Substituts `command` mode on other engines" - if self.settings.SETTINGS["engine"]["default_engine_mode"]: # Default is `False` + if self.settings.SETTINGS["engine"]["default_engine_mode"]: # Default is `False` default_mode = self.settings.SETTINGS["engine"]["engine_mode"] # Default is `normal` if self.engine != "natlink" and default_mode == "normal": - default_mode == "command" - self.instannce.set_engine_mode(mode=default_mode, state=True) \ No newline at end of file + default_mode = "command" + self.EngineModesManager.set_engine_mode(mode=default_mode, state=True) diff --git a/castervoice/lib/ctrl/mgr/engine_manager.py b/castervoice/lib/ctrl/mgr/engine_manager.py index 85b680a47..d31ad617b 100644 --- a/castervoice/lib/ctrl/mgr/engine_manager.py +++ b/castervoice/lib/ctrl/mgr/engine_manager.py @@ -1,104 +1,178 @@ -from dragonfly import get_engine, get_current_engine -from castervoice.lib import settings, printer +from dragonfly import get_engine, get_current_engine, FuncContext, Function, MappingRule, Grammar, Choice, Dictation +from castervoice.lib import printer + +engine = get_current_engine().name +if engine == 'natlink': + import natlink -# TODO: Implement a grammar exclusivity for non-DNS engines in a separate class class EngineModesManager(object): """ Manages engine modes and microphone states using backend engine API and through dragonfly grammar exclusivity. """ - engine = get_current_engine().name - if engine == 'natlink': - import natlink - - engine_modes = {"normal":0, "command":2, "dictation":1,"numbers":3, "spell":4} - mic_modes = ["on", "sleeping", "off"] + engine_modes = {"normal": 0, "command": 2, + "dictation": 1, "numbers": 3, "spell": 4} + mic_modes = {"on": 5, "sleeping": 6, "off": 7} engine_state = None previous_engine_state = None mic_state = None + timer_callback = None - def initialize(self): + @classmethod + def initialize(cls): # Remove "normal" and "off" from 'states' for non-DNS based engines. - if self.engine != 'natlink': - self.engine_modes.pop("normal", 0) - self.mic_modes.remove("off") + if engine != 'natlink': + cls.engine_modes.pop("normal", 0) + cls.mic_modes.pop("off", 7) + #if self.engine == 'natlink': # Sets 1st index key ("normal" or "command") depending on engine type as default mode - self.engine_state = self.previous_engine_state = next(iter(self.engine_modes.keys())) - + cls.engine_state = cls.previous_engine_state = next( + iter(cls.engine_modes.keys())) + # Timer to synchronize natlink.getMicState/SetRecognitionMode with mode_state in case of changed by end-user via DNS GUI. + if engine == 'natlink' and cls.timer_callback is None: + cls.timer_callback = get_current_engine().create_timer(callback=cls._sync_mode, interval=1) + cls.timer_callback.start() - def set_mic_mode(self, mode): + @classmethod + def set_mic_mode(cls, mode): """ Changes the engine microphone mode - 'on': mic is on - 'sleeping': mic from the sleeping and can be woken up by command - 'off': mic off and cannot be turned back on by voice. (DNS Only) + :param mode: str + 'on': mic is on + 'sleeping': mic from the sleeping and can be woken up by command + 'off': mic off and cannot be turned back on by voice. (DPI Only) """ - if mode in self.mic_modes: - self.mic_state = mode - if self.engine == 'natlink': - self.natlink.setMicState(mode) - # From here other engines use grammar exclusivity to re-create the sleep mode - #if mode != "off": # off does not need grammar exclusivity - #pass - # TODO: Implement mic mode sleep mode using grammar exclusivity. This should override DNS is built in sleep grammar but kept in sync automatically with natlink.setmic_state - else: - printer.out("Caster: 'set_mic_mode' is not implemented for '{}'".format(self.engine)) + if mode in cls.mic_modes: + cls.mic_state = mode + if engine == 'natlink': + natlink.setMicState(mode) + # Overrides DNS/DPI is built in sleep grammar + ExclusiveManager(mode, modetype="mic_mode") else: - printer.out("Caster: '{}' is not a valid. set_mic_state modes are: 'off' - DNS Only, 'on', 'sleeping'".format(mode)) + printer.out( + "Caster: '{}' is not valid. set_mic_state modes are: 'off' - DPI Only, 'on', 'sleeping'".format(mode)) - - def get_mic_mode(self): + @classmethod + def get_mic_mode(cls): """ Returns mic state. - mode: string + mode: str """ - return self.mic_state - + return cls.mic_state - def set_engine_mode(self, mode=None, state=True): + @classmethod + def set_engine_mode(cls, mode=None, state=True): """ Sets the engine mode so that only certain types of commands/dictation are recognized. - 'state': Bool - enable/disable mode. + :param state: Bool - enable/disable mode. 'True': replaces current mode (Default) 'False': restores previous mode - 'normal': dictation and command (Default: DNS only) - 'dictation': Dictation only - 'command': Commands only (Default: Other engines) - 'numbers': Numbers only - 'spell': Spelling only + :param mode: str + 'normal': dictation and command (Default: DPI only) + 'dictation': Dictation only + 'command': Commands only (Default: Other engines) + 'numbers': Numbers only + 'spell': Spelling only """ if state and mode is not None: # Track previous engine state - # TODO: Timer to synchronize natlink.getMicState() with mengine_state in case of changed by end-user via DNS GUI. - self.previous_engine_state = self.engine_state + cls.previous_engine_state = cls.engine_state else: if not state: # Restore previous mode - mode = self.previous_engine_state + mode = cls.previous_engine_state else: - printer.out("Caster: set_engine_mode: 'State' cannot be 'True' with a undefined a 'mode'") - - if mode in self.engine_modes: - if self.engine == 'natlink': + printer.out( + "Caster: set_engine_mode: 'State' cannot be 'True' with a undefined a 'mode'") + + if mode in cls.engine_modes: + if engine == 'natlink': try: - self.natlink.execScript("SetRecognitionMode {}".format(self.engine_modes[mode])) # engine_modes[mode] is an integer - self.engine_state = mode + natlink.execScript("SetRecognitionMode {}".format( + cls.engine_modes[mode])) # engine_modes[mode] is an integer + cls.engine_state = mode + ExclusiveManager(mode, modetype="engine_mode") except Exception as e: printer.out("natlink.execScript failed \n {}".format(e)) else: - # TODO: Implement mode exclusivity. This should override DNS is built in sleep grammar but kept in sync automatically with natlinks SetRecognitionMode - # Once DNS enters its native mode exclusivity will override the any native DNS mode except for normal/command mode. - if self.engine == 'text': - self.engine_state = mode + # TODO: Implement set_engine_mode exclusivity. This should override DPI is built mode but kept in sync automatically. + if engine == 'text': + cls.engine_state = mode else: - printer.out("Caster: 'set_engine_mode' is not implemented for '{}'".format(self.engine)) + printer.out( + "Caster: 'set_engine_mode' is not implemented for '{}'".format(engine)) else: - printer.out("Caster: '{}' mode is not a valid. set_engine_mode: Modes: 'normal'- DNS Only, 'dictation', 'command', 'numbers', 'spell'".format(mode)) - + printer.out( + "Caster: '{}' mode is not valid. set_engine_mode: Modes: 'normal'- DPI Only, 'dictation', 'command', 'numbers', 'spell'".format(mode)) - def get_engine_mode(self): + @classmethod + def get_engine_mode(cls): """ Returns engine mode. - mode: str + mode: str + """ + return cls.engine_state + + @classmethod + def _sync_mode(cls): + """ + Synchronizes Caster exclusivity modes an with DNS/DPI GUI built-in modes state. """ - return self.engine_state + # TODO: Implement set_engine_mode logic with modes not just mic_state. + mic_state = cls.get_mic_mode() + if mic_state is None: + cls.mic_state = natlink.getMicState() + else: + if natlink.getMicState() != mic_state: + cls.set_mic_mode(natlink.getMicState()) + + +class ExclusiveManager: + """ + Loads and switches exclusivity for caster modes + :param mode: str + :param modetype: 'mic_mode' or 'engine_mode' str + """ + # TODO: Implement set_engine_mode exclusivity with mode rules. + # TODO: Implement timer for sleep mode. + # TODO: Implement hotkey for microphone on-off + sleep_grammar = None + sleeping = False + + sleep_rule = MappingRule( + name="sleep_rule", + mapping={ + "caster ": Function(lambda mic_mode: EngineModesManager.set_mic_mode(mode=mic_mode)), + "": Function(lambda text: False) + }, + extras=[Choice("mic_mode", { + "off": "off", + "on": "on", + "sleep": "sleeping", + }), + Dictation("text")], + context=FuncContext(lambda: ExclusiveManager.sleeping), + ) + + def __init__(self, mode, modetype): + if modetype == "mic_mode": + if not isinstance(ExclusiveManager.sleep_grammar, Grammar): + grammar = ExclusiveManager.sleep_grammar = Grammar("sleeping") + grammar.add_rule(self.sleep_rule) + grammar.load() + if mode == "sleeping": + self.set_exclusive(state=True) + printer.out("Caster: Microphone is sleeping") + if mode == "on": + self.set_exclusive(state=False) + printer.out("Caster: Microphone is on") + if mode == "off": + printer.out("Caster: Microphone is off") + else: + printer.out("{}, {} not implemented".format(mode, modetype)) + + def set_exclusive(self, state): + grammar = ExclusiveManager.sleep_grammar + ExclusiveManager.sleeping = state + grammar.set_exclusive(state) + get_engine().process_grammars_context() \ No newline at end of file diff --git a/castervoice/lib/ctrl/nexus.py b/castervoice/lib/ctrl/nexus.py index 1c1c67002..231571c84 100644 --- a/castervoice/lib/ctrl/nexus.py +++ b/castervoice/lib/ctrl/nexus.py @@ -32,7 +32,6 @@ from castervoice.lib.ctrl.mgr.validation.rules.rule_validation_delegator import CCRRuleValidationDelegator from castervoice.lib.merge.ccrmerging2.ccrmerger2 import CCRMerger2 from castervoice.lib.merge.ccrmerging2.merging.classic_merging_strategy import ClassicMergingStrategy -from castervoice.lib.ctrl.mgr.engine_manager import EngineModesManager class Nexus: def __init__(self, content_loader): @@ -79,13 +78,9 @@ def __init__(self, content_loader): self._content_loader, hooks_runner, rules_config, smrc, mapping_rule_maker, transformers_runner) - '''tracks engine grammar exclusivity and mic states -- TODO Grammar exclusivity should be managed through grammar manager''' - self._engine_modes_manager = EngineModesManager() - '''ACTION TIME:''' self._load_and_register_all_content(rules_config, hooks_runner, transformers_runner) self._grammar_manager.initialize() - self._engine_modes_manager.initialize() def _load_and_register_all_content(self, rules_config, hooks_runner, transformers_runner): """ diff --git a/castervoice/rules/apps/speech_engine/dragon_rules/dragon.py b/castervoice/rules/apps/speech_engine/dragon_rules/dragon.py index 07b2a7c83..3c8a7fd36 100644 --- a/castervoice/rules/apps/speech_engine/dragon_rules/dragon.py +++ b/castervoice/rules/apps/speech_engine/dragon_rules/dragon.py @@ -9,8 +9,6 @@ class DragonRule(MappingRule): mapping = { - '(lock Dragon | deactivate)': - R(Playback([(["go", "to", "sleep"], 0.0)])), '(number|numbers) mode': R(Playback([(["numbers", "mode", "on"], 0.0)])), 'spell mode': diff --git a/castervoice/rules/core/engine_manager_rules/mic_rules.py b/castervoice/rules/core/engine_manager_rules/mic_rules.py new file mode 100644 index 000000000..bbf348ba2 --- /dev/null +++ b/castervoice/rules/core/engine_manager_rules/mic_rules.py @@ -0,0 +1,24 @@ +from dragonfly import Dictation, MappingRule, Choice, Function +from castervoice.lib.actions import Text + +from castervoice.lib.ctrl.mgr.rule_details import RuleDetails +from castervoice.lib.merge.state.short import R + +from castervoice.lib.ctrl.mgr.engine_manager import EngineModesManager + +class CasterMicRule(MappingRule): + mapping = { + "caster ": Function(lambda mic_mode: EngineModesManager.set_mic_mode(mode=mic_mode)), + } + extras = [ + Choice( + "mic_mode", { + "off": "off", + "on": "on", + "sleep": "sleeping", + }), + ] + defaults = {} + +def get_rule(): + return CasterMicRule, RuleDetails(name="caster mic mode", transformer_exclusion=True) \ No newline at end of file diff --git a/docs/CasterQuickReference.pdf b/docs/CasterQuickReference.pdf index 376da8c85e18d00a83bf3d43b4be06efe43fb9ab..c5b94a8faa0904f9792f078899908602366dcbbd 100644 GIT binary patch delta 19338 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 I`vjQ&AJJq5p8x;= diff --git a/docs/CasterQuickReference.tex b/docs/CasterQuickReference.tex index 39bbf25e5..9946ce914 100644 --- a/docs/CasterQuickReference.tex +++ b/docs/CasterQuickReference.tex @@ -437,11 +437,13 @@ \section*{Caster Quick Reference} % Title \sectiontitle{Update and Caster Management} +\command{caster \footnotemark[2]}{microphone on, off, sleep} \command{clear caster log}{Clears Log Window} \command{update dragonfly}{Updates Dragonfly} \command{reboot caster}{Restarts Caster} \command{caster settings editor}{Caster settings editor} +\footnotetext[2]{'Off' Implemented for DNS/DPI only} %---------------------------------------------------------------------------------------- \end{minipage} }