- неявный compute_type при fallback переразрешается по умолчанию CPU (float16 CUDA не переносится на CTranslate2 CPU); - prepare() помечает module готовым только после проверки пословного контракта; - движок сообщает сам adapter (атрибут engine) вместо параллельной таблицы; - сбой runtime_info() не роняет запуск; - каскад конфига оставляет model/compute_type пустыми для module, CLI не дублирует CLI > TOML; - удалены недостижимые из CLI сообщения о mid-stream fallback; - в --verbose потоки помечены как запрошенные, adapters сообщают применённые; OpenVINO прямо говорит, что --threads не применяется; - тесты: умолчания по устройствам, TOML compute_type, не-strict сценарий обычной ошибки; CONTRIBUTING.md и AGENTS.md без устаревших имён. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
4.7 KiB
4.7 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: Transcriber — разрешение устройства, загрузка модели один раз на запуск, транскрипция, fallback
→ formatter.py: сегменты → markdown с таймкодами
→ запись результата
Ключевые архитектурные решения
- Module выполнения (
Transcriberвtranscriber.py) — один владелец модели, adapter'а и фактического исполнения на запуск. Fallback GPU→CPU (при загрузке и mid-stream) живёт внутри и доступен только приstrict_device=Falseиз Python API: явный device в CLI strict,auto— ONNX CPU. - Device-aware дефолты —
modelи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 → создание
Transcriber→ transcribe). Модель загружается один раз (~2-5 сек), невалидные файлы отсеиваются до загрузки; CLI не переносит состояние между файлами. - Ручной glob в utils — typer на Windows не раскрывает
*.mp4, поэтому глобы обрабатываются явно.
Тестирование
- Все CLI-тесты через
typer.testing.CliRunnerс настоящимTranscriberи fake adapter, подменённым вlocal_transcriber.transcriber.get_backend(библиотеки не вызываются) - Моки:
load_config,validate_input_file,write_transcript - Паттерн:
_cli_run()— контекстный менеджер стандартного набора, отдаёт(backend, write_transcript) _make_result()/_make_backend()— фабрики тестовых данных
Частые задачи
- Новая 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 с описанием изменений