init_system.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. """
  2. 系统初始化模块
  3. 负责机器人AI系统的初始化工作
  4. """
  5. import platform
  6. import subprocess
  7. from utils.logger import logger
  8. import time
  9. import asyncio
  10. from typing import Optional
  11. from core.socket_client import SocketClient
  12. from core.xunfei.message_processor import XunfeiMessageProcessor
  13. from core.baidu.message_processor import BaiduMessageProcessor
  14. from handlers.speech_handler import SpeechHandler
  15. from utils.logger import setup_logger
  16. from utils.time_sync import sync_system_time
  17. from utils.load_config import load_config
  18. class SystemInitializer:
  19. """系统初始化器"""
  20. def __init__(self):
  21. self.config = None
  22. self.speech_config = None
  23. self.service_type = None
  24. def initialize_system(self):
  25. """初始化整个系统"""
  26. try:
  27. # 设置日志
  28. setup_logger()
  29. logger.info("开始系统初始化...")
  30. # 加载配置
  31. self._load_configuration()
  32. # 初始化音频系统
  33. # self._init_audio_system()
  34. # 初始化组件
  35. components = self._init_components()
  36. logger.info("系统初始化完成")
  37. return components
  38. except Exception as e:
  39. logger.error(f"系统初始化失败: {e}")
  40. raise
  41. def _load_configuration(self):
  42. """加载配置"""
  43. try:
  44. self.config = load_config()
  45. self.speech_config = self.config.get('speech_recognition', {})
  46. self.service_type = self.speech_config.get(
  47. 'service', 'xunfei_aiui')
  48. logger.info(f"配置加载完成,使用服务类型: {self.service_type}")
  49. except Exception as e:
  50. logger.error(f"配置加载失败: {e}")
  51. raise
  52. def _init_audio_system(self):
  53. """初始化音频系统"""
  54. try:
  55. if platform.system() == "Linux":
  56. logger.info("检测到Linux系统,正在初始化音频系统...")
  57. try:
  58. # 杀掉当前 PulseAudio 进程
  59. logger.info("正在关闭PulseAudio进程...")
  60. subprocess.run(
  61. ["pulseaudio", "--kill"],
  62. capture_output=True,
  63. text=True,
  64. timeout=5
  65. )
  66. time.sleep(1)
  67. # 检查是否仍有进程占用声卡
  68. result = subprocess.run(
  69. ["fuser", "-v", "/dev/snd/*"],
  70. capture_output=True,
  71. text=True
  72. )
  73. if result.stdout.strip():
  74. logger.warning("检测到音频设备仍被占用:\n" + result.stdout)
  75. else:
  76. logger.info("音频设备已释放,可由ALSA独占使用")
  77. # 重启 PulseAudio
  78. logger.info("正在重新启动PulseAudio...")
  79. subprocess.run(
  80. ["pulseaudio", "--start"],
  81. capture_output=True,
  82. text=True,
  83. timeout=5
  84. )
  85. logger.info("PulseAudio已重新启动")
  86. except subprocess.TimeoutExpired:
  87. logger.warning("PulseAudio操作超时,继续执行")
  88. except FileNotFoundError:
  89. logger.warning("未找到 pulseaudio 命令,请确认已安装 PulseAudio")
  90. except Exception as e:
  91. logger.error(f"音频系统初始化异常: {e}")
  92. raise
  93. else:
  94. logger.info(f"当前系统: {platform.system()},跳过音频系统初始化")
  95. except Exception as e:
  96. logger.error(f"音频系统初始化失败: {e}")
  97. raise
  98. def _init_components(self):
  99. """初始化组件"""
  100. try:
  101. logger.info("正在初始化机器人AI语音识别组件...")
  102. components = {
  103. 'socket_client': None,
  104. 'xunfei_processor': None,
  105. 'speech_handler': None,
  106. 'baidu_processor': None
  107. }
  108. # 根据配置选择语音识别服务
  109. if self.service_type == 'baidu_realtime':
  110. logger.info("使用百度实时语音识别服务")
  111. # 使用百度消息处理器
  112. components['baidu_processor'] = BaiduMessageProcessor()
  113. if components['baidu_processor'].start():
  114. logger.info("百度实时语音识别启动成功")
  115. else:
  116. logger.error("百度实时语音识别启动失败")
  117. raise Exception("百度实时语音识别启动失败")
  118. elif self.service_type == 'xunfei_aiui':
  119. logger.info("使用讯飞AIUI语音识别服务")
  120. # 初始化语音处理器(工厂模式)
  121. components['speech_handler'] = SpeechHandler()
  122. # 初始化Socket客户端(用于讯飞AIUI)
  123. components['socket_client'] = SocketClient()
  124. # 初始化消息处理器
  125. components['xunfei_processor'] = XunfeiMessageProcessor(
  126. components['socket_client'])
  127. logger.info("机器人AI语音识别组件初始化完成")
  128. return components
  129. except Exception as e:
  130. logger.error(f"组件初始化失败: {e}")
  131. raise
  132. async def sync_time(self):
  133. """同步系统时间"""
  134. try:
  135. logger.info("正在同步系统时间...")
  136. # 在事件循环中运行同步函数
  137. loop = asyncio.get_event_loop()
  138. result = await loop.run_in_executor(None, sync_system_time)
  139. if result:
  140. logger.info("系统时间同步成功")
  141. else:
  142. logger.warning("系统时间同步失败,继续运行")
  143. except Exception as e:
  144. logger.error(f"时间同步异常: {e}")
  145. def initialize_robot_system():
  146. """初始化机器人系统的便捷函数"""
  147. initializer = SystemInitializer()
  148. return initializer.initialize_system()