Зачем:
- локальным транскриптам нужна структура реплик для конспектов и протоколов.
Что:
- добавлены пословные таймкоды для всех ASR-бэкендов и сведение с Sherpa-ONNX.
- реализованы CLI-флаги, деградация без потери ASR и speaker Markdown.
- добавлены проверяемый кеш моделей, тесты и документация.
Проверка:
- `pytest` — 283 passed, 1 skipped.
- `pyright` — 0 errors.
- Ruff и `git diff --check` — без ошибок.
- выполнены три контрольных прогона на реальных записях.
- Зачем:
- 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 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>
- Зачем:
- 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 не справляется (ошибка init или mid-stream), нужен автоматический переход на CPU через faster-whisper.
- Что:
- _is_openvino_error() распознаёт ошибки OpenVINO runtime по паттернам в сообщении.
- _is_backend_error() теперь маршрутизирует на правильную проверку по device.
- при fallback: скачивается модель для CPU бэкенда, создаётся новая модель, обновляются backend/model_path.
- 3 интеграционных теста: openvino→cpu init fallback, midstream fallback, strict_device без fallback.
- Проверка:
- uv run pytest -v — 122 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>
- Зачем:
- обработка нескольких файлов за один вызов с загрузкой модели один раз.
- хранение дефолтов (модель, язык, устройство) в .transcriber.toml.
- Что:
- добавлен config.py: поиск .transcriber.toml (CWD → ~/.config), парсинг, валидация, приоритет CLI > конфиг > хардкод.
- рефакторинг transcriber.py: выделены load_model() и _transcribe_file() с TranscribeFileResult для переиспользования модели в батче.
- добавлены expand_globs() с дедупликацией и has_existing_transcript() в utils.py.
- CLI: files: list[Path], --force/-f, prescan-first батч с итоговой статистикой и временем, Status-спиннер для прогресса.
- README: секции батч-режим, конфигурационный файл, --force в таблице опций.
- ADR-002: зафиксированы архитектурные решения (prescan-first, TranscribeFileResult, конфиг без мержа).
- Проверка:
- uv run pytest -q — 94 passed, 1 skipped.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Зачем:
- при длительной транскрипции пользователь видел только спиннер без информации
о ходе обработки; формулировка "Загружаю модель" путала с загрузкой из сети.
- Что:
- спиннер показывает позицию и длительность: "Транскрибирую... 05:32 / 15:52 [87 сегм.]".
- статус инициализации изменён на "Инициализирую модель на cuda/cpu...".
- VAD-фильтр протестирован и отклонён: ухудшает сегментацию для совещаний
(315-321 сегмент вместо 235 без VAD).
- Проверка:
- uv run pytest -v (52 passed, 1 skipped).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Зачем:
- ctranslate2 требует libcublas.so.12 для CUDA, но не бандлит её в wheel —
без системного CUDA toolkit GPU не работает из коробки.
- Что:
- добавлена зависимость nvidia-cublas-cu12 (Linux x86_64).
- создан _cuda_bootstrap.py: preload libcublas через ctypes.CDLL(RTLD_GLOBAL)
до импорта ctranslate2 (LD_LIBRARY_PATH не работает — glibc кеширует пути).
- добавлен strict_device в transcriber: --device cuda/cpu не делает silent fallback.
- CLI: диагностика requested vs resolved device, Windows CUDA-подсказка.
- Проверка:
- uv run pytest -v (52 passed, 1 skipped).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Зачем:
- шаг 5 плана: нужен рабочий CLI-happy path, связывающий utils / transcriber / formatter.
- ревью этапов 4–5 выявило два medium-бага в formatter и отсутствие тестов для CLI.
- Что:
- cli.py: все опции по PRD 3.2 (--model, --language, --output, --device, --compute-type, --verbose),
rich Status + stderr-консоль, предупреждение на пустую речь, статистика времени.
- transcriber.py: добавлена ensure_model_available() с проверкой кэша HF и валидацией
локальной директории; on_status callback для передачи прогресса в CLI; обработка
ImportError при отсутствии socksio через SOCKS proxy.
- formatter.py: исправлен overflow в format_timestamp (0.995 → 00:01.00 вместо 00:00.100);
сегменты теперь пишутся с явным пробелом и strip() независимо от whisper-формата текста.
- deps: добавлен socksio>=1.0.0 для поддержки SOCKS proxy при загрузке модели.
- tests: test_cli.py (8 тестов на CLI-контракт), расширены test_formatter.py и test_transcriber.py.
- Проверка:
- uv run pytest — 42 passed.
- uv run transcribe --help показывает все опции.
- Зачем:
- необходим модуль транскрипции с CUDA fallback для основного flow приложения.
- Что:
- добавлена зависимость faster-whisper>=1.2.1 в pyproject.toml.
- реализована функция transcribe() с fallback CUDA→CPU на всех этапах (загрузка модели, вызов transcribe, итерация сегментов).
- исправлен IndexError в get_gpu_name() при пустом stdout nvidia-smi.
- добавлено 6 тестов в test_transcriber.py и 1 тест в test_utils.py (16 тестов зелёные).
- Проверка:
- uv run pytest -v (16 passed).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>