robot.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. from .__load__ import *
  4. class Robot(object):
  5. tool = {}
  6. def __init__(self, profiling=False):
  7. self.start()
  8. self.isRecording = False
  9. def say(self, msg, cache=False, plugin='', onCompleted=None):
  10. print msg
  11. self.player = Player.SoxPlayer()
  12. voice = self.tool['tts'].tts(msg)
  13. if onCompleted is None:
  14. onCompleted = lambda: self.onCompleted(msg)
  15. self.player.play(voice, not cache, onCompleted)
  16. def onCompleted(self, msg):
  17. if config.get('active_mode', False) and \
  18. (
  19. msg.endswith('?') or
  20. msg.endswith(u'?') or
  21. u'告诉我' in msg or u'请回答' in msg
  22. ):
  23. query = self.activeListen()
  24. self.doResponse(query)
  25. def start(self):
  26. # 机器人配置,后续改成从数据库读取
  27. self.config = Demeter.config['robot']
  28. self.reload()
  29. def reload(self):
  30. try:
  31. for item in self.config:
  32. setting = self.setting(self.config[item])
  33. if item not in self.tool:
  34. self.tool[item] = Demeter.service(self.config[item], 'api')
  35. self.tool[item].setting(**setting)
  36. self.player = None
  37. except Exception as e:
  38. Demeter.logger.critical("机器人初始化失败:{}".format(e))
  39. def setting(self, name):
  40. # 后续要改成数据库读取
  41. config = Demeter.config[name]
  42. return config
  43. def interrupt(self):
  44. if self.player is not None and self.player.is_playing():
  45. self.player.stop()
  46. self.player = None
  47. if self.immersiveMode:
  48. self.brain.pause()
  49. def converse(self, fp, callback=None):
  50. """ 核心对话逻辑 """
  51. Player.play(constants.getData('beep_lo.wav'))
  52. logger.info('结束录音')
  53. self.isRecording = False
  54. if self.profiling:
  55. logger.info('性能调试已打开')
  56. pr = cProfile.Profile()
  57. pr.enable()
  58. self.doConverse(fp, callback)
  59. pr.disable()
  60. s = io.StringIO()
  61. sortby = 'cumulative'
  62. ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
  63. ps.print_stats()
  64. print(s.getvalue())
  65. else:
  66. self.doConverse(fp, callback)
  67. def doConverse(self, fp, callback=None, onSay=None):
  68. try:
  69. self.interrupt()
  70. query = self.asr.transcribe(fp)
  71. utils.check_and_delete(fp)
  72. self.doResponse(query, callback, onSay)
  73. except Exception as e:
  74. logger.critical(e)
  75. utils.clean()
  76. def pardon(self):
  77. if not self.hasPardon:
  78. self.say("抱歉,刚刚没听清,能再说一遍吗?", onCompleted=lambda: self.doResponse(self.activeListen()))
  79. self.hasPardon = True
  80. else:
  81. self.say("没听清呢")
  82. self.hasPardon = False