Skip to content

Repository files navigation

.аудио / DotAudio

Python 3.12-3.13 Windows Linux macOS Desktop ASR 49638 lines of code

DotAudio: речь и субтитры

security audit passed - full, leaks + code audit date

Desktop-приложение к статье о Whisper. Оно распознаёт речь локально через faster-whisper, показывает живые субтитры, помогает с диктовкой и превращает аудио или видео в редактируемую расшифровку и караоке-субтитры. Язык распознавания, устройство и модель выбираются явно; для перевода используются локальные модели CTranslate2. Первая и наиболее полная платформа - Windows; Ubuntu и macOS поддерживаются установщиком и ядром (микрофон, медиа, история, мастер загрузок).

Запуск

Нужны Git и Python 3.12 или 3.13. На Linux обычно ещё libportaudio2 (и при сборке wheels - portaudio19-dev).

Windows

git clone https://github.com/network-user/DotAudio.git
cd DotAudio
.\Install.bat

Install.bat создаёт .venv, ставит пакет, ярлык на рабочем столе и запускает приложение. Модели и портативный FFmpeg скачает мастер при первом запуске.

Обновление:

.\deploy\update.ps1

или Настройки → Обновления.

Ubuntu / Linux

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 libportaudio2

macOS

git 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.exe

Linux / 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-check

Linux / 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 в изолированном окружении недоступен.

Стек

Python Qt Quick faster-whisper SQLite FastAPI pytest ruff

Документы

Архитектура

микрофон / 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.

About

работа с голосом

Resources

Stars

11 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages