| from __future__ import annotations | |
| import argbind | |
| import yaml | |
| from pathlib import Path | |
| from typing import Dict, Any | |
| def load_yaml_config(path: str | Path) -> Dict[str, Any]: | |
| """ | |
| Load a YAML configuration file into a dictionary suitable for argbind. | |
| """ | |
| path = Path(path) | |
| with path.open("r", encoding="utf-8") as f: | |
| data = yaml.safe_load(f) | |
| if not isinstance(data, dict): | |
| raise ValueError(f"Configuration file {path} must contain a top-level mapping.") | |
| return data | |
| def parse_args_with_config(config_path: str | Path | None = None): | |
| """ | |
| Helper to unify CLI arguments and YAML configuration. | |
| Usage mirrors minicpm-audio: | |
| args = parse_args_with_config("conf/voxcpm/finetune.yml") | |
| with argbind.scope(args): | |
| ... | |
| """ | |
| cli_args = argbind.parse_args() | |
| if config_path is None: | |
| return cli_args | |
| yaml_args = load_yaml_config(config_path) | |
| with argbind.scope(cli_args): | |
| yaml_args = argbind.parse_args(yaml_args=yaml_args, argv=[]) | |
| cli_args.update(yaml_args) | |
| return cli_args | |