"""Serialization helpers for the stable runtime model contract.""" from __future__ import annotations from typing import Any from .features import LogMelConfig def build_runtime_metadata( feature_config: LogMelConfig, *, max_seconds: float, threshold: float, model_name: str, architecture: str, model_version: str = "1", development_only: bool = True, training_status: str = "development", data_scope: str | None = None, data_revision: str | None = None, parameter_count: int | None = None, ) -> dict[str, Any]: """Build JSON accepted by :class:`runtime.predictor.ModelMetadata`. The dependency-light runtime currently implements the HTK filterbank. A Slaney-mel Whisper teacher therefore must be distilled before deployment. """ if feature_config.mel_scale != "htk": raise ValueError("the runtime frontend currently supports HTK mel filters only") if feature_config.normalize: raise ValueError("per-utterance standardization is not represented by runtime metadata") if feature_config.log_scale not in {"whisper", "standard"}: raise ValueError(f"unsupported runtime log scale: {feature_config.log_scale}") if not 0.0 <= threshold <= 1.0: raise ValueError("threshold must be in [0, 1]") return { "model_name": model_name, "architecture": architecture, "frontend": { "sample_rate": feature_config.sample_rate, "max_seconds": max_seconds, "n_fft": feature_config.n_fft, "win_length": feature_config.win_length, "hop_length": feature_config.hop_length, "n_mels": feature_config.n_mels, "f_min": feature_config.f_min, "f_max": feature_config.f_max, "normalization": ("whisper" if feature_config.log_scale == "whisper" else "log10"), "pad_side": feature_config.pad_side, }, "threshold": threshold, "controller": { "endpoint_threshold": threshold, "long_pause_threshold": max(0.0, threshold - 0.18), "min_silence_ms": 200.0, "relax_after_ms": 800.0, "max_silence_ms": 1800.0, "required_confirmations": 1, }, "input_features_name": "log_mel", "frame_mask_name": "frame_mask", "endpoint_output_name": "endpoint_probability", "output_type": "probability", "model_version": model_version, "development_only": development_only, "training_status": training_status, "data_scope": data_scope, "data_revision": data_revision, "parameter_count": parameter_count, }