- Установите
ffmpeg,ffprobe,whisper.cppи добавьте вPATH. - Положите модель
.bin/.ggufв~/.media-transcriber/models(или укажите свой путь в настройках). - Запустите приложение:
go run .илиwails dev
Подробно: docs/QUICKSTART.md.
- Запускается
main.go, создаётсяbootstrap.AppчерезNew(). - В
New()загружаются настройки из~/.media-transcriber/settings.json(или берутся дефолтные), создаются менеджер задач, пайплайн транскрибации, диагностика окружения и шина событий. App.Run()запускает Wails-окно, подключает фронтенд и биндинг backend-методов (GetDiagnostics,StartTranscription,CancelTranscriptionи др.).- В
Startupсохраняется runtime-контекст Wails для push-событий черезruntime.EventsEmit("job:event", ...). - Фронтенд запрашивает диагностику и подписывается на поток
job:event.
StartTranscription(inputPath)перечитывает настройки, создаётjobID, проверяет, что нет активной задачи, переводит задачу вpreprocessingи запускает обработку в отдельной goroutine.runTranscriptionJob(...)вызываетpipeline.Run(...), передавая колбэки стадий и логов.- Стадия
preprocessing:ffmpegконвертирует входной файл в WAV (mono,16kHz,pcm_s16le) во временной директории. - Стадия
transcribing: определяется путь к модели (.bin/.gguf), запускаетсяwhisper.cpp, создаётся.txtв выходной папке. - Стадия
exporting: читается итоговый.txt, формируетсяResult(путь, текст, логи), временные файлы очищаются.
- При успехе статус становится
done, отправляетсяresult-событие сTextPath. - При ошибке статус
failed, публикуются детали ошибки и лог команды. - При отмене
CancelTranscription()отменяет контекст, статус становитсяcancelled, UI получает событие отмены.
- В
internal/jobs/events.goопределены:EventType:status,log,result,errorEvent: полезная нагрузка (JobID,Status,Message,Command,TextPathи т.д.) +SeqиTimestamp.
EventBusхранит события в памяти и защищёнsync.RWMutex.Publish(...)увеличиваетnextSeq, присваиваетSeq, при необходимости ставитTimestamp, сохраняет событие.Since(seq)возвращает только новые события (Seq > seq) для инкрементального чтения.- Буфер ограничен
maxEvents; старые события обрезаются при переполнении. - В
internal/bootstrap/app.goметодpublishEvent(...):- сохраняет событие в
EventBus(история), - пушит его в Wails runtime через
EventsEmit("job:event", ...)(live-канал).
- сохраняет событие в
- Фронтенд подписывается через
window.runtime.EventsOn("job:event", ...)и получает события в реальном времени. - Дополнительно backend-метод
JobEvents(sinceSeq)позволяет догрузить историю поSeq.
- Packaging/signing:
- macOS:
./scripts/release/build-macos.sh - Windows build (bash):
./scripts/release/build-windows.sh - Windows signing (PowerShell):
pwsh -File .\\scripts\\release\\build-windows.ps1- если
wails buildпадает локально, скрипт автоматически делает fallbackgo buildи выдаёт.exe
- если
- macOS:
- Универсальный запуск по ОС:
./scripts/release/build-all.sh - CI workflow:
.github/workflows/release-build.yml- ручной запуск:
workflow_dispatch - auto release: push тега
v*
- ручной запуск:
- Протокол smoke-теста (3 часа):
docs/SMOKE_TEST.md - Шаблон отчёта:
docs/smoke-results/TEMPLATE.md - Создать новый отчёт:
./scripts/smoke/new-run.sh - Подробная release-документация:
docs/RELEASE.md