# -*- coding: utf-8 -*- from __future__ import division from .__load__ import * class Robot(object): tool = {} def __init__(self, profiling=False): self.start() self.isRecording = False def say(self, msg, cache=False, plugin='', onCompleted=None): print msg self.player = Player.SoxPlayer() voice = self.tool['tts'].tts(msg) if onCompleted is None: onCompleted = lambda: self.onCompleted(msg) self.player.play(voice, not cache, onCompleted) def onCompleted(self, msg): if config.get('active_mode', False) and \ ( msg.endswith('?') or msg.endswith(u'?') or u'告诉我' in msg or u'请回答' in msg ): query = self.activeListen() self.doResponse(query) def start(self): # 机器人配置,后续改成从数据库读取 self.config = Demeter.config['robot'] self.reload() def reload(self): try: for item in self.config: setting = self.setting(self.config[item]) if item not in self.tool: self.tool[item] = Demeter.service(self.config[item], 'api') self.tool[item].setting(**setting) self.player = None except Exception as e: Demeter.logger.critical("机器人初始化失败:{}".format(e)) def setting(self, name): # 后续要改成数据库读取 config = Demeter.config[name] return config def interrupt(self): if self.player is not None and self.player.is_playing(): self.player.stop() self.player = None if self.immersiveMode: self.brain.pause() 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 doConverse(self, fp, callback=None, onSay=None): try: self.interrupt() query = self.asr.transcribe(fp) utils.check_and_delete(fp) self.doResponse(query, callback, onSay) except Exception as e: logger.critical(e) utils.clean() def pardon(self): if not self.hasPardon: self.say("抱歉,刚刚没听清,能再说一遍吗?", onCompleted=lambda: self.doResponse(self.activeListen())) self.hasPardon = True else: self.say("没听清呢") self.hasPardon = False