mouth.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. from .__load__ import *
  4. # 口 说话
  5. class Mouth(object):
  6. tool = {}
  7. def init(self, robot):
  8. self.robot = robot
  9. # 播放器
  10. self.speaker = None
  11. # 对话
  12. self.onSay = None
  13. return self
  14. def say(self, msg, cache=False, plugin='', completed=None):
  15. print(msg)
  16. if self.onSay:
  17. self.robot.logger.info(self.log('onSay: {}'.format(msg)))
  18. if plugin != '':
  19. self.onSay("[{}] {}".format(plugin, msg))
  20. else:
  21. self.onSay(msg)
  22. self.onSay = None
  23. if plugin != '':
  24. self.robot.brain.addMemory(1, "[{}] {}".format(plugin, msg))
  25. else:
  26. self.robot.brain.addMemory(1, msg)
  27. pattern = r'^https?://.+'
  28. if re.match(pattern, msg):
  29. self.robot.logger.info(self.log('内容包含URL,无法读取'))
  30. return
  31. voice = ''
  32. voice = self.robot.tool['tts'].tts(msg)
  33. if cache:
  34. saveCache(voice, msg)
  35. '''
  36. if getCache(msg):
  37. self.robot.logger.info(self.log('命中缓存,播放缓存语音'))
  38. voice = getCache(msg)
  39. else:
  40. try:
  41. voice = self.robot.tool['tts'].tts(msg)
  42. if cache:
  43. saveCache(voice, msg)
  44. except Exception as e:
  45. self.robot.logger.error(self.log('保存缓存失败:{}'.format(e)))
  46. '''
  47. if completed is None:
  48. completed = lambda: self.robot.brain.doubt(msg)
  49. self.speek(voice, not cache, completed=completed)
  50. def speek(self, voice, delete=False, completed=None):
  51. if self.speaker == None:
  52. self.speaker = Demeter.service('sox', 'player')
  53. self.speaker.play(voice, delete=delete, onCompleted=completed)
  54. def checkSpeeker(self):
  55. return self.speaker is not None and self.speaker.is_playing()
  56. # 中断、停止
  57. def close(self):
  58. if self.checkSpeeker():
  59. self.speaker.stop()
  60. self.speaker = None
  61. def talk(self, fp, callback=None):
  62. self.play(self.robot.data + 'beep_lo.wav')
  63. self.robot.logger.info(self.log('结束录音'))
  64. self.robot.isRecording = False
  65. if self.robot.profiling:
  66. self.robot.logger.info(self.log('性能调试已打开'))
  67. pr = cProfile.Profile()
  68. pr.enable()
  69. self.onTalk(fp, callback)
  70. pr.disable()
  71. s = io.StringIO()
  72. sortby = 'cumulative'
  73. ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
  74. ps.print_stats()
  75. print(s.getvalue())
  76. else:
  77. self.onTalk(fp, callback)
  78. def onTalk(self, fp, callback=None, onSay=None):
  79. try:
  80. self.robot.stop()
  81. query = self.robot.tool['asr'].asr(fp)
  82. File.remove(fp)
  83. self.robot.brain.think(query, callback, onSay)
  84. except Exception as e:
  85. self.robot.logger.critical(self.log(e))
  86. clean()
  87. def log(self, text):
  88. return 'Mouth:' + text