# 音量控制功能 ## 功能概述 本应用支持调整系统音量,根据不同操作系统需要安装不同的依赖。应用程序会在启动时自动检查这些依赖是否已安装。如果缺少依赖,将会显示相应的安装指令。 ## 平台支持 系统针对不同操作系统提供了不同的音量控制实现: 1. **Windows**: 使用 pycaw 和 comtypes 控制系统音量 2. **macOS**: 使用 applescript 控制系统音量 3. **Linux**: 根据系统环境使用 pactl (PulseAudio)、amixer (ALSA) 或 alsamixer 控制音量 ## 依赖安装 ### Windows ```bash pip install pycaw comtypes ``` ### macOS macOS系统需要安装applescript模块: ```bash pip install applescript ``` ### Linux 根据您的音频系统安装以下依赖之一: ```bash # PulseAudio 工具(推荐) sudo apt-get install pulseaudio-utils # 或者 ALSA 工具 sudo apt-get install alsa-utils # 如果需要使用 alsamixer 方式,还需要安装 expect sudo apt-get install alsa-utils expect ``` ## 使用方法 ### GUI模式 - 使用界面上的音量滑块直接调节音量 - 滑块会在移动后300毫秒更新系统音量(防抖设计) - 可通过语音命令控制音量,如"调高音量"、"把音量调到50%"等 ### CLI模式 - 使用 `v <音量值>` 命令调节音量,例如 `v 50` 将音量设置为50% - 支持的命令: - `v <数值>` 设置为指定音量值(0-100) ### 语音控制 通过IoT功能,可以使用语音命令控制音量: - "把音量调到50%" - "音量调小一点" - "音量调大" - "设置音量为80" ## 架构设计 音量控制功能采用分层设计,包括: 1. **VolumeController类** - 底层实现,负责跨平台音量操作 2. **BaseDisplay.update_volume** - 中间层,应用程序与底层控制器的桥接 3. **Speaker IoT设备** - 高级抽象,提供语音命令接口 ## 内部实现 ### 1. VolumeController类 VolumeController类是一个跨平台的音量控制实现,支持Windows、macOS和Linux系统: ```python # src/utils/volume_controller.py class VolumeController: """跨平台音量控制器""" def __init__(self): self.system = platform.system() # 根据不同操作系统初始化控制器 if self.system == "Windows": self._init_windows() elif self.system == "Darwin": # macOS self._init_macos() elif self.system == "Linux": self._init_linux() def get_volume(self): """获取当前音量 (0-100)""" # 根据不同平台实现获取音量 def set_volume(self, volume): """设置音量 (0-100)""" # 根据不同平台实现设置音量 ``` ### 2. BaseDisplay音量控制 BaseDisplay类提供音量控制接口,由CLI和GUI显示类继承: ```python # src/display/base_display.py class BaseDisplay(ABC): def __init__(self): self.current_volume = 70 # 默认音量值 self.volume_controller = None # 初始化音量控制器 try: from src.utils.volume_controller import VolumeController if VolumeController.check_dependencies(): self.volume_controller = VolumeController() self.current_volume = self.volume_controller.get_volume() except Exception as e: # 错误处理... def get_current_volume(self): """获取当前音量""" if self.volume_controller: try: self.current_volume = self.volume_controller.get_volume() except Exception: pass return self.current_volume def update_volume(self, volume: int): """更新系统音量""" volume = max(0, min(100, volume)) self.current_volume = volume if self.volume_controller: try: self.volume_controller.set_volume(volume) except Exception: # 错误处理... pass ``` ### 3. Speaker IoT设备 Speaker类是一个IoT设备,允许通过语音命令控制音量: ```python # src/iot/things/speaker.py from src.application import Application from src.iot.thing import Thing, Parameter, ValueType class Speaker(Thing): def __init__(self): super().__init__("Speaker", "当前 AI 机器人的扬声器") # 获取当前显示实例的音量作为初始值 try: app = Application.get_instance() self.volume = app.display.current_volume except Exception: # 如果获取失败,使用默认值 self.volume = 100 # 默认音量 # 定义音量属性 self.add_property("volume", "当前音量值", lambda: self.volume) # 定义设置音量方法 self.add_method( "SetVolume", "设置音量", [Parameter("volume", "0到100之间的整数", ValueType.NUMBER, True)], lambda params: self._set_volume(params["volume"].get_value()) ) def _set_volume(self, volume): """设置音量的具体实现""" if 0 <= volume <= 100: self.volume = volume try: app = Application.get_instance() app.display.update_volume(volume) return {"success": True, "message": f"音量已设置为: {volume}"} except Exception as e: return {"success": False, "message": f"设置音量失败: {e}"} else: raise ValueError("音量必须在0-100之间") ``` ### 4. 在Application中注册 音量控制设备在应用程序启动时被注册: ```python # src/application.py (部分代码) def _initialize_iot_devices(self): """初始化物联网设备""" from src.iot.thing_manager import ThingManager from src.iot.things.speaker import Speaker # 获取物联网设备管理器实例 thing_manager = ThingManager.get_instance() # 添加音量控制设备 thing_manager.add_thing(Speaker()) ``` ## 常见问题 1. **无法调节音量** - 检查是否安装了对应操作系统的音量控制依赖 - Windows用户确保安装了pycaw和comtypes - macOS用户确保安装了applescript模块 - Linux用户确保安装了对应的音频控制工具(pactl或amixer) 2. **调节音量命令无响应** - 确保IoT模块正常运行 - 检查系统音频设备是否正常工作 - 尝试重启应用 3. **音量调节不准确** - 可能是由于不同音频接口导致的精度问题 - 尝试使用较大幅度的调节命令 4. **GUI滑块与实际音量不同步** - 在某些情况下,系统音量可能被其他应用程序更改 - 重新启动应用程序将重新获取当前系统音量