- Зачем: - покрытие документацией было неравномерным, отсутствовало архитектурное описание - Что: - добавлены модульные docstrings во все 5 модулей (utils, config, formatter, transcriber, cli) - добавлены docstrings для всех публичных функций без документации - добавлены inline-комментарии для неочевидной логики (CUDA fallback, strict device, glob, SOCKS proxy) - CONTRIBUTING.md: секции «Архитектура», «Ключевые решения», «Тестирование», «Частые задачи» - обновлено правило языка комментариев (русский вместо английского) - Проверка: - uv run pytest (97 passed, 1 skipped) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
4.2 KiB
4.2 KiB
Contributing
Быстрый старт для разработчика
git clone https://github.com/dementev-dev/local-transcriber
cd local-transcriber
uv sync
Запуск
uv run transcribe meeting.mp4 # CLI
uv run pytest # тесты
uv run pytest -v # подробный вывод тестов
Структура проекта
src/local_transcriber/
├── cli.py # Точка входа CLI (typer)
├── config.py # Загрузка .transcriber.toml, device-aware дефолты
├── formatter.py # Форматирование результата в markdown
├── transcriber.py # Обёртка над faster-whisper (загрузка модели, транскрипция)
└── utils.py # Утилиты: валидация файлов, детект устройства, глобы
tests/
├── test_cli.py # Тесты CLI (typer runner + моки)
└── ...
Соглашения
- Тесты:
uv run pytestдолжен проходить перед PR - Стиль: стандартный Python (ruff-совместимый)
- Коммиты: Conventional Commits
- Язык кода: английский (имена переменных/функций); docstrings, комментарии и UI-строки — русский
Архитектура
CLI (cli.py)
→ config.py: загрузка .transcriber.toml, каскад дефолтов
→ utils.py: валидация файлов, определение устройства
→ transcriber.py: загрузка модели (с CUDA fallback), транскрипция
→ formatter.py: сегменты → markdown с таймкодами
→ запись результата
Ключевые архитектурные решения
- CUDA fallback — двухуровневый: при загрузке модели и при транскрипции (mid-stream). GPU может быть видна через nvidia-smi, но не иметь достаточно VRAM.
- Device-aware дефолты —
compute_typeзависит от устройства (float16/float32).float16не работает на CPU,float32расточителен на GPU. - cuBLAS bootstrap (
_cuda_bootstrap.py) — preload через ctypes до импорта ctranslate2. pip-пакетnvidia-cublas-cu12ставит.soв нестандартное место, аLD_LIBRARY_PATHнельзя изменить в рантайме. - Батч-режим — 3 фазы (prescan → load model → transcribe). Модель загружается один раз (~2-5 сек), невалидные файлы отсеиваются до загрузки.
- Ручной glob в utils — typer на Windows не раскрывает
*.mp4, поэтому глобы обрабатываются явно.
Тестирование
- Все CLI-тесты через
typer.testing.CliRunner+ моки (faster-whisper не вызывается) - Моки:
load_config,validate_input_file,detect_device,ensure_model_available,load_model,_transcribe_file,write_transcript - Паттерн:
_single_patches()— хелпер для стандартного happy-path набора моков _make_result()/_make_tfr()— фабрики тестовых данных
Частые задачи
- Новая CLI-опция: добавить
typer.Optionвmain()→ добавить ключ вHARDCODED_DEFAULTSвconfig.py→ написать тест - Поддержка нового формата: добавить расширение в
SUPPORTED_EXTENSIONSвutils.py - Изменение формата вывода: редактировать
format_transcript()вformatter.py
Как сделать PR
- Форкните репозиторий
- Создайте ветку:
git checkout -b feat/my-feature - Убедитесь, что тесты проходят:
uv run pytest - Откройте Pull Request с описанием изменений