[依赖、模型和配置]:完成本地语音模型准备,包含.env配置、模型下载脚本和model-check

This commit is contained in:
mkbk
2026-06-17 19:34:29 +08:00
parent 40510325d9
commit e877cca00f
10 changed files with 323 additions and 7 deletions
+15
View File
@@ -12,6 +12,7 @@ from .conversation import ConversationContext
from .llm import MockLlmProvider, OpenAICompatibleLlmProvider
from .models import AudioFrame, ProviderError
from .pipeline import VoicePipeline
from .speech_models import check_speech_models, model_status_errors
from .stt import MetadataSttProvider
from .transport import MemoryAudioTransport
from .tts import SineTtsProvider
@@ -27,6 +28,8 @@ def main(argv: list[str] | None = None) -> int:
subparsers.add_parser("acceptance", help="Run deterministic end-to-end pipeline acceptance")
subparsers.add_parser("validate-assets", help="Validate project pet assets")
subparsers.add_parser("security-check", help="Scan tracked files for leaked API keys")
model_check = subparsers.add_parser("model-check", help="Validate local speech model files")
model_check.add_argument("--models-dir", default=None, help="Speech models directory. Defaults to .env or models")
smoke = subparsers.add_parser("llm-smoke", help="Call configured OpenAI/NewAPI endpoint")
smoke.add_argument("--message", default="用一句中文回复:小杰在线。")
smoke.add_argument("--no-stream", action="store_true")
@@ -46,6 +49,7 @@ def main(argv: list[str] | None = None) -> int:
"llm_stream": config.llm_stream,
"llm_api_key_present": bool(config.llm_api_key),
"asset_dir": str(config.asset_dir),
"speech_models_dir": str(config.speech_models_dir),
},
ensure_ascii=False,
sort_keys=True,
@@ -63,6 +67,16 @@ def main(argv: list[str] | None = None) -> int:
print(json.dumps({"secret_leaks": leaks, "valid": not leaks}, ensure_ascii=False, sort_keys=True))
return 1 if leaks else 0
if args.command == "model-check":
config = AppConfig.from_dotenv(args.env_file)
models_dir = Path(args.models_dir) if args.models_dir else config.speech_models_dir
status = check_speech_models(models_dir, require_sherpa=True)
errors = model_status_errors(status)
data = status.to_json()
data["errors"] = [str(error) for error in errors]
print(json.dumps(data, ensure_ascii=False, sort_keys=True))
return 1 if errors else 0
if args.command == "acceptance":
result = run_acceptance()
print(json.dumps(result, ensure_ascii=False, sort_keys=True))
@@ -84,6 +98,7 @@ def main(argv: list[str] | None = None) -> int:
audio_output_device=config.audio_output_device,
asset_dir=config.asset_dir,
log_dir=config.log_dir,
speech_models_dir=config.speech_models_dir,
context_max_messages=config.context_max_messages,
context_max_chars=config.context_max_chars,
)