feat(auto): выбран ONNX по умолчанию без CUDA
- Зачем: - пользователям без NVIDIA нужен самый быстрый и читаемый CPU-профиль без дополнительных параметров. - Что: - auto-политика изменена на CUDA при наличии nvidia-smi, иначе ONNX GigaAM RNN-T int8. - сохранён приоритет явных значений CLI и конфигурации для OpenVINO и FasterWhisper CPU. - обновлены тесты, README, PRD, ADR, GPU-документация и вывод benchmark. - Проверка: - uv run pytest -q: 232 passed, 1 skipped. - uv lock --check и git diff --cached --check.
This commit is contained in:
+33
-31
@@ -24,8 +24,9 @@ transcribe meeting-2026-03-17.mp4
|
||||
### 3.1. Основной flow
|
||||
|
||||
1. Пользователь вызывает CLI, передаёт путь к файлу (или glob-маску, post-MVP)
|
||||
2. Проверка: ffmpeg доступен в PATH
|
||||
3. Файл передаётся в faster-whisper (он сам обрабатывает и аудио, и видео через libav/ffmpeg — отдельное извлечение аудиодорожки не нужно)
|
||||
2. Файл валидируется по пути, размеру и расширению
|
||||
3. По `device` выбирается backend; аудио декодируется через PyAV без отдельного
|
||||
извлечения дорожки
|
||||
4. Результат форматируется в markdown с таймкодами
|
||||
5. Файл `<имя>-transcript.md` сохраняется рядом с исходным (кодировка: UTF-8)
|
||||
|
||||
@@ -41,16 +42,16 @@ transcribe meeting-2026-03-17.mp4
|
||||
transcribe <путь_к_файлу> [опции]
|
||||
|
||||
Опции:
|
||||
--model, -m Модель Whisper (tiny|base|small|medium|large-v3)
|
||||
По умолчанию: large-v3
|
||||
--model, -m Модель распознавания
|
||||
По умолчанию: medium (CUDA) / gigaam-v3-e2e-rnnt (ONNX)
|
||||
--language, -l Язык (ru|en|auto)
|
||||
По умолчанию: auto (автодетект)
|
||||
По умолчанию: ru
|
||||
--output, -o Путь к выходному файлу
|
||||
По умолчанию: <input_stem>-transcript.md
|
||||
--device, -d Устройство (auto|cpu|cuda|openvino|openvino-gpu|openvino-cpu)
|
||||
По умолчанию: auto (CUDA → OpenVINO GPU → OpenVINO CPU → CPU)
|
||||
--compute-type Тип вычислений (float16|int8|int8_float16|float32)
|
||||
По умолчанию: int8 (универсален для GPU 4-8 GB и CPU)
|
||||
--device, -d Устройство (auto|cpu|cuda|onnx|openvino|openvino-gpu|openvino-cpu)
|
||||
По умолчанию: auto (CUDA при наличии, иначе ONNX CPU)
|
||||
--compute-type Тип вычислений
|
||||
По умолчанию: float16 (CUDA) / int8 (ONNX)
|
||||
--verbose, -v Подробный вывод (прогресс сегментов)
|
||||
```
|
||||
|
||||
@@ -82,16 +83,17 @@ transcribe <путь_к_файлу> [опции]
|
||||
**Правила форматирования**:
|
||||
- Таймкоды в формате `[MM:SS.ss - MM:SS.ss]` (минуты:секунды.сотые)
|
||||
- Для записей длиннее 1 часа — `[HH:MM:SS.ss - HH:MM:SS.ss]`
|
||||
- Каждый сегмент — отдельный абзац
|
||||
- Соседние сегменты объединяются в абзац до паузы 2 секунды или длительности 60 секунд
|
||||
- Метаданные в шапке файла
|
||||
- Пустая строка между сегментами для читаемости
|
||||
- Пустая строка между абзацами для читаемости
|
||||
|
||||
### 3.4. Поддерживаемые форматы
|
||||
|
||||
**Аудио**: mp3, wav, flac, ogg, m4a, wma, aac
|
||||
**Видео**: mp4, mkv, avi, mov, webm, ts
|
||||
|
||||
Определение типа — по расширению. Фактическое декодирование выполняет ffmpeg внутри faster-whisper; если формат не поддерживается, ошибка будет от ffmpeg.
|
||||
Определение типа — по расширению. Фактическое декодирование выполняет PyAV с
|
||||
встроенными библиотеками FFmpeg; системная установка `ffmpeg` не требуется.
|
||||
|
||||
## 4. Нефункциональные требования
|
||||
|
||||
@@ -102,6 +104,8 @@ transcribe <путь_к_файлу> [опции]
|
||||
| RTX 3060 + large-v3 | ~10-15x (1 час аудио ≈ 4-6 мин) |
|
||||
| RTX 4050 + large-v3 | ~12-18x (1 час аудио ≈ 3-5 мин) |
|
||||
| Quadro M3000M + large-v3 | ~3-5x (1 час аудио ≈ 12-20 мин) |
|
||||
| CPU + ONNX GigaAM RNN-T | ~10-14x (1 час аудио ≈ 4-6 мин) |
|
||||
| CPU + OpenVINO Turbo INT8 | ~7-10x (1 час аудио ≈ 6-9 мин) |
|
||||
| CPU (modern) + large-v3 | ~0.5-1x (1 час аудио ≈ 60-120 мин) |
|
||||
| CPU + small | ~3-5x (1 час аудио ≈ 12-20 мин) |
|
||||
|
||||
@@ -112,23 +116,22 @@ transcribe <путь_к_файлу> [опции]
|
||||
| RTX 3060 | 6 GB | ✅ | ✅ (впритык) | int8 — безопасный выбор |
|
||||
| RTX 4050 | 6 GB | ✅ | ✅ (впритык) | int8 — безопасный выбор |
|
||||
| Quadro M3000M | 4 GB | ✅ | ⚠️ может OOM | int8 обязательно |
|
||||
| Без GPU | — | CPU int8 | — | int8 на CPU |
|
||||
| Без GPU | — | ONNX GigaAM INT8 | — | auto выбирает ONNX |
|
||||
|
||||
Дефолт `int8` выбран как универсальный: работает на всех GPU от 4 GB и на CPU, при минимальной потере качества относительно float16.
|
||||
Device-aware дефолты выбирают `float16` для CUDA и `int8` для ONNX/OpenVINO.
|
||||
|
||||
### 4.2. Требования к окружению
|
||||
|
||||
- Python ≥ 3.13
|
||||
- ffmpeg в PATH (используется faster-whisper внутри для декодирования любых медиаформатов)
|
||||
- Для GPU: Linux/WSL2 — cuBLAS из nvidia-cublas-cu12 (ставится автоматически через `uv sync`); Windows — системный CUDA toolkit (см. ADR-001)
|
||||
- Дисковое пространство для моделей: ~3 GB (large-v3)
|
||||
- Дисковое пространство для моделей: зависит от выбранного backend и модели
|
||||
- Выходные файлы: UTF-8 (явная кодировка при записи)
|
||||
|
||||
### 4.3. Кроссплатформенность
|
||||
|
||||
- Linux: нативный запуск
|
||||
- Windows: нативный Python или WSL2
|
||||
- macOS: не приоритет, но faster-whisper поддерживает CPU-режим
|
||||
- macOS: ONNX CPU в auto-режиме; FasterWhisper CPU доступен явно
|
||||
|
||||
## 5. Технический стек
|
||||
|
||||
@@ -136,19 +139,18 @@ transcribe <путь_к_файлу> [опции]
|
||||
|---------------------|-------------------------------------------------|
|
||||
| Язык | Python 3.13+ |
|
||||
| Управление проектом | uv (pyproject.toml) |
|
||||
| Распознавание речи | faster-whisper (CTranslate2 backend) |
|
||||
| Медиа-декодирование | ffmpeg (системная зависимость, используется faster-whisper внутри) |
|
||||
| Распознавание речи | faster-whisper, ONNX Runtime, OpenVINO GenAI |
|
||||
| Медиа-декодирование | PyAV со встроенными библиотеками FFmpeg |
|
||||
| CLI-фреймворк | typer |
|
||||
| Прогресс | rich (progress bar + статус) |
|
||||
|
||||
### 5.1. Почему faster-whisper
|
||||
### 5.1. Почему несколько backend
|
||||
|
||||
- В 4× быстрее оригинального OpenAI Whisper при том же качестве
|
||||
- Меньше потребление VRAM (large-v3 влезает в 6 GB с float16/int8)
|
||||
- Нативный Python API, без Docker
|
||||
- Поддержка CPU fallback из коробки
|
||||
- Активное сообщество, регулярные обновления
|
||||
- Автоматическая загрузка моделей из Hugging Face Hub
|
||||
- faster-whisper оптимизирован для NVIDIA CUDA и поддерживает много языков
|
||||
- ONNX GigaAM RNN-T даёт быстрый читаемый результат на CPU
|
||||
- OpenVINO предоставляет явные профили для Intel GPU и x86 CPU
|
||||
- Все backend работают локально через Python API, без Docker и облачных ключей
|
||||
- Модели загружаются автоматически и кешируются локально
|
||||
|
||||
### 5.2. Структура проекта
|
||||
|
||||
@@ -160,9 +162,10 @@ local-transcriber/
|
||||
│ └── local_transcriber/
|
||||
│ ├── __init__.py
|
||||
│ ├── cli.py # CLI entry point (typer)
|
||||
│ ├── transcriber.py # Обёртка над faster-whisper
|
||||
│ ├── transcriber.py # Оркестрация backend и fallback
|
||||
│ ├── backends/ # Адаптеры FasterWhisper, ONNX и OpenVINO
|
||||
│ ├── formatter.py # Форматирование в markdown
|
||||
│ └── utils.py # Проверки (ffmpeg), определение device и т.д.
|
||||
│ └── utils.py # Проверки файлов и определение device
|
||||
└── tests/
|
||||
└── ...
|
||||
```
|
||||
@@ -173,11 +176,10 @@ local-transcriber/
|
||||
|------|---------|-----------|
|
||||
| Качество распознавания русского текста | Среднее | large-v3 хорошо справляется с ru; при проблемах — попробовать `--language ru` вместо auto |
|
||||
| Нет разделения по спикерам | Низкое | Осознанно выведено за скоуп MVP; добавление diarization (pyannote.audio) — возможное расширение |
|
||||
| ffmpeg отсутствует в системе | Высокое | Проверка при старте + понятное сообщение об ошибке с инструкцией по установке |
|
||||
| Первый запуск: долгая загрузка модели | Низкое | Прогресс-бар при скачивании; модели кешируются в `~/.cache/huggingface/` |
|
||||
| CUDA несовместимость на Windows | Среднее | Автоматический fallback на CPU + предупреждение; в README — инструкция по CUDA |
|
||||
| Большие файлы (>2 часов) | Низкое | faster-whisper работает потоково, не грузит всё в память |
|
||||
| OOM на GPU с 4 GB VRAM | Среднее | Дефолт int8 (~2.5 GB); при OOM — fallback на CPU с предупреждением |
|
||||
| Большие файлы (>2 часов) | Среднее | Учитывать память выбранного backend; чанкование рассматривается отдельно |
|
||||
| OOM на GPU с 4 GB VRAM | Среднее | CUDA использует float16; при OOM — fallback на CPU с предупреждением или явный более лёгкий профиль |
|
||||
| Файл без речи (тишина, музыка, шум) | Низкое | Создаётся транскрипт с шапкой метаданных и `*Речь не обнаружена.*` в теле + предупреждение в stderr |
|
||||
|
||||
## 7. Вне скоупа MVP
|
||||
|
||||
Reference in New Issue
Block a user