Beispiel #1
0
 def switch_off_do_not_bother(self):
     """
     关闭勿扰模式
     """
     utils.do_not_bother = False
     Player.play(constants.getData("on.wav"))
     logger.info("勿扰模式关闭")
Beispiel #2
0
 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 ""
Beispiel #3
0
 def switch_on_do_not_bother(self):
     """
     打开勿扰模式
     """
     utils.do_not_bother = True
     Player.play(constants.getData("off.wav"))
     logger.info("勿扰模式打开")
Beispiel #4
0
 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)
Beispiel #6
0
 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
Beispiel #7
0
 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)
Beispiel #8
0
 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)
Beispiel #9
0
 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
Beispiel #10
0
 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
Beispiel #11
0
    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
Beispiel #12
0
 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)
Beispiel #13
0
 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")
Beispiel #14
0
 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)
Beispiel #15
0
 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)
Beispiel #16
0
    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)
Beispiel #17
0
    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()  # 清理缓存
Beispiel #18
0
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()
Beispiel #19
0
    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()  # 清理缓存
Beispiel #20
0
    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)
Beispiel #21
0
 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()  # 清理缓存
Beispiel #22
0
 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)
Beispiel #23
0
 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()  # 清理缓存
Beispiel #24
0
 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()  # 清理缓存
Beispiel #25
0
 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 +
                        "\"}")
Beispiel #26
0
 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('勿扰模式关闭')
Beispiel #27
0
def detectedCallback():
    global conversation
    if conversation:
        conversation.stop()
    Player.player('static/beep_hi.wav', False)
Beispiel #28
0
 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)
Beispiel #29
0
 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('勿扰模式打开')
Beispiel #30
0
 def converse(self, fp, callback=None):
     """ 核心对话逻辑 """
     Player.play(constants.getData('beep_lo.wav'))
     logger.info('结束录音')
     self.isRecording = False
     self.doConverse(fp, callback)