1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- # -*- 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
|