player.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. # 音频播放模块
  2. import os
  3. import platform
  4. import subprocess
  5. def play(audio_path: str):
  6. """
  7. 播放音频文件
  8. 输入:本地音频文件路径
  9. """
  10. if not os.path.exists(audio_path):
  11. raise FileNotFoundError(f'音频文件不存在: {audio_path}')
  12. system = platform.system()
  13. if system == 'Darwin': # macOS
  14. subprocess.run(['afplay', audio_path])
  15. elif system == 'Linux':
  16. # 尝试多个播放器
  17. for player in ['aplay', 'paplay', 'mpg123', 'ffplay']:
  18. try:
  19. subprocess.run(
  20. [player, audio_path],
  21. check=True,
  22. stdout=subprocess.DEVNULL,
  23. stderr=subprocess.DEVNULL,
  24. )
  25. return
  26. except FileNotFoundError:
  27. continue
  28. raise Exception('找不到可用的音频播放器')
  29. elif system == 'Windows':
  30. # Windows 用 PowerShell 播放
  31. subprocess.run(
  32. ['powershell', '-c', f'(New-Object Media.SoundPlayer "{audio_path}").PlaySync()'],
  33. shell=True,
  34. )
  35. else:
  36. raise Exception(f'不支持的系统: {system}')
  37. def play_url(audio_url: str):
  38. """直接播放 URL(先下载)"""
  39. from tts_client import download_audio
  40. local_path = download_audio(audio_url)
  41. try:
  42. play(local_path)
  43. finally:
  44. # 清理临时文件
  45. try:
  46. os.unlink(local_path)
  47. except OSError:
  48. pass
  49. if __name__ == '__main__':
  50. from tts_client import synthesize_and_download
  51. audio_path = synthesize_and_download('测试播放')
  52. play(audio_path)