Desktop-приложение к статье о Whisper. Оно распознаёт речь локально через faster-whisper, показывает живые субтитры, помогает с диктовкой и превращает аудио или видео в редактируемую расшифровку и караоке-субтитры. Язык распознавания, устройство и модель выбираются явно; для перевода используются локальные модели CTranslate2. Первая и наиболее полная платформа - Windows; Ubuntu и macOS поддерживаются установщиком и ядром (микрофон, медиа, история, мастер загрузок).
Нужны Git и Python 3.12 или 3.13. На Linux обычно ещё libportaudio2
(и при сборке wheels - portaudio19-dev).
git clone https://github.com/network-user/DotAudio.git
cd DotAudio
.\Install.batInstall.bat создаёт .venv, ставит пакет, ярлык на рабочем столе и запускает
приложение. Модели и портативный FFmpeg скачает мастер при первом запуске.
Обновление:
.\deploy\update.ps1или Настройки → Обновления.
git clone https://github.com/network-user/DotAudio.git
cd DotAudio
chmod +x install.sh deploy/*.sh
./install.shУстановщик создаёт .venv, ставит пакет, .desktop в
~/.local/share/applications и лаунчер deploy/dotaudio.sh. Данные:
~/.local/share/DotCore/DotAudio. FFmpeg при отсутствии в PATH скачивается
автоматически (BtbN linux64/arm64).
Обновление:
./deploy/update.shили Настройки → Обновления.
Подсказка по системным пакетам (Ubuntu 24.04):
sudo apt install git python3.12 python3.12-venv libportaudio2git clone https://github.com/network-user/DotAudio.git
cd DotAudio
chmod +x install.sh deploy/*.sh
./install.shНужен Homebrew Python 3.12/3.13. FFmpeg: мастер вызывает brew install ffmpeg,
если Homebrew есть; на Intel возможен и портативный архив. Данные:
~/Library/Application Support/DotCore/DotAudio. Разрешите микрофон в
Системных настройках. Системный звук Live требует виртуальный вход
(BlackHole и т.п.).
Обновление: ./deploy/update.sh или Настройки → Обновления.
Windows:
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e ".[dev,server]"
.\.venv\Scripts\dotaudio.exeLinux / macOS:
python3.12 -m venv .venv
.venv/bin/python -m pip install -e ".[dev,server]"
.venv/bin/dotaudioПри первом распознавании модель Whisper попадёт в локальный кеш. Для быстрой
проверки выберите tiny в «Модели».
Раздел «Ассистент» просит отдельную нативную сборку llama-cpp-python:
.venv/bin/python -m pip install llama-cpp-python \
--extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu| Возможность | Windows | Linux | macOS |
|---|---|---|---|
| Диктовка с микрофона | да | да | да (нужно разрешение) |
| Live «звук системы» | WASAPI loopback | Pulse/PipeWire monitor, если есть в списке | нужен BlackHole / аналог |
| Глобальные хоткеи / автовставка | да | pynput (+ xdotool для paste) | pynput (+ Accessibility / osascript) |
| Авто-FFmpeg | да | да (скачивание) | brew / Intel zip |
| Git-обновления из UI | да | да | да |
- Переносимый мини-остров: уровень сигнала, статус записи, принудительная остановка во время «Завершаем», раскрытие в рабочее окно и переназначаемые горячие клавиши (глобально на Windows).
- Live-субтитры - главный режим: отдельное always-on-top окно, предварительный
текст по короткому окну текущей фразы и финализация в истории. Если модель
отстаёт, неначатая фраза вытесняется новой, сессия не останавливается.
Язык распознавания выбирается явно или определяется Whisper автоматически;
режим
EN → RUиспользует локальную OPUS-MT-модель, а пользовательские пары перевода подключаются из проверенных каталогов CTranslate2. - Живой текст растёт словами: подтверждённый префикс остаётся на месте, уточняемый хвост приглушён и тоньше, перенос строки и сдвиг слов анимируются, предыдущая фраза уходит в строку истории. Одна и та же сцена работает в Live-окне и в окне зала.
- Диктовка с копированием текста в буфер обмена, безопасной вставкой в сохранённое целевое окно (Windows) и сохранением исходной расшифровки в историю.
- Локальный словарь терминов, исправлений и voice snippets для финального текста диктовки без передачи правил на сервер.
- Ограниченная подсказка Whisper, настраиваемое короткое Live-окно, стационарное шумоподавление и high-pass без изменения исходной записи.
- Выбор и проверка устройств ввода и вывода, визуальный уровень сигнала.
- Медиа-режим: аудио или видео, сегменты с таймкодами, ручное редактирование,
undo/redo и сохранение в TXT, строку
00:16 - 00:20 [Диктор 2] текст, реплики по ролям, протокол заседания, Markdown, SRT, VTT, CSV, JSON и LRC. Окно сохранения показывает готовый текст файла и меняет параметры на месте: точность времени от секунд до миллисекунд, вид имени голоса, разделители, склейку реплик одного говорящего, фильтр по голосу и по меткам проверки. SRT/VTT перегруппировываются по словным таймкодам, длине и пунктуации без выдумывания времени. - Караоке-просмотр с подсветкой текущего слова, экспорт ASS и MP4 поверх видео или выбранной обложки.
- Расшифровка файла с определением говорящих: модель NVIDIA NeMo Sortformer (до четырёх голосов) размечает дорожку по времени, поэтому фраза со сменой голоса разрезается по границе, а не получает одну метку. Голоса можно переименовать, оставить в списке одного говорящего и перейти к фразе по полосе разговора. Движок необязателен: без него остаётся текст с таймкодами. Запасной вариант - SpeechBrain ECAPA, одна метка на фразу.
- Мониторинг до четырёх прямых HTTP(S) источников, локальные ключевые фразы, пауза 20 с на повтор одного слова и автоматическое переподключение потока с backoff.
- Локальная SQLite-история с миграциями и восстановлением прерванных сессий,
журнал работы, модели
tiny,base,small,medium,large-v3иturbo, профили скорости и качества. - Ассистент по записям на локальной языковой модели: выбор записи слева, чат справа, готовые действия «изложение», «главные мысли», «задачи», «темы» и свободный разговор без записи. Часовой разговор не помещается в контекст небольшой модели, поэтому запись режется на части, для каждой части один раз считается выжимка, из выжимок собирается карта с таймкодами, и под вопрос раскрываются только нужные части. Переписка хранится рядом с записью.
- Подбор языковой модели по измеренному железу: число потоков, объём ОЗУ, видеокарта и её память. Каталог показывает, что поместится целиком в видеопамять, а что будет считаться на процессоре. Видеокарты перечисляются по вендору - NVIDIA, AMD, Intel, - а не по одному признаку «есть ли CUDA»; на системах с несколькими NVIDIA можно выбрать конкретный CUDA-индекс.
- Предварительная оценка RAM/VRAM перед загрузкой Whisper, автоматический выбор безопасного compute type и явный fallback на CPU или другой доступный GPU. Проверка файлов, выделение памяти и готовность разделены статусами; пока модель инициализируется, UI показывает неопределённый прогресс, а не зависание на условных 55 %.
- Аппаратная validation-проверка без запуска inference: состояния
ready,fallback,insufficient,unknownиunavailableпопадают в «Диагностику». Отчёт можно скопировать в bounded text/JSON-формате без секретов, traceback и абсолютных путей. - Перевод остаётся явным действием: штатный EN → RU работает локально, а свои пары, например zh → ru, импортируются из проверенного каталога CTranslate2 и применяются к Live и файловой расшифровке.
- Опциональная обработка аудио: стационарное шумоподавление, high-pass и настраиваемое короткое окно Live. Все тяжёлые операции выполняются вне GUI.
- При транскрибации с голосами Whisper и NeMo работают в согласованном runtime-device; перед diarization освобождается кеш ASR, а при ошибке GPU выполняется CPU fallback с сохранением обычной расшифровки.
src/dotaudio/
app.py, controller.py, desktop.py # запуск, связка QML и системное окно
capture.py -> pipeline.py -> engine.py
# захват, очередь и faster-whisper
audio_preprocess.py # опциональное шумоподавление и high-pass
storage.py, transcripts.py # SQLite, миграции и экспорт расшифровок
karaoke.py # word timestamps, ASS и MP4
speaker_id.py, nemo_diarize.py # голоса: разметка дорожки и разбор фраз
hardware.py, cuda_runtime.py # опрос, RAM/VRAM validation и ускорение
adapt.py, modelhub.py # preflight памяти и модели с докачкой
model_registry.py, translate.py # локальные модели перевода и пары языков
diag.py, setup_controller.py # диагностика, отчёт и мастер подготовки
watch_folder.py, tools_ffmpeg.py # стабильный watcher и портативный FFmpeg
updater.py, process_priority.py # git-обновления и приоритет (Windows)
llm.py, assistant.py # каталог языковых моделей и разбор записи
assistant_controller.py # мост ассистента: воркеры и сигналы
qml/MainMvp.qml # оболочка: остров, сцена субтитров, окно
qml/MiniIsland.qml, LiveTheater.qml, CaptionOverlay.qml
qml/Theme.js, CaptionText.qml, CaptionStage.qml
qml/SettingsPage.qml # среда, Live-источник, обновления
qml/KaraokePreview.qml, TranscriptEditor.qml, TranscriptView.qml
qml/TranscriptExportDialog.qml
qml/AssistantPage.qml, AssistantModels.qml
deploy/
install.ps1 / update.ps1 # Windows
install.sh / update.sh # Linux / macOS
tests/
docs/
Windows:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e ".[dev,server]"
.\.venv\Scripts\dotaudio.exe
.\.venv\Scripts\python.exe -m pytest -q
.\.venv\Scripts\python.exe -m ruff check src tests
$env:QT_QPA_PLATFORM = "offscreen"
.\.venv\Scripts\python.exe -m dotaudio --smoke-test --data-dir .local-checkLinux / macOS:
python3.12 -m venv .venv
.venv/bin/python -m pip install -e '.[dev,server]'
.venv/bin/dotaudio
.venv/bin/python -m pytest -q
.venv/bin/python -m ruff check src tests
QT_QPA_PLATFORM=offscreen .venv/bin/python -m dotaudio --smoke-test --data-dir .local-checkПоследняя проверка на машине разработки (Windows): 604 passed, 11 skipped.
ruff check src tests и QML smoke-test проходят. Три предупреждения относятся к
FastAPI/Starlette TestClient и невозможности pytest записать .pytest_cache в
управляемом окружении. Реальные
микрофон, системный звук, GPU и FFmpeg зависят от конкретного компьютера и
проверяются на нём вручную. Ubuntu и macOS в этой сессии не прогонялись
end-to-end - установщик и ветки кода добавлены, ручной чеклист на целевых
машинах ещё впереди.
LoC-бейдж пересчитан fallback-методом: непустые строки без однострочных
комментариев в src/, tests/ и deploy/; пакет code-counter-ntwusr в
изолированном окружении недоступен.
- План закрытия обратной связи
- Описание продукта
- Архитектура
- Исследование решений
- Аналоги и принципы адаптации
- Передача проекта
микрофон / loopback (WASAPI | Pulse monitor | BlackHole)
-> capture.py, блоки 100 мс
-> pipeline.py, endpointing + preview + final очередь
-> engine.py, faster-whisper / CTranslate2
-> controller.py, Qt signals
-> CaptionOverlay.qml / LiveTheater.qml / SQLite history
hardware.py + adapt.py + modelhub.py
-> hardware validation (RAM/VRAM/CUDA, без inference)
-> engine preflight для выбранного CUDA-индекса -> model cache
-> фактическое runtime-устройство и CPU fallback
-> Doctor -> bounded text/JSON report без секретов и абсолютных путей
запись в SQLite
-> assistant.py, части по границам фраз
-> выжимка каждой части один раз -> карта с таймкодами
-> выбор нужных частей (поиск по словам + сама модель)
-> llm.py, llama.cpp или Ollama
-> assistant_controller.py, Qt signals -> AssistantPage.qml
- QML не запускает inference и не обращается к SQLite.
- Аппаратная validation не делает повторный probe и не считает неизвестную телеметрию успешным запуском.
- Свойства контроллеров не трогают диск и сеть: интерфейс читает их на каждой перерисовке, поэтому готовность модели считается в воркере.
- Модель готовится до старта захвата Live, тяжёлая работа не выполняется в GUI-потоке.
- Предварительные задачи заменяются свежими, финальные сегменты сохраняются один раз.
- Live догоняет звук: неначатая фраза вытесняется новой, сессия продолжается.
- Принудительная остановка на острове снимает «Завершаем», если decode не вернулся.
© 2026 DotCore. Все права защищены.
Проприетарный код. Использование, копирование, изменение и распространение запрещены без письменного разрешения автора. Исходный код открыт только для ознакомления. См. LICENSE.