- Зачем: - тестирование на реальных записях показало, что int8 даёт галлюцинации на длинных файлах, auto-detect языка ошибается — нужны оптимальные дефолты по устройству. - Что: - дефолты: medium float16 (GPU), medium float32 (CPU), language=ru. - добавлены DEVICE_DEFAULTS и apply_device_defaults() в config.py. - убран preprocessor_config.json из обязательных файлов модели (отсутствует у medium). - README обновлён: таблицы скоростей, качества, результаты тестирования compute_type. - Проверка: - uv run pytest — 98 passed, 1 skipped. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
237 lines
11 KiB
Markdown
237 lines
11 KiB
Markdown
# local-transcriber
|
||
|
||
Локальный CLI для транскрипции аудио и видео через [faster-whisper](https://github.com/SYSTRAN/faster-whisper).
|
||
Принимает файл, распознаёт речь на машине (без внешних API) и создаёт markdown с таймкодами.
|
||
Результат удобен для последующей обработки ИИ — суммаризация, action items и т.д.
|
||
Работает с GPU (NVIDIA CUDA, быстро) и CPU (медленнее).
|
||
|
||
```bash
|
||
transcribe meeting.mp4
|
||
# → meeting-transcript.md
|
||
```
|
||
|
||
## Требования
|
||
|
||
- Python ≥ 3.10
|
||
- [uv](https://docs.astral.sh/uv/) — менеджер пакетов
|
||
- ffmpeg в PATH
|
||
- (Опционально) NVIDIA GPU + установленный драйвер (проверка: `nvidia-smi`)
|
||
|
||
## Установка
|
||
|
||
```bash
|
||
git clone <repo>
|
||
cd local-transcriber
|
||
uv tool install .
|
||
```
|
||
|
||
После этого команда `transcribe` доступна глобально в PATH.
|
||
|
||
Обновление после `git pull`:
|
||
|
||
```bash
|
||
uv tool install --force .
|
||
```
|
||
|
||
Модели скачиваются автоматически при первом запуске (~1.5 GB для medium, ~3 GB для large-v3),
|
||
нужен доступ в интернет (Hugging Face Hub).
|
||
|
||
> **Если `transcribe: command not found`** — убедитесь, что директория
|
||
> инструментов uv добавлена в PATH. Выполните `uv tool dir --bin`
|
||
> чтобы узнать путь, и добавьте его в PATH вашего shell.
|
||
|
||
## Использование
|
||
|
||
```bash
|
||
# Простой запуск (medium, русский, автодетект устройства)
|
||
transcribe meeting.mp4
|
||
|
||
# Указать язык
|
||
transcribe lecture.mp3 --language en
|
||
|
||
# Максимальное качество на GPU
|
||
transcribe podcast.wav --model large-v3 --compute-type float16
|
||
|
||
# Сохранить в конкретный файл
|
||
transcribe interview.m4a --output result.md
|
||
```
|
||
|
||
### Батч-режим
|
||
|
||
Обработка нескольких файлов за один вызов — модель загружается один раз:
|
||
|
||
```bash
|
||
# Все mp4 в директории
|
||
transcribe ./recordings/*.mp4
|
||
|
||
# Несколько файлов
|
||
transcribe meeting1.mp3 meeting2.mp3
|
||
|
||
# Перезаписать существующие транскрипты
|
||
transcribe *.mp4 --force
|
||
```
|
||
|
||
- Файлы с существующим транскриптом (`*-transcript.md`) автоматически пропускаются
|
||
- `--force` / `-f` — перезаписать существующие транскрипты
|
||
- В конце выводится итоговая статистика: обработано, пропущено, ошибок
|
||
- При ошибке в одном файле остальные продолжают обрабатываться
|
||
- `--output` несовместим с несколькими файлами
|
||
|
||
### Конфигурационный файл
|
||
|
||
Дефолтные параметры можно задать в `.transcriber.toml`:
|
||
|
||
```toml
|
||
language = "ru"
|
||
model = "large-v3"
|
||
compute_type = "float16"
|
||
```
|
||
|
||
Порядок поиска:
|
||
1. `.transcriber.toml` в текущей директории (проектный конфиг)
|
||
2. `~/.config/transcriber/config.toml` (глобальный конфиг пользователя)
|
||
|
||
Приоритет: **CLI-аргумент > конфиг > device-aware дефолт > встроенный дефолт**.
|
||
|
||
Дефолты зависят от устройства (если не заданы явно):
|
||
|
||
| Параметр | GPU (CUDA) | CPU |
|
||
|----------|-----------|-----|
|
||
| model | medium | medium |
|
||
| compute_type | float16 | float32 |
|
||
| language | ru | ru |
|
||
|
||
### Опции CLI
|
||
|
||
| Опция | Сокращение | По умолчанию | Описание |
|
||
|-------|-----------|-------------|----------|
|
||
| `--model` | `-m` | `medium` | Модель Whisper |
|
||
| `--language` | `-l` | `ru` | Язык (ru, en, auto и др.) |
|
||
| `--output` | `-o` | `<файл>-transcript.md` | Путь к выходному файлу |
|
||
| `--device` | `-d` | `auto` | Устройство (auto, cpu, cuda) |
|
||
| `--compute-type` | — | float16 (GPU) / float32 (CPU) | Тип вычислений |
|
||
| `--force` | `-f` | — | Перезаписать существующие транскрипты |
|
||
| `--verbose` | `-v` | — | Подробный вывод |
|
||
|
||
## Модели
|
||
|
||
| Модель | Размер на диске | VRAM (int8) | Скорость (GPU) | Качество |
|
||
|--------|----------------|-------------|----------------|----------|
|
||
| `tiny` | ~75 MB | ~1 GB | ★★★★★ | ★ |
|
||
| `base` | ~140 MB | ~1 GB | ★★★★ | ★★ |
|
||
| `small` | ~460 MB | ~1.5 GB | ★★★ | ★★★ |
|
||
| `medium` | ~1.5 GB | ~2.5 GB | ★★ | ★★★★ |
|
||
| `large-v3` | ~3 GB | ~2.5 GB | ★ | ★★★★★ |
|
||
|
||
### Типы квантизации (`--compute-type`)
|
||
|
||
| Тип | Устройство | VRAM/RAM | Качество | Когда использовать |
|
||
|-----|-----------|----------|----------|--------------------|
|
||
| `float16` | GPU | ~4.5-5 GB | Отлично | **По умолчанию для GPU** |
|
||
| `int8_float16` | GPU | ~4.7 GB | Отлично | GPU от 6 GB, альтернатива float16 |
|
||
| `int8` | GPU/CPU | Низкое | Хорошо, но бывают галлюцинации | GPU от 4 GB, CPU |
|
||
| `float32` | CPU | Среднее | Отлично | **По умолчанию для CPU** |
|
||
|
||
**Важно:** `int8` на длинных записях может давать галлюцинации (повтор фраз, потеря контента).
|
||
`float16` и `float32` значительно стабильнее на записях >20 минут с техническими терминами.
|
||
|
||
## Установка ffmpeg
|
||
|
||
- **Linux / WSL2**: `sudo apt install ffmpeg`
|
||
- **macOS**: `brew install ffmpeg`
|
||
- **Windows**: `winget install ffmpeg`
|
||
|
||
## GPU и CUDA
|
||
|
||
Для работы с GPU необходим установленный NVIDIA драйвер
|
||
(проверка: `nvidia-smi` в терминале). Драйвер предоставляет `libcuda.so.1`,
|
||
без которого CUDA не работает — его нельзя поставить через pip.
|
||
|
||
### По платформам
|
||
|
||
- **Linux / WSL2 (x86_64)**: библиотека cuBLAS ставится автоматически
|
||
(зависимость `nvidia-cublas-cu12` подтягивается при установке).
|
||
Дополнительных шагов не требуется.
|
||
На ARM (aarch64) cuBLAS через pip недоступен — нужен системный CUDA toolkit.
|
||
- **Windows**: нужен системный CUDA toolkit
|
||
(`choco install cuda` или `winget install -e --id Nvidia.CUDA`)
|
||
|
||
### Режимы `--device`
|
||
|
||
- `auto` (по умолчанию) — выберет GPU если `nvidia-smi` доступен, иначе CPU
|
||
- `cuda` — строго GPU, ошибка если недоступен (без silent fallback)
|
||
- `cpu` — строго CPU
|
||
|
||
### Совместимость GPU
|
||
|
||
| GPU | VRAM | medium float16 | large-v3 float16 | Рекомендация |
|
||
|-----|------|---------------|-----------------|--------------|
|
||
| RTX 3060 | 6 GB | ✅ | ✅ | medium float16 (дефолт) |
|
||
| RTX 4050 | 6 GB | ✅ | ✅ | medium float16 |
|
||
| Quadro M3000M | 4 GB | ✅ | ⚠️ tight | medium float16 или int8 |
|
||
|
||
### Ожидаемая скорость
|
||
|
||
Замеры на RTX 3060 Laptop (6 GB) и Intel CPU (WSL2):
|
||
|
||
| Конфигурация | 16 мин файл | 42 мин файл | Отн. скорость |
|
||
|-------------|-------------|-------------|---------------|
|
||
| GPU + medium float16 | ~35с | ~133с | ~19x реалтайм |
|
||
| GPU + large-v3 float16 | ~90с | ~350с | ~7x реалтайм |
|
||
| CPU + medium float32 | 613с (10 мин) | ~26 мин* | ~1.5x реалтайм |
|
||
| CPU + large-v3 int8 | 839с (14 мин) | ~37 мин* | ~1:1 реалтайм |
|
||
|
||
*Оценка на основе пропорции.
|
||
|
||
### Результаты тестирования качества
|
||
|
||
Тесты проведены на реальных записях рабочих созвонов (русский язык, технические термины:
|
||
SQL, PostgreSQL, Greenplum, Airflow, ClickHouse, Docker, CDR, GTP, MAP).
|
||
|
||
| Конфигурация | Качество (длинная запись, 42 мин) | Проблемы |
|
||
|---|---|---|
|
||
| large-v3 int8 GPU | Плохо | Галлюцинации (фразы ×25), потеря контента |
|
||
| large-v3 float16 GPU | Отлично | — |
|
||
| medium float16 GPU | Хорошо | Редкие мелкие ляпы в терминах |
|
||
| medium float32 CPU | Хорошо | Сопоставимо с large-v3 int8, без галлюцинаций |
|
||
| large-v3 int8 CPU | Хорошо | Без галлюцинаций (на коротких файлах) |
|
||
|
||
**Ключевые выводы:**
|
||
|
||
1. **Указание языка (`--language ru`) критично** — auto-detect может ошибиться и выдать мусор
|
||
2. **float16/float32 стабильнее int8** — особенно на записях >20 минут
|
||
3. **medium + float16 на GPU — лучший баланс** скорости и качества для повседневного использования
|
||
4. **large-v3 + float16 на GPU** — для максимального качества важных записей
|
||
|
||
## Формат выходного файла
|
||
|
||
```markdown
|
||
# Транскрипт: meeting.mp4
|
||
|
||
- **Дата транскрипции**: 2026-03-17 14:30:05
|
||
- **Модель**: large-v3
|
||
- **Язык**: ru (detected)
|
||
- **Длительность**: 01:23:45
|
||
- **Устройство**: CUDA (NVIDIA GeForce RTX 3060)
|
||
|
||
---
|
||
|
||
[00:00:00.00 - 00:00:15.40] Добрый день, коллеги. Сегодня мы обсудим результаты
|
||
квартала. Первый вопрос — по метрикам продукта. Как вы видите на слайде, MAU вырос
|
||
на двадцать три процента по сравнению с предыдущим кварталом.
|
||
|
||
[00:00:18.10 - 00:00:25.73] Теперь перейдём к финансовым показателям.
|
||
|
||
...
|
||
```
|
||
|
||
Близкие по времени сегменты автоматически объединяются в абзацы (пауза > 2 сек или длительность > 60 сек разделяет абзацы).
|
||
Таймкоды: `MM:SS.ss`, для записей длиннее 1 часа — `HH:MM:SS.ss`.
|
||
|
||
## Поддерживаемые форматы
|
||
|
||
- **Аудио**: mp3, wav, flac, ogg, m4a, wma, aac
|
||
- **Видео**: mp4, mkv, avi, mov, webm, ts
|
||
|
||
Формат определяется по расширению, декодирование выполняет ffmpeg.
|