1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- # -*- coding: utf-8 -*-
- from __future__ import division
- from .__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.play(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
|