Локальное Windows-приложение для расшифровки аудио и видео на базе faster-whisper с очередью задач, менеджером моделей, встроенным редактором читабельного текста и desktop-режимом через pywebview.
- один движок распознавания:
faster-whisper - локальный менеджер моделей
tiny,base,small,medium,large-v3,turbo - очередь с одной активной задачей и ожидающими задачами
- статусы задач:
queued | processing | done | cancelled | failed - desktop-режим в одном native WebView-окне
- один пользовательский результат на задачу:
readable - встроенный редактор читабельного текста с автосохранением
- встроенный аудиоплеер с waveform, навигацией по таймкоду и синхронной подсветкой предложений
- экспорт в
.mdи.pdf - глобальные desktop-настройки очистки runtime-данных между сессиями
- переключение языка интерфейса
RU/ENи светлой/темной темы на dashboard
В проекте больше нет TTL/expired-статуса: задача и результат живут, пока пользователь сам их не удалит или пока не сработает явная cleanup-настройка desktop-режима.
- Windows
- Python
3.11 - Microsoft Edge WebView2 Runtime
- для комфортной работы
faster-whisperжелательно иметь NVIDIA GPU
Подготовить локальные зависимости и ассеты:
powershell -ExecutionPolicy Bypass -File .\scripts\setup_assets.ps1Минимальный путь для свежего clone:
- склонировать репозиторий
- запустить
scripts\setup_assets.ps1 - запустить
scripts\run_desktop.ps1
После этого можно запустить либо web/API-режим:
.\.venv311\Scripts\python.exe -m uvicorn app.main:app --host 127.0.0.1 --port 8000либо desktop-режим:
powershell -ExecutionPolicy Bypass -File .\scripts\run_desktop.ps1Скрипт scripts/setup_assets.ps1 подготавливает локальную runtime-среду:
- создает
.venv311 - ставит зависимости из
requirements.txt - ставит CUDA wheels для
ctranslate2 - скачивает
bin\ffmpeg.exe - скачивает
models\faster-whisper-medium - скачивает
models\rupunct-big - прогревает
faster-whisper medium, если не указан-SkipWarmup
Полезные флаги:
# форсировать повторную загрузку ffmpeg
powershell -ExecutionPolicy Bypass -File .\scripts\setup_assets.ps1 -ForceDownload
# пропустить warmup faster-whisper
powershell -ExecutionPolicy Bypass -File .\scripts\setup_assets.ps1 -SkipWarmup.\.venv311\Scripts\python.exe -m uvicorn app.main:app --host 127.0.0.1 --port 8000Доступные адреса:
http://127.0.0.1:8000http://127.0.0.1:8000/health
Рекомендуемый запуск:
powershell -ExecutionPolicy Bypass -File .\scripts\run_desktop.ps1Прямой запуск:
.\.venv311\Scripts\python.exe -m app.desktop_entryDesktop-режим:
- открывает приложение в одном native окне
- хранит runtime-данные в
runtime_root\storage - использует
storage\app_state.jsonдля active model и desktop-настроек - может сохранять историю задач между сессиями
- не удаляет результаты автоматически по времени
powershell -ExecutionPolicy Bypass -File .\scripts\build_desktop_exe.ps1Результат сборки:
dist\Voctarium\Voctarium.exedist\Voctarium-v0.3.0-ml-runtime.zip
В основной build-каталог копируется только dist\Voctarium\bin\ffmpeg.exe.
Тяжелые зависимости Torch, Transformers и NVIDIA CUDA DLL выносятся в
отдельный ML runtime-архив. При первом запуске release-сборка автоматически
скачивает и распаковывает его рядом с приложением.
Модели faster-whisper в release-архив не входят: нужная модель устанавливается
вручную через менеджер моделей в Dashboard.
Dashboard работает только с локально установленными моделями.
- активная модель хранится в
storage\app_state.json - новая задача фиксирует выбранный
model_id retryиспользует исходныйmodel_id- если модель задачи удалена,
retryвернет409 - если активная модель удалена, активный выбор сбрасывается в
null - пока активная модель не выбрана или не установлена, постановка в очередь блокируется
Каталог моделей:
tinybasesmallmediumlarge-v3turbo
Модель по умолчанию в локальной подготовке ассетов:
medium
У успешной задачи есть один пользовательский документ: readable.
Доступные представления:
readable.mdreadable.previewreadable.pdf
Страница результата сейчас работает как readable-only редактор:
- воспроизведение исходного аудио или извлеченной аудиодорожки видео
- waveform с перемоткой и синхронной подсветкой текущего предложения
- переход к нужному фрагменту аудио по клику на текст
- редактирование прямо в интерфейсе
Жирный,Курсив,H2,H3, спискиUndo / Redo- поиск по документу
Сброситьк базовому автоматически сгенерированному варианту- явная кнопка
Сохранитьи автосохранение - экспорт в
.mdи.pdf
Параметры отображения редактора:
- размер шрифта в
px - межстрочие
- ширина текста
- выравнивание
- пустая строка между абзацами
Пользовательские правки хранятся отдельно от базового автоматически созданного файла. Экспорт берет сохраненный override, если он существует.
PDF-экспорт нормализован под документ для чтения:
- сверху по центру ставится оригинальное имя файла
- в PDF не выводится служебная markdown-шапка
- рендерится только основной текст документа
Глобальные настройки приложения доступны на dashboard через кнопку Настройки.
Сейчас поддерживаются два runtime-параметра:
cleanup_uploads_on_close = truecleanup_queue_on_close = false
Они хранятся в storage\app_state.json.
Смысл параметров:
cleanup_uploads_on_closeочищаетstorage\uploadsи временные рабочие файлы при закрытииcleanup_queue_on_closeочищает историю задач иstorage\resultsпри закрытии- если
cleanup_queue_on_close = false, история задач и результаты сохраняются между desktop-сессиями
powershell -ExecutionPolicy Bypass -File .\scripts\e2e_check.ps1Запуск с собственным входным файлом:
powershell -ExecutionPolicy Bypass -File .\scripts\e2e_check.ps1 -InputPath ".\test-input\my-file.mp4"Скрипт:
- по умолчанию берет самый крупный поддерживаемый media-файл из
test-input\ - поднимает API на
127.0.0.1:8000 - запускает smoke-задачу на коротком клипе
- запускает полный прогон на полном файле
- сохраняет результаты и метрики в
storage\e2e\
Артефакты:
storage\e2e\smoke.mdstorage\e2e\full.mdstorage\e2e\metrics.jsonstorage\e2e\uvicorn.stdout.logstorage\e2e\uvicorn.stderr.log
GET /- dashboardGET /jobs/{job_id}- страница результатаGET /health- healthcheckPOST /api/jobs- создать задачу (file, optionalmodel_id,include_timestamps)GET /api/jobs?limit=...- список задачGET /api/jobs/{job_id}- payload задачиGET /api/jobs/{job_id}/source- исходный медиафайл с поддержкой HTTP RangeGET /api/jobs/{job_id}/source-audio- аудиодорожка для встроенного плеераGET /api/jobs/{job_id}/waveform- нормализованные пики waveformGET /api/jobs/{job_id}/sync/readable- таймкоды предложений для синхронизации текстаPOST /api/jobs/{job_id}/retry- повторный запуск из сохраненного исходникаPOST /api/jobs/{job_id}/cancel- остановить активную задачуDELETE /api/jobs/{job_id}- удалить задачу и ее файлыGET /api/models/faster-whisper- каталог моделей и их runtime-статусPOST /api/models/faster-whisper/install- установить модельPOST /api/models/faster-whisper/select- выбрать активную модельDELETE /api/models/faster-whisper/{model_id}- удалить модельGET /api/settings/desktop- прочитать desktop-настройкиPUT /api/settings/desktop- сохранить desktop-настройкиGET /api/jobs/{job_id}/documents/readable- получить текущий readable-документPUT /api/jobs/{job_id}/documents/readable- сохранить readable overrideDELETE /api/jobs/{job_id}/documents/readable- удалить readable override и вернуться к базовому текстуGET /api/jobs/{job_id}/readable.md- скачать markdownGET /api/jobs/{job_id}/readable.preview- HTML previewGET /api/jobs/{job_id}/readable.pdf- PDF-экспорт
VOCTARIUM_RUNTIME_ROOT- корневой runtime-каталог приложенияVOCTARIUM_RESOURCE_ROOT- корневой каталог ресурсовVOCTARIUM_STORAGE_DIR- каталогstorageVOCTARIUM_FFMPEG_PATH- путь кffmpeg.exeVOCTARIUM_FASTER_WHISPER_MODEL- fallback-модельfaster-whisperVOCTARIUM_FASTER_WHISPER_DEVICE- устройство дляfaster-whisperVOCTARIUM_RUPUNCT_MODEL_PATH- путь к моделиRUPunctVOCTARIUM_READABLE_PUNCT_DEVICE- устройство для punctuation/post-processingVOCTARIUM_CLEANUP_INTERVAL_SECONDS- интервал фоновой housekeeping-задачи
Репозиторий рассчитан на source-only публикацию. В Git не должны попадать:
.venv311/models/с самими весовыми файламиbin/storage/results/storage/uploads/storage/work/storage/app_state.jsonstorage/job_history.jsontest-input/- desktop build-артефакты и логи
В репозитории имеет смысл держать только исходники, тесты, скрипты, конфиги и документацию.

