Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 57 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,20 +73,71 @@ jobs:
- name: Package pull request test build
if: github.event_name == 'pull_request'
run: |
version=$(tr -d '[:space:]' < server/linux/VERSION)
ditto -c -k --sequesterRsrc --keepParent \
"$RUNNER_TEMP/VoiceSwitch/VoiceSwitch.app" \
"$RUNNER_TEMP/VoiceSwitch-v0.4.0-beta-test.zip"
"$RUNNER_TEMP/VoiceSwitch-${version}-test.zip"
cd "$RUNNER_TEMP"
shasum -a 256 VoiceSwitch-v0.4.0-beta-test.zip \
> VoiceSwitch-v0.4.0-beta-test.zip.sha256
shasum -a 256 "VoiceSwitch-${version}-test.zip" \
> "VoiceSwitch-${version}-test.zip.sha256"

- name: Upload pull request test build
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@v7
with:
name: VoiceSwitch-v0.4.0-beta-macos-arm64-test
name: VoiceSwitch-${{ github.event.pull_request.number }}-macos-arm64-test
path: |
${{ runner.temp }}/VoiceSwitch-v0.4.0-beta-test.zip
${{ runner.temp }}/VoiceSwitch-v0.4.0-beta-test.zip.sha256
${{ runner.temp }}/VoiceSwitch-*-test.zip
${{ runner.temp }}/VoiceSwitch-*-test.zip.sha256
if-no-files-found: error
retention-days: 7

server:
runs-on: ubuntu-24.04

steps:
- name: Checkout
uses: actions/checkout@v7

- name: Validate Linux Server Edition
run: |
bash -n server/linux/install.sh scripts/package_server_release.sh
python3 -m py_compile \
server/linux/stt/*.py \
server/linux/video/*.py \
server/linux/healthcheck.py
PYTHONPATH=server/linux/video \
python3 -m unittest discover -s server/linux/tests -v
VOICESWITCH_SETUP_VALIDATE_ONLY=1 \
server/linux/install.sh --core-only --no-start

- name: Validate optional OpenClaw plugin
working-directory: server/linux/openclaw-plugin
run: |
npm ci --omit=dev --omit=peer --ignore-scripts --legacy-peer-deps
node --check index.js
node --test \
index.test.js \
source-validation.test.js \
tool-result.test.js \
worker-scope.test.js

- name: Package Linux Server Edition
run: |
chmod +x server/linux/install.sh server/linux/healthcheck.py scripts/package_server_release.sh
./scripts/package_server_release.sh
archive="dist/VoiceSwitch-Server-$(tr -d '[:space:]' < server/linux/VERSION)-linux-x86_64.tar.gz"
test -f "$archive"
test -f "$archive.sha256"
tar -tzf "$archive" | grep -q '/install.sh$'

- name: Upload Linux Server test build
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@v7
with:
name: VoiceSwitch-${{ github.event.pull_request.number }}-linux-x86_64-test
path: |
dist/VoiceSwitch-Server-*.tar.gz
dist/VoiceSwitch-Server-*.tar.gz.sha256
if-no-files-found: error
retention-days: 7
26 changes: 23 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,27 @@ jobs:
- name: Validate release source
run: |
zsh -n scripts/*.sh Resources/install_runtime.sh
python3 -m py_compile worker/asr_worker.py worker/media_worker.py worker/text_worker.py
bash -n server/linux/install.sh scripts/package_server_release.sh
python3 -m py_compile \
worker/asr_worker.py \
worker/media_worker.py \
worker/text_worker.py \
server/linux/stt/*.py \
server/linux/video/*.py \
server/linux/healthcheck.py
python3 -m unittest discover -s tests -v
PYTHONPATH=server/linux/video \
python3 -m unittest discover -s server/linux/tests -v
node --check server/linux/openclaw-plugin/index.js
node --test \
server/linux/openclaw-plugin/index.test.js \
server/linux/openclaw-plugin/source-validation.test.js \
server/linux/openclaw-plugin/tool-result.test.js \
server/linux/openclaw-plugin/worker-scope.test.js
bundle_version=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' Resources/Info.plist)
tag_version="${GITHUB_REF_NAME#v}"
test "$bundle_version" = "${tag_version%%-*}"
test "$(tr -d '[:space:]' < server/linux/VERSION)" = "$tag_version"

- name: Validate clean GigaAM dependency install
run: |
Expand All @@ -37,9 +53,11 @@ jobs:

- name: Build release archive
run: |
chmod +x scripts/*.sh Resources/install_runtime.sh
chmod +x scripts/*.sh Resources/install_runtime.sh server/linux/install.sh server/linux/healthcheck.py
./scripts/package_release.sh "${GITHUB_REF_NAME#v}"
./scripts/package_server_release.sh "${GITHUB_REF_NAME#v}"
test -f "dist/VoiceSwitch-${GITHUB_REF_NAME#v}-macos-arm64/VoiceSwitch.app/Contents/Resources/media_worker.py"
test -f "dist/VoiceSwitch-Server-${GITHUB_REF_NAME#v}-linux-x86_64.tar.gz"

- name: Publish GitHub release
env:
Expand All @@ -52,7 +70,9 @@ jobs:
dist/VoiceSwitch-*.dmg.sha256
dist/VoiceSwitch-*.zip
dist/VoiceSwitch-*.zip.sha256
--title "VoiceSwitch ${GITHUB_REF_NAME}"
dist/VoiceSwitch-Server-*.tar.gz
dist/VoiceSwitch-Server-*.tar.gz.sha256
--title "VoiceSwitch ${GITHUB_REF_NAME} — Linux Server Edition"
)
if [[ -f "$notes_file" ]]; then
args+=(--notes-file "$notes_file")
Expand Down
3 changes: 3 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ swift build
zsh -n scripts/*.sh Resources/install_runtime.sh
python3 -m py_compile worker/asr_worker.py worker/media_worker.py worker/text_worker.py scripts/collect_github_stats.py
python3 -m unittest discover -s tests -v
bash -n server/linux/install.sh scripts/package_server_release.sh
PYTHONPATH=server/linux/video python3 -m unittest discover -s server/linux/tests -v
(cd server/linux/openclaw-plugin && npm ci --omit=dev --omit=peer --ignore-scripts --legacy-peer-deps && node --test index.test.js source-validation.test.js tool-result.test.js worker-scope.test.js)
```

Для изменения распознавания желательно приложить обезличенный набор тестовых
Expand Down
97 changes: 88 additions & 9 deletions INSTALL.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,87 @@
# Установка VoiceSwitch

## Готовый beta-релиз
В релизе есть два независимых пакета: Linux Server Edition и приложение для
Mac. DMG не предназначен для Linux, а серверный архив не содержит SwiftUI GUI.

### 1. Скачивание
## Linux Server Edition

### Требования Linux

- Linux x86_64 и NVIDIA GPU с рабочим драйвером;
- Python 3.12, user systemd и системный `ffprobe`;
- место для двух Python-окружений и загружаемых моделей;
- для pyannote diarization — принятие условий модели и локальная авторизация
Hugging Face;
- для summary и анализа кадров — локальный Ollama с `qwen3-vl:8b`.

### Установка Linux

1. На странице [GitHub Releases](https://github.com/mitimaicode/VoiceSwitch/releases)
скачайте `VoiceSwitch-Server-0.5.0-beta-linux-x86_64.tar.gz` и соседний
файл `.sha256`.
2. Проверьте архив и распакуйте его:

```bash
sha256sum -c VoiceSwitch-Server-0.5.0-beta-linux-x86_64.tar.gz.sha256
tar -xzf VoiceSwitch-Server-0.5.0-beta-linux-x86_64.tar.gz
cd VoiceSwitch-Server-0.5.0-beta-linux-x86_64
```

3. Запустите установщик без `sudo`:

```bash
./install.sh
```

Он создаёт отдельные окружения в `~/.local/share/mitim-stt` и
`~/.local/share/mitim-video`, user service `mitim-stt.service` и команду
`~/.local/bin/voiceswitch-video`. Системный Python и shell-профиль не
изменяются.

Только resident STT без длинного видеоконвейера:

```bash
./install.sh --core-only
```

Полный контур вместе с OpenClaw TaskFlow plugin:

```bash
./install.sh --with-openclaw
```

### Проверка Linux

Проверка сервиса:

```bash
python3 healthcheck.py
```

Короткое аудио:

```bash
~/.local/share/mitim-stt/transcribe.py /absolute/path/to/audio.ogg
```

Длинное видео:

```bash
~/.local/bin/voiceswitch-video /absolute/path/to/video.mp4 --profile standard
```

Сервис слушает только `127.0.0.1:18790`. Не публикуйте этот порт наружу:
endpoint принимает путь к локальному файлу и предназначен для доверенных
процессов того же пользователя.

Полное устройство пакета, профили и закреплённые версии описаны в
[`server/linux/README.md`](server/linux/README.md).

## Приложение для macOS

### Готовый beta-релиз

#### 1. Скачивание

Откройте [GitHub Releases](https://github.com/mitimaicode/VoiceSwitch/releases)
и скачайте файл с окончанием `macos-arm64.dmg` из самого нового релиза.
Expand All @@ -15,7 +94,7 @@ DMG — рекомендуемый и самый простой вариант.
shasum -a 256 VoiceSwitch-*.dmg
```

### 2. Копирование в «Программы»
#### 2. Копирование в «Программы»

1. Дважды нажмите скачанный DMG.
2. Перетащите `VoiceSwitch.app` на ярлык **«Программы»** внутри открывшегося
Expand All @@ -25,7 +104,7 @@ shasum -a 256 VoiceSwitch-*.dmg
Не запускайте VoiceSwitch прямо из DMG или папки «Загрузки»: путь приложения
важен для разрешения автоматической вставки.

### 3. Первый запуск неподписанной beta
#### 3. Первый запуск неподписанной beta

Публичная версия подписана ad-hoc и не нотарифицирована Apple, потому что
проект не использует платную подписку Apple Developer.
Expand All @@ -39,7 +118,7 @@ shasum -a 256 VoiceSwitch-*.dmg
не удалось проверить разработчика. В этом случае закройте предупреждение и
используйте правый клик → **Открыть**.

### 4. Выбор моделей
#### 4. Выбор моделей

Встроенный мастер предлагает три стартовых комплекта:

Expand All @@ -55,7 +134,7 @@ Python 3.12, Python-зависимости, ffmpeg и только выбран
Администраторский пароль не требуется; системный Python и shell-профиль не
изменяются.

### 5. Разрешения macOS
#### 5. Разрешения macOS

Мастер последовательно попросит:

Expand All @@ -68,7 +147,7 @@ Python 3.12, Python-зависимости, ffmpeg и только выбран
включите переключатель. macOS может запросить Touch ID или пароль владельца
Mac. Вернитесь в VoiceSwitch и нажмите **Проверить снова**.

### 6. Первая проверка
#### 6. Первая проверка

1. Откройте любое поле ввода и поставьте в него курсор.
2. Нажмите `fn + Option` — появится красный индикатор записи.
Expand All @@ -80,7 +159,7 @@ Mac. Вернитесь в VoiceSwitch и нажмите **Проверить с
буфере обмена, поэтому при проблеме его можно вставить вручную через
`Command + V`.

### 7. Проверка аудио или видео
#### 7. Проверка аудио или видео

1. В меню VoiceSwitch переключите **Диктовка** на **Файл**.
2. Оставьте GigaAM либо выберите установленный Whisper/Qwen.
Expand All @@ -96,7 +175,7 @@ Application Support. Кадры видео не анализируются. Ме
Повторно выберите тот же неизменённый файл, тот же движок и контекст, чтобы
продолжить. Apple SpeechAnalyzer в файловом режиме пока недоступен.

### Если загрузка моделей прервалась
#### Если загрузка моделей прервалась

Не удаляйте папку Runtime. Нажмите **Продолжить установку** в меню
VoiceSwitch: установщик делает до трёх попыток для загружаемых компонентов,
Expand Down
Loading