| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | # -*- coding: utf-8 -*-from __future__ import divisionfrom .__load__ import *# 口 说话class Mouth(object):	tool = {}	def init(self, robot):		self.robot = robot		# 播放器		self.speaker = None		# 对话		self.onSay = None		return self	def say(self, msg, cache=False, plugin='', completed=None):		print(msg)		if self.onSay:			self.robot.logger.info(self.log('onSay: {}'.format(msg)))			if plugin != '':				self.onSay("[{}] {}".format(plugin, msg))			else:				self.onSay(msg)			self.onSay = None		if plugin != '':			self.robot.brain.addMemory(1, "[{}] {}".format(plugin, msg))		else:			self.robot.brain.addMemory(1, msg)		pattern = r'^https?://.+'		if re.match(pattern, msg):			self.robot.logger.info(self.log('内容包含URL,无法读取'))			return		voice = ''		voice = self.robot.tool['tts'].tts(msg)		if cache:			saveCache(voice, msg)		'''		if getCache(msg):			self.robot.logger.info(self.log('命中缓存,播放缓存语音'))			voice = getCache(msg)		else:			try:				voice = self.robot.tool['tts'].tts(msg)				if cache:					saveCache(voice, msg)			except Exception as e:				self.robot.logger.error(self.log('保存缓存失败:{}'.format(e)))		'''		if completed is None:			completed = lambda: self.robot.brain.doubt(msg)		self.speek(voice, not cache, completed=completed)	def speek(self, voice, delete=False, completed=None):		if self.speaker == None:			self.speaker = Demeter.service('sox', 'player')		self.speaker.play(voice, delete=delete, onCompleted=completed)	def checkSpeeker(self):		return self.speaker is not None and self.speaker.is_playing()	# 中断、停止	def close(self):		if self.checkSpeeker():			self.speaker.stop()			self.speaker = None	def talk(self, fp, callback=None):		self.speek(self.robot.data + 'beep_lo.wav')		self.robot.logger.info(self.log('结束录音'))		self.robot.isRecording = False		if self.robot.profiling:			self.robot.logger.info(self.log('性能调试已打开'))			pr = cProfile.Profile()			pr.enable()			self.onTalk(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.onTalk(fp, callback)	def onTalk(self, fp, callback=None, onSay=None):		try:			self.robot.stop()			query = self.robot.tool['asr'].asr(fp)			File.remove(fp)			self.robot.brain.think(query, callback, onSay)		except Exception as e:			self.robot.logger.critical(self.log(e))			clean()	def log(self, text):		return 'Mouth:' + text
 |