import os from pathlib import Path from voice_drone.tools.config_loader import load_config from voice_drone.logging_ import get_logger _cfg_log = get_logger("voice_drone.configuration") # voice_drone/core/configuration.py -> 工程根目录 voice_drone_assistant 为 parents[2] _PROJECT_ROOT = Path(__file__).resolve().parents[2] def _abs_config_path(relative: str) -> str: p = Path(relative) if p.is_absolute(): return str(p) return str(_PROJECT_ROOT / p) # 系统配置加载器 class SystemConfigLoader: def __init__(self, config_path="voice_drone/config/system.yaml"): self.config_path = _abs_config_path(config_path) self.config = load_config(self.config_path) # 获取音频配置 def get_audio_config(self): return self.config["audio"] # 获取语音活动检测配置 def get_vad_config(self): return self.config["vad"] # 获取socket配置 def get_socket_server_config(self): return self.config["socket_server"] # 获取日志配置 def get_logging_config(self): return self.config["logging"] # 获取STT配置 def get_stt_config(self): return self.config["stt"] # 获取TTS配置 def get_tts_config(self): """ 获取文本转语音(TTS)配置 结构示例: tts: model_dir: "src/models/Kokoro-82M-v1.1-zh-ONNX" model_name: "model_q4.onnx" # 可选: model.onnx, model_fp16.onnx, model_quantized.onnx 等 voice: "zf_001" # 语音风格文件名(不含扩展名) speed: 1.0 # 语速系数 sample_rate: 24000 # 输出采样率 """ return self.config.get("tts", {}) # 获取文本预处理配置 def get_text_preprocessor_config(self): return self.config.get("text_preprocessor", {}) # 获取识别器流程配置 def get_recognizer_config(self): return self.config.get("recognizer", {}) # 云端语音(WebSocket / pcm_asr_uplink 会话) def get_cloud_voice_config(self): return self.config.get("cloud_voice", {}) # 主程序 TakeoffPrintRecognizer(main_app) def get_assistant_config(self): return self.config.get("assistant", {}) # 命令配置加载器 class CommandConfigLoader: def __init__(self, config_path="voice_drone/config/command_.yaml"): self.config_path = _abs_config_path(config_path) self.config = load_config(self.config_path)["control_params"] def get_takeoff_config(self): return self.config["takeoff"] def get_land_config(self): return self.config["land"] def get_follow_config(self): return self.config["follow"] def get_forward_config(self): return self.config["forward"] def get_backward_config(self): return self.config["backward"] def get_left_config(self): return self.config["left"] def get_right_config(self): return self.config["right"] def get_up_config(self): return self.config["up"] def get_down_config(self): return self.config["down"] def get_hover_config(self): return self.config["hover"] def get_return_home_config(self): return self.config["return_home"] # 关键词配置加载器 class KeywordsConfigLoader: def __init__(self, config_path="voice_drone/config/keywords.yaml"): self.config_path = _abs_config_path(config_path) self.config = load_config(self.config_path)["keywords"] def get_keywords(self): return self.config # 唤醒词配置加载器 class WakeWordConfigLoader: def __init__(self, config_path="voice_drone/config/wake_word.yaml"): self.config_path = _abs_config_path(config_path) self.config = load_config(self.config_path)["wake_word"] def get_primary(self): return self.config.get("primary", "") def get_variants(self): return self.config.get("variants", []) def get_matching_config(self): return self.config.get("matching", {}) # 系统配置常量 system_config = SystemConfigLoader() SYSTEM_AUDIO_CONFIG = system_config.get_audio_config() SYSTEM_VAD_CONFIG = system_config.get_vad_config() SYSTEM_SOCKET_SERVER_CONFIG = system_config.get_socket_server_config() SYSTEM_LOGGING_CONFIG = system_config.get_logging_config() SYSTEM_STT_CONFIG = system_config.get_stt_config() SYSTEM_TTS_CONFIG = system_config.get_tts_config() SYSTEM_TEXT_PREPROCESSOR_CONFIG = system_config.get_text_preprocessor_config() SYSTEM_RECOGNIZER_CONFIG = system_config.get_recognizer_config() SYSTEM_CLOUD_VOICE_CONFIG = system_config.get_cloud_voice_config() SYSTEM_ASSISTANT_CONFIG = system_config.get_assistant_config() def load_cloud_voice_px4_context() -> dict: """ 加载合并到云端 session.start.client 的 PX4/MAV 扩展字段。 路径:环境变量 ROCKET_CLOUD_PX4_CONTEXT_FILE,否则 cloud_voice.px4_context_file(相对工程根)。 """ cv = SYSTEM_CLOUD_VOICE_CONFIG if isinstance(SYSTEM_CLOUD_VOICE_CONFIG, dict) else {} raw = (os.environ.get("ROCKET_CLOUD_PX4_CONTEXT_FILE") or "").strip() rel = raw or str(cv.get("px4_context_file") or "").strip() if not rel: return {} p = Path(rel) if not p.is_absolute(): p = _PROJECT_ROOT / rel if not p.is_file(): _cfg_log.warning("cloud_voice PX4 上下文文件不存在,已跳过: %s", p) return {} try: data = load_config(str(p)) except Exception as e: # noqa: BLE001 _cfg_log.warning("读取 PX4 上下文 YAML 失败: %s — %s", p, e) return {} if not isinstance(data, dict): return {} return data SYSTEM_CLOUD_VOICE_PX4_CONTEXT = load_cloud_voice_px4_context() # 命令配置常量 command_config = CommandConfigLoader() TAKEOFF_CONFIG = command_config.get_takeoff_config() LAND_CONFIG = command_config.get_land_config() FOLLOW_CONFIG = command_config.get_follow_config() FORWARD_CONFIG = command_config.get_forward_config() BACKWARD_CONFIG = command_config.get_backward_config() LEFT_CONFIG = command_config.get_left_config() RIGHT_CONFIG = command_config.get_right_config() UP_CONFIG = command_config.get_up_config() DOWN_CONFIG = command_config.get_down_config() HOVER_CONFIG = command_config.get_hover_config() RETURN_HOME_CONFIG = command_config.get_return_home_config() # 关键词配置常量 keywords_config = KeywordsConfigLoader() KEYWORDS_CONFIG = keywords_config.get_keywords() # 唤醒词配置常量 wake_word_config = WakeWordConfigLoader() WAKE_WORD_PRIMARY = wake_word_config.get_primary() WAKE_WORD_VARIANTS = wake_word_config.get_variants() WAKE_WORD_MATCHING_CONFIG = wake_word_config.get_matching_config() if __name__ == "__main__": print(TAKEOFF_CONFIG) print(LAND_CONFIG) print(FORWARD_CONFIG) print(BACKWARD_CONFIG) print(LEFT_CONFIG) print(RIGHT_CONFIG) print(UP_CONFIG) print(DOWN_CONFIG) print(HOVER_CONFIG) print(KEYWORDS_CONFIG)