"""Идемпотентная предзагрузка модели faster-whisper. Без предзагрузки первая транскрибация после старта воркера сама тянет веса модели из HuggingFace Hub в рантайме (минуты простоя пайплайна на первом сеансе) — раньше предзагрузки не было вовсе. Использует ТУ ЖЕ функцию, что и сам faster-whisper при ленивой загрузке модели (`faster_whisper.utils.download_model`, см. `backend/core/plugins/faster_whisper.py::_get_model` — `WhisperModel(..., download_root=...)` внутри вызывает её с `cache_dir=download_root`), поэтому создаёт кэш `huggingface_hub`, полностью совместимый с тем, что ожидает плагин в `WHISPER_CACHE_DIR` (`config/plugins.yaml`, `transcriber.options.download_root`) — повторный запуск (в т.ч. сам запуск воркера) ничего не перекачивает: `snapshot_download` идемпотентен по факту наличия файлов в кэше. Запускается init-контейнером `whisper-model-init` (сборка backend-образа, профили compose `transcribe`/`transcribe-gpu`, см. `deploy/docker-compose.yml`) — faster-whisper уже есть в зависимостях backend/worker (`pyproject.toml`). Путь кэша — КОНТРАКТ с `backend/services/ai_tiers.py` (см. докстринг модуля): детект доступности уровня AI (`services/ai_levels.py`) и сам плагин транскрибера (`transcriber.options.download_root` в `config/plugins.yaml`) ожидают модель именно по пути `{WHISPER_MODELS_ROOT}/{модель}` (например, `/models/whisper/small`) — НЕ по плоскому корню тома. `WHISPER_MODELS_ROOT` здесь должен буквально совпадать со значением одноимённой константы в `ai_tiers.py`. """ import os import sys WHISPER_MODEL = os.environ.get("WHISPER_MODEL", "small") WHISPER_MODELS_ROOT = os.environ.get("WHISPER_MODELS_ROOT", "/models/whisper") def main() -> None: from faster_whisper.utils import download_model cache_dir = f"{WHISPER_MODELS_ROOT}/{WHISPER_MODEL}" print( f"[download-whisper-model] модель '{WHISPER_MODEL}' -> {cache_dir}", flush=True, ) path = download_model(WHISPER_MODEL, cache_dir=cache_dir) print(f"[download-whisper-model] готово: {path}", flush=True) if __name__ == "__main__": try: main() except Exception as exc: # noqa: BLE001 print(f"[download-whisper-model] ошибка: {exc}", file=sys.stderr) sys.exit(1)