Детальное сравнение medium/large-v3 × OpenVINO/CTranslate2/Whisper.ai
на записи совещания 14:41, русский язык, AMD Ryzen 7 8845H.
Рабочий документ для разработки AMD-ускорения.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Бенчмарк показал: OpenVINO fp16 даёт 3.7x ускорение, но теряет качество
на русской разговорной речи. CTranslate2 int8_float32 — оптимальный баланс.
Следующий шаг — DirectML бэкенд для AMD Radeon iGPU.
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>
- Зачем:
- 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>
- Зачем:
- зафиксировать реальные бенчмарки OpenVINO перед мержем в main.
- Что:
- скорость: OpenVINO medium int8 в 3-4x быстрее CPU float32 (205с vs 658с на 16 мин файле).
- качество: сопоставимо с CPU float32 и CUDA float16, галлюцинаций нет.
- таблица ожидаемой скорости обновлена с OpenVINO строкой.
- отмечено, что тестирование на AMD CPU пока не проводилось.
- Проверка:
- uv run transcribe file.mp4 --device openvino.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Зачем:
- README перегружен деталями GPU/бенчмарков, нет Quick Start, macOS/Windows — второй класс.
- системный ffmpeg не нужен — PyAV (зависимость faster-whisper) включает FFmpeg в wheels.
- Что:
- переписан README: Quick Start в первых строках, установка без клонирования через uv tool install, паритет платформ, progressive disclosure через <details>.
- удалена функция check_ffmpeg() из utils.py, убраны импорт и вызовы из cli.py.
- убраны моки check_ffmpeg и тест ffmpeg-ошибки из test_cli.py.
- GPU-контент вынесен в docs/gpu.md, добавлен CONTRIBUTING.md.
- Проверка:
- uv run pytest — 97 passed, 1 skipped.
Co-Authored-By: Claude Opus 4.6 <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>
- Зачем:
- чтобы коллега мог установить и запустить проект на Windows/WSL2/Linux без вопросов (шаг 7 plan.md).
- Что:
- создан README.md: требования, установка через uv tool, примеры CLI, таблицы моделей и квантизаций.
- описаны настройка GPU/CUDA по платформам, совместимость GPU, ожидаемая скорость.
- добавлен пример выходного файла, соответствующий реальному формату formatter (HH:MM:SS.ss, группировка абзацев).
- отмечен шаг 7 как выполненный в plan.md.
- Проверка:
- uv tool install . && transcribe --help — CLI доступен глобально.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Зачем:
- пользователь видел raw traceback при ошибках, не было корректной обработки Ctrl+C
- Что:
- graceful Ctrl+C: перехват KeyboardInterrupt → «Прервано пользователем» + exit 130
- пользовательские ошибки (файл не найден, пустой) — чистое сообщение без traceback
- неожиданные ошибки — traceback только с --verbose, иначе подсказка
- Windows CUDA диагностика интегрирована в общий обработчик ошибок
- логика вынесена в _run(), обработка ошибок — в main()
- Проверка:
- uv run pytest -v — 60 passed, 1 skipped
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Зачем:
- зафиксировать архитектурное решение по GPU runtime и rejected alternatives,
чтобы не переизобретать отклонённые подходы в будущем.
- Что:
- создан docs/adr/001-cuda-bootstrap.md (контекст, решение, tradeoffs, альтернативы).
- PRD 4.2: исправлено описание CUDA-зависимостей (cuDNN не нужен, cuBLAS из pip).
- plan.md: добавлен выполненный шаг 5.1 со ссылкой на ADR.
- удалены docs/plan-gpu-runtime.md и отчёты ревью (review-stages-*).
- Проверка:
- cat docs/adr/001-cuda-bootstrap.md.
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 показывает все опции.
- Зачем:
- фиксация результатов code review для трассируемости.
- Что:
- добавлен docs/review-stages-1-3.md с findings и статусом исправлений.
- Проверка:
- cat docs/review-stages-1-3.md.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Зачем:
- необходим модуль транскрипции с 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>
- Зачем:
- необходимы утилиты для проверки ffmpeg, определения устройства и
валидации входного файла перед запуском транскрипции.
- Что:
- check_ffmpeg() завершает процесс с понятным сообщением, если ffmpeg не в PATH.
- detect_device() возвращает "cuda" при наличии nvidia-smi, иначе "cpu".
- get_gpu_name() получает имя GPU через nvidia-smi или возвращает None.
- validate_input_file() проверяет существование, тип и размер файла;
неизвестное расширение — warning, не ошибка.
- build_output_path() формирует путь <stem>-transcript.md рядом с исходником.
- Проверка:
- uv run pytest tests/test_utils.py -v — 9 passed.
- uv run python -c "from local_transcriber.utils import check_ffmpeg, detect_device; check_ffmpeg(); print(detect_device())"
- Зачем:
- устранены пробелы в плане: недостающие тесты, неописанные параметры, архитектурные расхождения.
- Что:
- detect_device() возвращает только str (device), compute-type независим от него.
- добавлен get_gpu_name() для человекочитаемой строки устройства в шапке markdown.
- добавлен on_segment callback в transcribe() для --verbose без переделки API.
- добавлено поле device_used в TranscribeResult (фактическое устройство после fallback).
- добавлены тесты: test_utils.py (9 тестов), test_transcriber.py (4 mock-теста).
- выровнено поведение пустой речи: файл с шапкой + *Речь не обнаружена.* в теле (PRD и plan).
- добавлены импорты Callable, datetime, Path в заглушки шага 1.
- убраны строки с git add -A / git commit из всех шагов.
- Проверка:
- открыть docs/plan.md и docs/PRD.md и убедиться в согласованности.
- Зачем:
- зафиксированы требования к проекту и план разработки для выравнивания команды.
- Что:
- добавлен docs/PRD.md с требованиями к продукту.
- добавлен docs/plan.md с планом реализации.
- Проверка:
- открыть docs/PRD.md и docs/plan.md и убедиться в корректности содержимого.