def switch_off_do_not_bother(self): """ 关闭勿扰模式 """ utils.do_not_bother = False Player.play(constants.getData("on.wav")) logger.info("勿扰模式关闭")
def activeListen(self, silent=False): """主动问一个问题(适用于多轮对话)""" if config.get("/LED/enable", False): LED.wakeup() logger.debug("activeListen") try: if not silent: Player.play(constants.getData("beep_hi.wav")) listener = snowboydecoder.ActiveListener([ constants.getHotwordModel(config.get("hotword", "wukong.pmdl")) ]) voice = listener.listen( silent_count_threshold=config.get("silent_threshold", 15), recording_timeout=config.get("recording_timeout", 5) * 4, ) if not silent: Player.play(constants.getData("beep_lo.wav")) if voice: query = self.asr.transcribe(voice) utils.check_and_delete(voice) return query return "" except Exception as e: logger.error("主动聆听失败".format(e)) return ""
def switch_on_do_not_bother(self): """ 打开勿扰模式 """ utils.do_not_bother = True Player.play(constants.getData("off.wav")) logger.info("勿扰模式打开")
def activeListen(self, silent=False): """ 主动问一个问题(适用于多轮对话) """ if config.get('/LED/enable', False): LED.wakeup() logger.debug('activeListen') try: if not silent: #time.sleep(1) Player.play(constants.getData('beep_hi.wav')) listener = snowboydecoder.ActiveListener([ constants.getHotwordModel(config.get('hotword', 'wukong.pmdl')) ]) voice = listener.listen( silent_count_threshold=config.get('silent_threshold', 15), recording_timeout=config.get('recording_timeout', 5) * 4) if not silent: Player.play(constants.getData('beep_lo.wav')) if voice: query = self.asr.transcribe(voice) utils.check_and_delete(voice) return query return '' except Exception as e: logger.error(e) return ''
def _do_not_bother_on_callback(self): if config.get('/do_not_bother/hotword_switch', False): utils.do_not_bother = True Player.play(constants.getData('off.wav')) logger.info('勿扰模式打开') data = [255, 0, 0] * 12 pixels.show(data)
def _detected_callback(self): if not utils.is_proper_time(): logger.warning('勿扰模式开启中') return if self._conversation.isRecording: logger.warning('正在录音中,跳过') return Player.play(constants.getData('beep_hi.wav')) logger.info('开始录音') self._conversation.interrupt() self._conversation.isRecording = True
def _detected_callback(self): def start_record(): logger.info('开始录音') self._conversation.isRecording = True; if not utils.is_proper_time(): logger.warning('勿扰模式开启中') return if self._conversation.isRecording: logger.warning('正在录音中,跳过') return self._conversation.interrupt() Player.play(constants.getData('beep_hi.wav'), onCompleted=start_record, wait=True)
def converse(self, fp): # 播放唤醒后提示音 global asr,asr_slug statistic.active() Player.player('static/beep_lo.wav', False) asr_slug = ASR.get_engine_by_slug(config.get('/asr_engine')) self.do_ASR(asr_slug) # 将语音翻译为文本 query = asr.transcribe(fp) self.doResponse(query) # 删除临时存在的语音文件 utils.check_and_delete(fp)
def activeListen(self): """ 主动问一个问题(适用于多轮对话) """ time.sleep(1) Player.play(constants.getData('beep_hi.wav')) listener = snowboydecoder.ActiveListener( [constants.getHotwordModel(config.get('hotword', 'wukong.pmdl'))]) voice = listener.listen( silent_count_threshold=config.get('silent_threshold', 15), recording_timeout=config.get('recording_timeout', 5) * 4) Player.play(constants.getData('beep_lo.wav')) query = self.asr.transcribe(voice) utils.check_and_delete(voice) return query
def _detected_callback(self): print("3") if not utils.is_proper_time(): logger.warning('勿扰模式开启中') return if self._conversation.isRecording: logger.warning('正在录音中,跳过') return self._conversation.say('在“滴”声后,说出你想去的地方') time.sleep(4) Player.play(constants.getData('beep_hi.wav')) logger.info('开始录音') self._conversation.interrupt() self._conversation.isRecording = True
def _detected_callback(self): if not utils.is_proper_time(): logger.warning('勿扰模式开启中') return if self._conversation.isRecording: logger.warning('正在录音中,跳过') return server.onSay("{\"action_info\": \"wake\",\"msg\": \"唤醒\"}") # self._conversation.say(random.choice(self.wakes)) Player.play(constants.getData('bee_wake.mp3')) logger.info('开始录音') self._conversation.interrupt() self._conversation.isRecording = True
def say(self, msg, cache=False, plugin='', onCompleted=None): """ 说一句话 """ if self.i2c: self.i2c.recordSay(msg) if self.onSay: logger.info('onSay: {}'.format(msg)) if plugin != '': self.onSay("[{}] {}".format(plugin, msg)) else: self.onSay(msg) self.onSay = None if plugin != '': self.appendHistory(1, "[{}] {}".format(plugin, msg)) else: self.appendHistory(1, msg) pattern = r'^https?://.+' if re.match(pattern, msg): logger.info("内容包含URL,所以不读出来") return voice = '' if utils.getCache(msg): logger.info("命中缓存,播放缓存语音") voice = utils.getCache(msg) else: try: voice = self.tts.get_speech(msg) if cache: utils.saveCache(voice, msg) except Exception as e: logger.error('保存缓存失败:{}'.format(e)) if onCompleted is None: onCompleted = lambda: self._onCompleted(msg) self.player = Player.SoxPlayer() self.player.play(voice, not cache, onCompleted)
def _detected_callback(self): def start_record(): logger.info('开始录音') print('开始录音') self._conversation.isRecording = True; if not utils.is_proper_time(): logger.warning('勿扰模式开启中') return if self._conversation.isRecording: logger.warning('正在录音中,跳过') return self._conversation.interrupt() if config.get('/LED/enable', False): LED.wakeup() Player.play(constants.getData(random.choice(self._response_wav)), onCompleted=start_record, wait=True) with open("../communication/InPut.txt", "w") as file_writer: file_writer.write("true")
def converse(self, fp, callback=None): """ 核心对话逻辑 """ Player.play(constants.getData('beep_lo.wav')) logger.info('结束录音') self.isRecording = False if self.profiling: logger.info('性能调试已打开') pr = cProfile.Profile() pr.enable() self.doConverse(fp, callback) pr.disable() s = io.StringIO() sortby = 'cumulative' ps = pstats.Stats(pr, stream=s).sort_stats(sortby) ps.print_stats() print(s.getvalue()) else: self.doConverse(fp, callback)
def play(self, src, delete=False, onCompleted=None, volume=1): """ 播放一个音频 """ if config.get('/LED/enable', False): LED.wakeup() logger.debug('activeSpeak') if self.player: self.interrupt() self.player = Player.SoxPlayer() self.player.play(src, delete=delete, onCompleted=onCompleted)
def _detected_callback(self): def start_record(): logger.info("开始录音") self._conversation.isRecording = True utils.setRecordable(True) if not utils.is_proper_time(): logger.warning("勿扰模式开启中") return if self._conversation.isRecording: logger.warning("正在录音中,跳过") return self._conversation.interrupt() if config.get("/LED/enable", False): LED.wakeup() utils.setRecordable(False) Player.play(constants.getData("beep_hi.wav"), onCompleted=start_record, wait=True)
def say(self, msg, cache=False, plugin='', onCompleted=None, wait=False): """ 说一句话 :param msg: 内容 :param cache: 是否缓存这句话的音频 :param plugin: 来自哪个插件的消息(将带上插件的说明) :param onCompleted: 完成的回调 :param wait: 是否要等待说完(为True将阻塞主线程直至说完这句话) """ if plugin != '': self.appendHistory(1, "[{}] {}".format(plugin, msg)) else: self.appendHistory(1, msg) pattern = r'^https?://.+' if re.match(pattern, msg): logger.info("内容包含URL,所以不读出来") return voice = '' cache_path = '' if utils.getCache(msg): logger.info("命中缓存,播放缓存语音") if config.get('/tts_engine') == 'hass-tts': voice = self.tts.get_speech(msg) else: voice = utils.getCache(msg) cache_path = utils.getCache(msg) else: try: voice = self.tts.get_speech(msg) if voice != '': cache_path = utils.saveCache(voice, msg) except Exception as e: logger.error('保存缓存失败:{}'.format(e)) if self.onSay: logger.info(cache) audio = 'http://{}:{}/audio/{}'.format( config.get('/server/host'), config.get('/server/port'), os.path.basename(cache_path)) logger.info('onSay: {}, {}'.format(msg, audio)) if plugin != '': self.onSay("[{}] {}".format(plugin, msg), audio) else: self.onSay(msg, audio) self.onSay = None if onCompleted is None: onCompleted = lambda: self._onCompleted(msg) self.player = Player.SoxPlayer() self.player.play(voice, not cache, onCompleted, wait) if not cache: utils.check_and_delete(cache_path, 60) # 60秒后将自动清理不缓存的音频 utils.lruCache() # 清理缓存
def conversation(fp): global player, asr, ai, tts try: snowboydecoder.play_audio_file(constants.getData('beep_lo.wav')) print("converting audio to text") query = asr.transcribe(fp) utils.check_and_delete(fp) msg = ai.chat(query) voice = tts.get_speech(msg) player = Player.getPlayerByFileName(voice) player.play(voice) except ValueError as e: logger.critical(e) utils.clean()
def say(self, msg, cache=False, plugin='', onCompleted=None, wait=False, resident=False): """ 说一句话 :param resident: :param msg: 内容 :param cache: 是否缓存这句话的音频 :param plugin: 来自哪个插件的消息(将带上插件的说明) :param onCompleted: 完成的回调 :param wait: 是否要等待说完(为True将阻塞主线程直至说完这句话) """ self.appendHistory(1, msg, plugin=plugin) if re.match(r'^https?://.+', msg): logger.info("内容包含URL,所以不读出来") self.onSay(msg, '', plugin=plugin) self.onSay = None return voice = utils.getCache(msg, resident=resident) cache_path = '' if voice: logger.info("命中缓存,播放缓存语音") cache_path = voice else: try: voice = self.tts.get_speech(msg, resident=resident) cache_path = utils.saveCache(voice, msg, resident=resident) except Exception as e: logger.error('保存缓存失败:{}'.format(e)) if self.onSay: logger.info(cache) audio = 'http://{}:{}/audio/{}'.format( config.get('/server/host'), config.get('/server/port'), os.path.basename(cache_path)) logger.info('onSay: {}, {}'.format(msg, audio)) self.onSay(msg, audio, plugin=plugin) self.onSay = None if onCompleted is None: def onCompleted(): self._onCompleted(msg) self.player = Player.getPlayerByFileName(voice) self.player.play(voice, not cache, onCompleted, wait) utils.lruCache() # 清理缓存
def say(self, phrase, delete=False): """ 播放 """ # 实例化播放的方法 global tts # type=1,机器人说的话 self.appendHistory(1,phrase) self.player = Player.SoxPlayer() # 实例化语音合成的方法 tts_slug = TTS.get_engine_by_slug(config.get('/tts_engine')) self.do_TTS(tts_slug) # 得到需要播放的音频进行播放 fp = tts.get_speech(phrase) self.player.play(fp, True)
def say(self, msg, cache=False, plugin="", onCompleted=None, wait=False): """ 说一句话 :param msg: 内容 :param cache: 是否缓存这句话的音频 :param plugin: 来自哪个插件的消息(将带上插件的说明) :param onCompleted: 完成的回调 :param wait: 是否要等待说完(为True将阻塞主线程直至说完这句话) """ self.appendHistory(1, msg, plugin=plugin) pattern = r"^https?://.+" if re.match(pattern, msg): logger.info("内容包含URL,所以不读出来") self.onSay(msg, "", plugin=plugin) self.onSay = None return voice = "" cache_path = "" if utils.getCache(msg): logger.info("命中缓存,播放缓存语音") voice = utils.getCache(msg) cache_path = utils.getCache(msg) else: try: voice = self.tts.get_speech(msg) cache_path = utils.saveCache(voice, msg) except Exception as e: logger.error("语音合成失败:{}".format(e)) if self.onSay: logger.info(cache) audio = "http://{}:{}/audio/{}".format( config.get("/server/host"), config.get("/server/port"), os.path.basename(cache_path), ) logger.info("onSay: {}, {}".format(msg, audio)) self.onSay(msg, audio, plugin=plugin) self.onSay = None if onCompleted is None: onCompleted = lambda: self._onCompleted(msg) self.player = Player.SoxPlayer() self.player.play(voice, not cache, onCompleted, wait) if not cache: utils.check_and_delete(cache_path, 60) # 60秒后将自动清理不缓存的音频 utils.lruCache() # 清理缓存
def say(self, msg, cache=False, plugin='', onCompleted=None): """ 说一句话 """ if plugin != '': self.appendHistory(1, "[{}] {}".format(plugin, msg)) else: self.appendHistory(1, msg) voice = '' if utils.getCache(msg): logger.info("命中缓存,播放缓存语音") voice = utils.getCache(msg) else: voice = self.tts.get_speech(msg) if cache: utils.saveCache(voice, msg) if onCompleted is None: onCompleted = lambda: self._onCompleted(msg) self.player = Player.SoxPlayer() self.player.play(voice, not cache, onCompleted)
def say(self, msg, cache=False, plugin='', onCompleted=None, wait=False): """ 说一句话 :param msg: 内容 :param cache: 是否缓存这句话的音频 :param plugin: 来自哪个插件的消息(将带上插件的说明) :param onCompleted: 完成的回调 :param wait: 是否要等待说完(为True将阻塞主线程直至说完这句话) """ self.appendHistory(1, msg, plugin=plugin) pattern = r'^https?://.+' if re.match(pattern, msg): logger.info("内容包含URL,所以不读出来") print("内容包含URL,所以不读出来") self.onSay(msg, '', plugin=plugin) self.onSay = None return voice = '' cache_path = '' if utils.getCache(msg): logger.info("命中缓存,播放缓存语音") print("命中缓存,播放缓存语音") voice = utils.getCache(msg) cache_path = utils.getCache(msg) else: try: voice = self.tts.get_speech(msg) cache_path = utils.saveCache(voice, msg) except Exception as e: logger.error('保存缓存失败:{}'.format(e)) print('保存缓存失败:{}'.format(e)) if self.onSay: logger.info(cache) print(cache) self.onSay(msg, audio, plugin=plugin) self.onSay = None if onCompleted is None: onCompleted = lambda: self._onCompleted(msg) self.player = Player.SoxPlayer() self.player.play(voice, not cache, onCompleted, wait) if not cache: utils.check_and_delete(cache_path, 60) # 60秒后将自动清理不缓存的音频 utils.lruCache() # 清理缓存
def say(self, msg, cache=False, plugin='', onCompleted=None): """ 说一句话 """ if plugin != '': self.appendHistory(1, "[{}] {}".format(plugin, msg)) else: self.appendHistory(1, msg) pattern = r'^https?://.+' if re.match(pattern, msg): logger.info("内容包含URL,所以不读出来") return voice = '' cache_path = '' if utils.getCache(msg): logger.info("命中缓存,播放缓存语音") voice = utils.getCache(msg) cache_path = utils.getCache(msg) else: try: voice = self.tts.get_speech(msg) cache_path = utils.saveCache(voice, msg) except Exception as e: logger.error('保存缓存失败:{}'.format(e)) if self.onSay: logger.info(cache) audio = 'http://{}:{}/audio/{}'.format(config.get('/server/host'), config.get('/server/port'), os.path.basename(cache_path)) logger.info('onSay: {}, {}'.format(msg, audio)) if plugin != '': self.onSay("[{}] {}".format(plugin, msg), audio) else: self.onSay(msg, audio) self.onSay = None if onCompleted is None: onCompleted = lambda: self._onCompleted(msg) self.player = Player.SoxPlayer() self.player.play(voice, not cache, onCompleted) if not cache: utils.check_and_delete(cache_path, 60) # 60秒后将自动清理不缓存的音频 utils.lruCache() # 清理缓存
def say(self, msg, cache=False, plugin='', onCompleted=None): """ 说一句话 """ if plugin != '': self.appendHistory(1, "[{}] {}".format(plugin, msg)) else: self.appendHistory(1, msg) voice = '' if utils.getCache(msg): logger.info("命中缓存,播放缓存语音") voice = utils.getCache(msg) else: try: voice = self.tts.get_speech(msg) if cache: utils.saveCache(voice, msg) except Exception as e: logger.error('保存缓存失败:{}'.format(e)) if onCompleted is None: onCompleted = lambda: self._onCompleted(msg) self.player = Player.SoxPlayer() self.player.play(voice, not cache, onCompleted) self.say_call_back("{\"action_info\": \"msg\",\"msg\": \"" + msg + "\"}")
def _do_not_bother_off_callback(self): if config.get('/do_not_bother/hotword_switch', False): utils.do_not_bother = False Player.play(constants.getData('on.wav')) logger.info('勿扰模式关闭')
def detectedCallback(): global conversation if conversation: conversation.stop() Player.player('static/beep_hi.wav', False)
def play(self, src, delete=False, onCompleted=None, volume=1): """ 播放一个音频 """ if self.player: self.interrupt() self.player = Player.SoxPlayer() self.player.play(src, delete=delete, onCompleted=onCompleted)
def _do_not_bother_on_callback(self): if config.get('/hotword/hotword_switch', False): utils.do_not_bother = True Player.play(constants.getData('off.wav')) logger.info('勿扰模式打开')
def converse(self, fp, callback=None): """ 核心对话逻辑 """ Player.play(constants.getData('beep_lo.wav')) logger.info('结束录音') self.isRecording = False self.doConverse(fp, callback)