main_robot.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. """
  2. 机器人AI语音识别主程序入口
  3. Author: zhaoyong 77912776@qq.com
  4. Date: 2025-08-19
  5. LastEditTime: 2025-08-24
  6. """
  7. import time
  8. from datetime import datetime
  9. import signal
  10. from typing import Optional
  11. from utils.load_config import load_config
  12. from utils.logger import setup_logger, logger
  13. from handlers.aiui.EventListener import EventListener
  14. from handlers.aiui.AIui_node import AIUINode
  15. from handlers.baidu.speech_handler import BaiduSpeechHandler
  16. from handlers.speech_handler import SpeechHandler
  17. from core.message_processor import MessageProcessor
  18. from core.socket_client import SocketClient
  19. from utils.init_system import initialize_robot_system
  20. import sys
  21. class RobotAI:
  22. """机器人AI主类"""
  23. def __init__(self):
  24. self.run = True
  25. self.socket_client: Optional[SocketClient] = None
  26. self.message_processor: Optional[MessageProcessor] = None
  27. self.speech_handler: Optional[SpeechHandler] = None
  28. self.baidu_handler: Optional[BaiduSpeechHandler] = None
  29. self.xunfei_linux_node: Optional[AIUINode] = None
  30. signal.signal(signal.SIGINT, self._stop_handler)
  31. setup_logger('robot_ai', 'logs')
  32. self.config = load_config()
  33. self.speech_config = self.config.get('speech_recognition', {})
  34. self.service_type = self.speech_config.get('service', 'xunfei_aiui')
  35. self.is_xunfei_linux = self.service_type == 'xunfei_linux'
  36. self._init_components()
  37. def _stop_handler(self, signum, frame):
  38. """信号处理函数"""
  39. logger.info(f"收到信号 {signum},正在停止...")
  40. self.run = False
  41. def _init_components(self):
  42. """初始化语音识别组件"""
  43. logger.info("正在初始化机器人AI语音识别组件...")
  44. try:
  45. if self.service_type == 'baidu_realtime':
  46. self._init_baidu()
  47. elif self.is_xunfei_linux:
  48. self._init_xunfei_linux()
  49. else:
  50. self._init_xunfei_aiui()
  51. logger.info("机器人AI语音识别初始化完成")
  52. except Exception as e:
  53. logger.error(f"系统初始化失败: {e}")
  54. raise
  55. def _init_baidu(self):
  56. """初始化百度语音识别"""
  57. logger.info("使用百度实时语音识别服务")
  58. self.baidu_handler = BaiduSpeechHandler()
  59. if not self.baidu_handler.start_recognition():
  60. raise RuntimeError("百度实时语音识别启动失败")
  61. logger.info("百度实时语音识别启动成功")
  62. def _init_xunfei_linux(self):
  63. """初始化讯飞 Linux SDK"""
  64. logger.info("使用讯飞 Linux SDK 语音识别服务")
  65. event_listener = EventListener(skills_dict={}, debug=False)
  66. self.xunfei_linux_node = AIUINode(event_listener, debug=False)
  67. logger.info("讯飞 Linux SDK 初始化成功")
  68. def _init_xunfei_aiui(self):
  69. """初始化讯飞 AIUI"""
  70. logger.info("使用讯飞 AIUI 语音识别服务")
  71. self.speech_handler = SpeechHandler()
  72. self.socket_client = SocketClient()
  73. self.message_processor = MessageProcessor(self.socket_client)
  74. def start(self):
  75. """启动系统"""
  76. logger.info("机器人AI语音识别启动")
  77. try:
  78. if self.service_type == 'baidu_realtime':
  79. self._run_baidu()
  80. elif self.is_xunfei_linux:
  81. self._run_xunfei_linux()
  82. else:
  83. self._run_xunfei_aiui()
  84. except Exception as e:
  85. logger.error(f"系统运行异常: {e}")
  86. finally:
  87. self.stop()
  88. def _run_baidu(self):
  89. logger.info("百度实时语音识别服务运行中...")
  90. while self.run:
  91. time.sleep(1)
  92. def _run_xunfei_linux(self):
  93. logger.info("讯飞 Linux SDK 服务运行中...")
  94. if self.xunfei_linux_node:
  95. self.xunfei_linux_node.start(spin=True)
  96. def _run_xunfei_aiui(self):
  97. logger.info("讯飞 AIUI 服务运行中...")
  98. while self.run and self.message_processor:
  99. self.message_processor.process()
  100. def stop(self):
  101. """停止系统"""
  102. logger.info("正在停止机器人AI语音识别...")
  103. try:
  104. if self.baidu_handler and self.service_type == 'baidu_realtime':
  105. self.baidu_handler.stop_recognition()
  106. if self.xunfei_linux_node and self.is_xunfei_linux:
  107. self.xunfei_linux_node.shutdown()
  108. if self.socket_client:
  109. self.socket_client.close()
  110. logger.info("机器人AI语音识别已停止")
  111. except Exception as e:
  112. logger.error(f"停止过程中出现异常: {e}")
  113. def main():
  114. """主函数"""
  115. logger.info("=== 机器人AI主程序启动 ===")
  116. logger.info(f"启动时间: {datetime.now()}")
  117. try:
  118. # 先进行系统级初始化(音频/组件等)
  119. initialize_robot_system()
  120. robot = RobotAI()
  121. robot.start()
  122. logger.info("机器人AI主程序正常退出")
  123. return 0
  124. except KeyboardInterrupt:
  125. logger.info("收到键盘中断信号,程序退出")
  126. return 0
  127. except Exception as e:
  128. import traceback
  129. logger.error(f"程序启动失败: {e}")
  130. logger.error(f"错误详情: {traceback.format_exc()}")
  131. return 1
  132. if __name__ == '__main__':
  133. sys.exit(main())