- Зачем:
- подсказки в ошибке и предупреждении называли только OpenVINO и CUDA, которых нет на macOS и ARM, поэтому пользователю там предлагались заведомо нерабочие команды.
- Что:
- в оба сообщения добавлен вариант --device cpu, работающий на любой платформе.
- для large-v3-turbo подсказки по cpu и cuda подставляют medium, так как faster-whisper turbo не поддерживает.
- Проверка:
- uv run pytest -q: 243 passed, 1 skipped.
- Зачем:
- в одной строке шапки смешивались английские и русские значения, а при неизвестном языке в неё попадало служебное «unknown (не определён)».
- Что:
- формулировки источника языка вынесены константами в formatter и переведены на русский.
- оба бэкенда используют общий признак UNKNOWN_LANGUAGE вместо «auto» и «unknown».
- неизвестный язык печатается одной строкой, без служебного значения.
- Проверка:
- uv run pytest -q: 242 passed, 1 skipped.
- ruff check .: 48 замечаний, столько же, сколько до правки.
BREAKING CHANGE: в шапке транскрипта значения detected и forced заменены на «определён автоматически» и «задан явно»; при неизвестном языке строка выглядит как «- **Язык**: не определён».
- Зачем:
- после смены auto-профиля пользователю нужны явные предупреждения о языковых ограничениях и рабочие пути выбора Whisper-бэкенда.
- Что:
- в MODEL_CATALOG добавлены поддерживаемые языки ONNX-моделей и предупреждение о несовместимом языке.
- для Whisper-имён добавлены подсказки с совместимыми парами backend/model.
- вывод языка различает детекцию, язык моноязычной модели и отсутствие детекции.
- усилены тесты implicit compute type и turbo-каталога, удалены дубли auto-тестов.
- Проверка:
- uv run pytest -q: 241 passed, 1 skipped.
- uv lock --check, compileall и git diff --check.
BREAKING CHANGE: --device auto без NVIDIA теперь выбирает ONNX GigaAM RNN-T; прежний профиль возвращается явным --device или конфигурацией.
- Зачем:
- закрыты замечания независимого review по воспроизводимости и VAD-приёмке.
- Что:
- рабочая версия Python точно зафиксирована на 3.13.13.
- нулевые и обратные VAD-сегменты исключены из результата.
- в README записаны наблюдаемые скорости новых моделей с указанием CPU.
- Проверка:
- uv run pytest -q: 224 passed, 1 skipped.
- ограниченная проверка Ruff и uv lock --check завершены успешно.
- Зачем:
- добавлена локальная транскрипция смешанной речи и русского текста с пунктуацией.
- Что:
- onnx-asr обновлён до 0.12 и зарегистрированы три модели GigaAM.
- выбор compute_type учитывает опубликованные квантизации и явность настройки.
- обновлены тесты, README и требования PRD.
- Проверка:
- uv run pytest -q: 223 passed, 1 skipped.
- выполнены smoke- и полные прогоны четырёх GigaAM-моделей.
При adversarial review (gpt-5.5) обнаружено: пользователь с config
compute_type = "float32" и --device onnx падал на старте.
HARDCODED_DEFAULTS["compute_type"] = "float32", apply_device_defaults не
заменяет значение если оно есть в config — старая проверка
(compute_type in ("int8", "fp16", "float32")) пропускала "float32"
дальше как onnx_asr quantization, что заставляло искать несуществующий
файл с суффиксом _float32.
- _normalize_quantization() — explicit маппинг в onnx-asr quantization.
- float32/fp32 → None (unquantized loading в onnx-asr — это None, не строка).
- float16 → fp16 (CUDA-naming → onnx-asr-naming).
- int8/fp16 → pass-through.
- Неизвестные compute_type (например, int8_float32 от CTranslate2) → ValueError
вместо silent fallback на int8 — пользователь раньше получал не ту
модель без предупреждения.
4 новых теста: float32→None, fp32→None, float16→fp16, unknown→raises.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Зачем:
- при smoke-тесте выявлены расхождения между onnx-asr API и мок-тестами.
- Что:
- убран deprecated cpu_preprocessing из load_model.
- sample_rate передан как keyword-аргумент в recognize().
- исправлены имена полей SegmentResult: start_ts→start, end_ts→end.
- добавлен device "onnx" в DEVICE_DEFAULTS и _VALID_DEVICES.
- Проверка:
- uv run pytest -q (172 passed).
- uv run transcribe file.mp4 --device onnx --model gigaam-v3.
- Зачем:
- Основной метод бэкенда — транскрипция аудиофайла в сегменты с временными метками.
- Что:
- метод transcribe декодирует аудио через faster_whisper.decode_audio, затем вызывает model.recognize() с VAD-сегментацией.
- каждый VAD-сегмент преобразуется в проектную структуру Segment.
- поддержка колбэков on_segment, on_status.
- написаны 4 теста: сбор сегментов, вызов on_segment, передача языка, обработка пустого аудио.
- Проверка:
- uv run pytest tests/test_onnx_asr.py -v (14 passed)
- Зачем:
- onnx-asr модель должна создаваться с квантизацией и VAD для разбивки аудио на сегменты.
- Что:
- метод create_model вызывает onnx_asr.load_model с квантизацией и cpu_preprocessing=True.
- подгружается Silero VAD, прикрепляется к модели через with_vad.
- написаны 3 теста: проверка аргументов load_model, загрузка VAD, передача fp16.
- Проверка:
- uv run pytest tests/test_onnx_asr.py -v
- Зачем:
- Бэкенд должен резолвить алиасы моделей и сохранять compute_type для дальнейшего использования.
- Что:
- добавлен конструктор __init__ с полями actual_compute_type, _resolved_model_id, _vad.
- метод ensure_model_available валидирует алиас и возвращает идентификатор модели onnx-asr.
- написаны 3 теста на резолвинг и сохранение compute_type.
- Проверка:
- uv run pytest tests/test_onnx_asr.py -v
- Зачем:
- onnx-asr бэкенд должен распознавать короткие алиасы (gigaam-v3, parakeet-v3) и raw-имена (nemo-canary-1b-v2).
- Что:
- создан файл backends/onnx_asr.py с MODEL_ALIASES и классом OnnxAsrBackend.
- метод _resolve_model: преобразует алиасы, пропускает raw-имена, выдаёт ValueError для неизвестных.
- написаны 4 теста на разрешение алиасов.
- Проверка:
- uv run pytest tests/test_onnx_asr.py::TestModelAliases -v
- Зачем:
- CTranslate2 по умолчанию использует 4 потока; на многоядерных CPU (8+ ядер)
это неоптимально — --threads 8 даёт +13% ускорения.
- Не было данных по int8_float32/int8_float16 на NVIDIA GPU.
- Что:
- --threads / -t: новый CLI-флаг, пробрасывается через load_model →
backend.create_model(cpu_threads=...) → WhisperModel(cpu_threads=...).
- Валидация min=0 на входе (typer), Backend протокол синхронизирован.
- docs/gpu.md: результаты бенчмарка 6 комбинаций CUDA compute_type
(medium/large-v3 × float16/int8_float32/int8_float16) на двух файлах
(16 мин и 46 мин). Ключевой вывод: float16 — оптимальный дефолт;
large-v3 ненадёжен на длинных записях.
- README: --threads добавлен в таблицу опций.
- Фикс теста: test_resolve_repo_explicit_unsupported_pair_raises обновлён
под добавление medium fp16 модели.
- Проверка:
- uv run pytest: 157 passed.
- transcribe file.mp4 --device cpu --threads 8: 277с vs 320с (дефолт).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
OpenVINO/whisper-medium-fp16-ov доступна через --compute-type fp16.
На CPU fp16 эмулируется программно (медленно), но на Intel Arc GPU
даёт аппаратное ускорение через XMX. Не меняет дефолты.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Зачем:
- OpenVINO backend хардкодил "CPU", хотя Intel Arc GPU доступен и даёт ~2x ускорение.
- Что:
- новые device modes: --device openvino-gpu, openvino-cpu; openvino — авто-детект GPU/CPU.
- detect_device() проверяет Intel GPU через OpenVINO Core API (с fail-safe).
- OpenVINOBackend передаёт "GPU"/"CPU" в WhisperPipeline вместо хардкода "CPU".
- подсказка "Совет: --model large-v3" при наличии GPU и модели не large-v3.
- .gitattributes для нормализации line endings (eol=lf).
- 150 тестов, включая GPU detection, routing, fallback, CLI device info.
- README, docs/gpu.md, docs/PRD.md обновлены для Intel GPU.
- Проверка:
- uv run pytest (150 passed).
- uv run transcribe --device openvino-gpu file.mp4 на Intel Arc 140T GPU.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Зачем:
- индикатор "00:32 / 16:02" был неочевиден — два одинаковых формата.
- путь в "Транскрипт сохранён" отображался разным цветом из-за Rich bold-разметки.
- Что:
- формат прогресса: "Транскрибирую 16 мин аудио (OpenVINO)... прошло 00:32".
- путь выводится в кавычках без bold-разметки, единым цветом.
- Проверка:
- uv run pytest -q — 124 passed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Зачем:
- CLI показывал int8, хотя реально использовался fp16 для large-v3.
- при транскрипции OpenVINO не было индикации прогресса.
- Что:
- _resolve_repo возвращает (repo_id, actual_compute_type).
- бэкенды сохраняют actual_compute_type после ensure_model_available.
- CLI выводит фактический compute_type после load_model, а не дефолтный.
- generate() запускается в потоке, статус обновляется каждую секунду с elapsed time.
- Проверка:
- uv run pytest -q — 124 passed.
- uv run transcribe file.mp4 --device openvino --model large-v3 показывает fp16.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Зачем:
- OpenVINO GenAI может вернуть отрицательный end_ts, ломая формат транскрипта.
- зафиксировать бенчмарки на Intel и AMD CPU для документации.
- Что:
- backends/openvino.py: start/end клампятся через max(0, ...).
- docs/gpu.md: полная таблица скорости Intel i7 vs AMD Ryzen 7 8845H.
- сравнение качества medium int8 vs large-v3 fp16 vs CPU float32 на одном файле.
- вывод: large-v3 OpenVINO (416с) быстрее medium CPU (734с) при лучшем качестве.
- Проверка:
- uv run pytest -q — 124 passed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Зачем:
- ускорение транскрипции на x86 CPU (Intel/AMD) в 2-4 раза через OpenVINO GenAI.
- Что:
- создан backends/openvino.py: OpenVINOBackend с ensure_model_available, create_model, transcribe.
- модели скачиваются из HuggingFace (OpenVINO/whisper-*-ov), формат OpenVINO IR.
- аудио декодируется через faster_whisper.decode_audio (PyAV) → .tolist() → pipe.generate(return_timestamps=True).
- контракт compute_type: явный --compute-type уважается; из дефолтов large-v3 получает fp16 автоматически.
- openvino-genai добавлен в pyproject.toml с platform markers (x86_64/AMD64, не macOS).
- compute_type_explicit прокинут через get_backend → load_model → CLI.
- 16 тестов для OpenVINO бэкенда: resolve_repo, ensure, create, transcribe, validate.
- Проверка:
- uv run pytest -v — 119 passed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Зачем:
- подготовка к добавлению OpenVINO бэкенда для ускорения на x86 CPU без CUDA.
- архитектура должна позволять добавлять новые бэкенды (CoreML, AMD XDNA) без переписывания кода.
- Что:
- создан types.py с общими типами (Segment, TranscribeResult, TranscribeFileResult).
- создан backends/base.py с Backend Protocol (3 метода: ensure_model_available, create_model, transcribe).
- создан backends/faster_whisper.py — текущий код вынесен из transcriber.py в FasterWhisperBackend.
- transcriber.py переделан в оркестратор: load_model() владеет полным пайплайном (ensure + create), CLI больше не вызывает ensure_model_available() отдельно.
- TranscribeFileResult расширен полями backend и model_path для корректного cross-backend fallback в батч-режиме.
- device_used проставляется оркестратором, а не бэкендом.
- cli.py: вынесен _format_device_info(), подготовлен к openvino.
- тесты обновлены: mock-точки перенесены с WhisperModel на get_backend/бэкенд-объекты.
- Проверка:
- uv run pytest -v — 98 passed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>