import os import yaml from pathlib import Path from modules.config import Config from .modules.config import load_config from .modules.hassil.recognize import recognize from .modules.hassil.util import merge_dict from .modules.hassil.intents import Intents, TextSlotList from modules.responses.responses import Responses from .modules.input_handlers.stdin_input import StdinInput from .modules.input_handlers.pipewire_record import PipeWireRecord from .modules.responses.libnotify import respond from .modules.intents import * def main(): config = load_config() input_dict = {"intents": {}} response_dict = {"responses": {}} intent_yaml_path = Path(config.intents_dir) intent_yaml_file_paths = intent_yaml_path.glob("*.yaml") for yaml_file_path in intent_yaml_file_paths: with open(yaml_file_path, "r", encoding="utf-8") as yaml_file: merge_dict(input_dict, yaml.safe_load(yaml_file)) intents = Intents.from_dict(input_dict) response_yaml_path = Path(config.responses_dir) response_yaml_file_paths = response_yaml_path.glob("*.yaml") for yaml_file_path in response_yaml_file_paths: with open(yaml_file_path, "r", encoding="utf-8") as yaml_file: merge_dict(response_dict, yaml.safe_load(yaml_file)) responses = Responses.from_dict(response_dict) processes = [] for file in os.listdir(config.applications_dir): if file == "[": continue full_path = os.path.join(config.applications_dir, file) if os.path.isfile(full_path) or os.path.islink(full_path): processes.append(file) slot_lists = { "process": TextSlotList.from_strings(processes) } input_handler = PipeWireRecord() if config.input_mode == Config.INPUT_PW else StdinInput() try: # TODO select input type from config for input_text in input_handler.get_input(): result = recognize(input_text, intents, slot_lists=slot_lists) if result is not None: result_dict = { "intent": result.intent.name, **{e.name: e.value for e in result.entities_list}, } print(result_dict) handler = getattr(globals()[result_dict["domain"]], result_dict["intent"]) handler(result_dict, config) if result.response != "default": respond(responses.responses[result.intent.name].sentence_texts[0]) else: print("") finally: input_handler.cleanup() if __name__ == '__main__': main()