class IOHandler(): def __init__(self, args, datastore): self.args = args self.datastore = datastore self.responder = Responder(args, datastore, self) if args.use_irc: self.ircbot = IRCBot(args) def get_message(self) -> str: '''Returns the next message from the user''' if self.args.use_irc: return self.ircbot.get_message() return input("> ") def send_message(self, message: str) -> None: '''Sends a message to the user''' if self.args.use_irc: return self.ircbot.send_message(message) print(f"{self.args.bot_name}: {message}\n") def ask_question(self, question: str) -> str: '''Prompts the user with question, returns their response''' self.send_message(question) return self.get_message() def listen(self) -> None: '''Main loop of the chatbot. Gets messages, prints response. Returns when program is over''' while True: try: message = self.get_message() #Exit condition if self.responder.is_signaling_exit(message): self.send_message(self.responder.get_exit_phrase()) return self.send_message(self.responder.get_response(message)) except KeyboardInterrupt: self.send_message(self.responder.get_exit_phrase()) break
def log(text): print("[%s] %s" % (str(datetime.now()), text)) while True: pcm = audio_stream.read(porcupine.frame_length) pcm = struct.unpack_from("h" * porcupine.frame_length, pcm) result = porcupine.process(pcm) if result >= 0: log("Hotword Detected: %s" % KEYWORDS[result]) in_fname = get_command_recording() _, out_fname = tempfile.mkstemp(".mp3", "tts_out") aud_file = open(in_fname, "rb") ai_response = rp.get_response("not_found", None) try: resp = ai.speech(aud_file, {"Content-Type": "audio/wav"}) log("Utterance: %s" % resp["text"]) intent = resp["intents"][0]["name"] log("Intent: %s" % intent) ai_response = rp.get_response(intent, resp["traits"]) except Exception as error: print(error) finally: aud_file.close() os.unlink(in_fname) log("Response: %s" % ai_response) gtitties = gTTS(ai_response, lang="bn") gtitties.save(out_fname) log("DEBUG (TTS out): %s" % out_fname)