| """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, |
| } |
|
|