fix_alsa_config.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. '''
  2. Author: zhaoyong 77912776@qq.com
  3. Date: 2025-08-24 15:45:57
  4. LastEditTime: 2025-08-24 16:02:32
  5. LastEditors: zhaoyong 77912776@qq.com
  6. FilePath: \robot_ai\fix_alsa_config.py
  7. Description: 头部注释配置模板
  8. '''
  9. #!/usr/bin/env python3
  10. # -*- coding: utf-8 -*-
  11. """
  12. ALSA配置优化脚本
  13. 解决Ubuntu环境中的ALSA音频问题
  14. """
  15. import os
  16. import platform
  17. import subprocess
  18. import shutil
  19. from utils.logger import setup_logger, logger
  20. def check_alsa_config():
  21. """检查ALSA配置"""
  22. logger.info("🔍 检查ALSA配置...")
  23. try:
  24. # 检查ALSA版本
  25. result = subprocess.run(['aplay', '--version'],
  26. capture_output=True, text=True, timeout=10)
  27. if result.returncode == 0:
  28. logger.info(f"📋 ALSA版本: {result.stdout.strip()}")
  29. else:
  30. logger.warning("⚠️ 无法获取ALSA版本信息")
  31. except Exception as e:
  32. logger.error(f"❌ 检查ALSA版本失败: {e}")
  33. def check_audio_devices():
  34. """检查音频设备"""
  35. logger.info("🎵 检查音频设备...")
  36. try:
  37. # 列出音频设备
  38. result = subprocess.run(['aplay', '-l'],
  39. capture_output=True, text=True, timeout=10)
  40. if result.returncode == 0:
  41. logger.info("📋 音频播放设备:")
  42. for line in result.stdout.strip().split('\n'):
  43. if line.strip():
  44. logger.info(f" {line}")
  45. else:
  46. logger.warning("⚠️ 无法获取音频设备列表")
  47. except Exception as e:
  48. logger.error(f"❌ 检查音频设备失败: {e}")
  49. def create_alsa_config():
  50. """创建优化的ALSA配置"""
  51. logger.info("⚙️ 创建优化的ALSA配置...")
  52. # ALSA配置文件路径 - 应该在用户主目录
  53. if platform.system().lower() == 'linux':
  54. config_path = os.path.expanduser("~/.asoundrc")
  55. else:
  56. logger.info("📋 非Linux系统,跳过ALSA配置")
  57. return False
  58. # 优化的ALSA配置 - 专门针对音色清晰度优化
  59. alsa_config = """# ALSA配置文件 - 自动生成
  60. # 用于修复音频设备配置问题,解决电流声和音色不清晰问题
  61. # 默认PCM设备配置 - 使用优化的缓冲区设置,提高音色清晰度
  62. pcm.!default {
  63. type plug
  64. slave.pcm {
  65. type hw
  66. card 0
  67. device 0
  68. rate 16000
  69. channels 1
  70. format S16_LE
  71. buffer_size 1024
  72. period_size 512
  73. }
  74. }
  75. # 默认控制设备配置
  76. ctl.!default {
  77. type hw
  78. card 0
  79. }
  80. # 高清晰度PCM设备 - 专门用于TTS播放,确保音色清晰
  81. pcm.high_quality {
  82. type plug
  83. slave.pcm {
  84. type hw
  85. card 0
  86. device 0
  87. rate 16000
  88. channels 1
  89. format S16_LE
  90. buffer_size 512
  91. period_size 256
  92. }
  93. }
  94. # 低延迟PCM设备 - 用于TTS播放
  95. pcm.lowlatency {
  96. type plug
  97. slave.pcm {
  98. type hw
  99. card 0
  100. device 0
  101. rate 16000
  102. channels 1
  103. format S16_LE
  104. buffer_size 1024
  105. period_size 512
  106. }
  107. }
  108. # 稳定PCM设备 - 用于避免电流声
  109. pcm.stable {
  110. type plug
  111. slave.pcm {
  112. type hw
  113. card 0
  114. device 0
  115. rate 16000
  116. channels 1
  117. format S16_LE
  118. buffer_size 2048
  119. period_size 1024
  120. }
  121. }
  122. # 无电流声PCM设备 - 专门用于避免电流声
  123. pcm.no_current_noise {
  124. type plug
  125. slave.pcm {
  126. type hw
  127. card 0
  128. device 0
  129. rate 16000
  130. channels 1
  131. format S16_LE
  132. buffer_size 1024
  133. period_size 512
  134. }
  135. }
  136. # 简单PCM设备
  137. pcm.simple {
  138. type plug
  139. slave.pcm "hw:0,0"
  140. }
  141. # 禁用不存在的设备以避免ALSA错误
  142. pcm.front {
  143. type null
  144. }
  145. pcm.rear {
  146. type null
  147. }
  148. pcm.center_lfe {
  149. type null
  150. }
  151. pcm.side {
  152. type null
  153. }
  154. pcm.surround21 {
  155. type null
  156. }
  157. pcm.surround40 {
  158. type null
  159. }
  160. pcm.surround41 {
  161. type null
  162. }
  163. pcm.surround50 {
  164. type null
  165. }
  166. pcm.surround51 {
  167. type null
  168. }
  169. pcm.surround71 {
  170. type null
  171. }
  172. pcm.iec958 {
  173. type null
  174. }
  175. pcm.spdif {
  176. type null
  177. }
  178. pcm.hdmi {
  179. type null
  180. }
  181. pcm.modem {
  182. type null
  183. }
  184. pcm.phoneline {
  185. type null
  186. }
  187. # 禁用OSS设备
  188. pcm.dsp {
  189. type null
  190. }
  191. # 禁用USB音频设备错误
  192. pcm.usb_stream {
  193. type null
  194. }
  195. """
  196. try:
  197. # 备份现有配置
  198. if os.path.exists(config_path):
  199. backup_path = config_path + ".backup"
  200. shutil.copy2(config_path, backup_path)
  201. logger.info(f"📋 已备份现有配置到: {backup_path}")
  202. # 写入新配置
  203. with open(config_path, 'w') as f:
  204. f.write(alsa_config)
  205. logger.info(f"✅ ALSA配置文件已创建: {config_path}")
  206. # 设置文件权限
  207. os.chmod(config_path, 0o644)
  208. logger.info("✅ 已设置配置文件权限")
  209. return True
  210. except Exception as e:
  211. logger.error(f"❌ 创建ALSA配置文件失败: {e}")
  212. return False
  213. def create_simple_alsa_config():
  214. """创建简单的ALSA配置"""
  215. logger.info("⚙️ 创建简单的ALSA配置...")
  216. # ALSA配置文件路径
  217. if platform.system().lower() == 'linux':
  218. config_path = os.path.expanduser("~/.asoundrc")
  219. else:
  220. logger.info("📋 非Linux系统,跳过ALSA配置")
  221. return False
  222. # 简单的ALSA配置
  223. simple_config = """# 简单ALSA配置文件
  224. # 用于修复音频设备配置问题
  225. # 默认PCM设备
  226. pcm.!default {
  227. type plug
  228. slave.pcm "hw:0,0"
  229. }
  230. # 默认控制设备
  231. ctl.!default {
  232. type hw
  233. card 0
  234. }
  235. """
  236. try:
  237. # 备份现有配置
  238. if os.path.exists(config_path):
  239. backup_path = config_path + ".backup"
  240. shutil.copy2(config_path, backup_path)
  241. logger.info(f"📋 已备份现有配置到: {backup_path}")
  242. # 写入新配置
  243. with open(config_path, 'w') as f:
  244. f.write(simple_config)
  245. logger.info(f"✅ 简单ALSA配置文件已创建: {config_path}")
  246. logger.info("✅ 配置文件已简化,避免复杂配置导致的错误")
  247. # 设置文件权限
  248. os.chmod(config_path, 0o644)
  249. logger.info("✅ 已设置配置文件权限")
  250. return True
  251. except Exception as e:
  252. logger.error(f"❌ 创建ALSA配置文件失败: {e}")
  253. return False
  254. def remove_alsa_config():
  255. """移除ALSA配置文件"""
  256. logger.info("🗑️ 移除ALSA配置文件...")
  257. if platform.system().lower() != 'linux':
  258. logger.info("📋 非Linux系统,跳过ALSA配置移除")
  259. return False
  260. config_path = os.path.expanduser("~/.asoundrc")
  261. try:
  262. if os.path.exists(config_path):
  263. # 备份现有配置
  264. backup_path = config_path + ".backup"
  265. shutil.copy2(config_path, backup_path)
  266. logger.info(f"📋 已备份现有配置到: {backup_path}")
  267. # 移除配置文件
  268. os.remove(config_path)
  269. logger.info(f"✅ 已移除ALSA配置文件: {config_path}")
  270. logger.info("💡 系统将使用默认ALSA配置")
  271. return True
  272. else:
  273. logger.info("📋 ALSA配置文件不存在")
  274. return False
  275. except Exception as e:
  276. logger.error(f"❌ 移除ALSA配置文件失败: {e}")
  277. return False
  278. def check_pulseaudio():
  279. """检查PulseAudio状态"""
  280. logger.info("🔊 检查PulseAudio状态...")
  281. try:
  282. # 检查PulseAudio是否运行
  283. result = subprocess.run(['pulseaudio', '--check'],
  284. capture_output=True, text=True, timeout=10)
  285. if result.returncode == 0:
  286. logger.info("✅ PulseAudio正在运行")
  287. else:
  288. logger.warning("⚠️ PulseAudio未运行,尝试启动...")
  289. subprocess.run(['pulseaudio', '--start'],
  290. capture_output=True, text=True, timeout=10)
  291. except Exception as e:
  292. logger.error(f"❌ 检查PulseAudio失败: {e}")
  293. def reload_alsa():
  294. """重新加载ALSA配置"""
  295. logger.info("🔄 重新加载ALSA配置...")
  296. try:
  297. # 重启ALSA服务
  298. subprocess.run(['sudo', 'systemctl', 'restart', 'alsa-utils'],
  299. capture_output=True, text=True, timeout=10)
  300. logger.info("✅ ALSA服务已重启")
  301. except Exception as e:
  302. logger.warning(f"⚠️ 重启ALSA服务失败: {e}")
  303. logger.info("💡 请手动重启音频服务或重新登录")
  304. def optimize_audio_settings():
  305. """优化音频设置"""
  306. logger.info("🎛️ 优化音频设置...")
  307. if platform.system().lower() != 'linux':
  308. logger.info("📋 非Linux系统,跳过音频优化")
  309. return
  310. # 首先尝试移除现有配置
  311. if remove_alsa_config():
  312. logger.info("✅ 已移除有问题的ALSA配置")
  313. # 创建简单的ALSA配置
  314. if create_simple_alsa_config():
  315. logger.info("✅ 简单ALSA配置创建完成")
  316. else:
  317. logger.warning("⚠️ 无法创建ALSA配置,将使用系统默认配置")
  318. # 重新加载ALSA配置
  319. reload_alsa()
  320. # 检查PulseAudio
  321. check_pulseaudio()
  322. # 检查音频设备
  323. check_audio_devices()
  324. def main():
  325. """主函数"""
  326. setup_logger('fix_alsa', 'logs')
  327. logger.info("🚀 开始ALSA配置优化...")
  328. # 检查系统
  329. logger.info(f"📋 操作系统: {platform.system()} {platform.release()}")
  330. # 检查ALSA配置
  331. check_alsa_config()
  332. # 优化音频设置
  333. optimize_audio_settings()
  334. logger.info("✅ ALSA配置优化完成")
  335. logger.info("💡 建议重启音频服务或重新登录以应用配置")
  336. logger.info("💡 如果仍有问题,请运行: sudo systemctl restart pulseaudio")
  337. if __name__ == "__main__":
  338. main()