Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
80689ad
Implement TTS provider management system and update release workflow
jamiepine Jan 31, 2026
d895215
Update LocalProvider to manage model size dynamically and clean up bu…
jamiepine Jan 31, 2026
ec9402c
Update qwen-tts version in requirements for CPU and CUDA providers fr…
jamiepine Jan 31, 2026
ec0fb60
Enhance release workflow and add radio group component
jamiepine Jan 31, 2026
ce4269f
Refactor build scripts and update release workflow
jamiepine Jan 31, 2026
ab10c26
Update release workflow to include libasound2-dev dependency for Ubun…
jamiepine Jan 31, 2026
a52ff7d
Add Linux audio capture module with unsupported functionality
jamiepine Jan 31, 2026
9420649
Update TTS provider methods and dependencies
jamiepine Feb 1, 2026
dcbdf3e
Bump version: 0.1.12 → 0.1.13
jamiepine Feb 1, 2026
6dd5bb2
hugeicons
jamiepine Feb 1, 2026
3b14f81
Enhance release workflow and update provider settings
jamiepine Feb 1, 2026
580179e
Refactor TTS provider management and enhance documentation
jamiepine Feb 1, 2026
595747c
Refactor provider health status and update build configurations
jamiepine Feb 1, 2026
be30a0a
Update provider documentation and enhance build configurations
jamiepine Feb 2, 2026
9b07a84
Update Windows configuration in release workflow to use PyTorch backend
jamiepine Feb 2, 2026
e4f3647
Add CPU-only PyTorch installation for Linux in release workflow
jamiepine Feb 2, 2026
4c4b3e5
Update dependencies and enhance project configuration
jamiepine Feb 2, 2026
f090759
Add Docker support and update dependencies
jamiepine Feb 2, 2026
53b1e88
Enhance provider logging and error handling
jamiepine Feb 2, 2026
732d35c
Update README and documentation for Linux support and Docker usage
jamiepine Feb 2, 2026
61dabe7
Enhance provider packaging and CUDA download functionality
jamiepine Feb 2, 2026
3ffbdee
Update Dockerfiles to prevent interactive prompts and include timezon…
jamiepine Feb 2, 2026
409ec2d
Enhance ProviderSettings component with loading state and improved UI…
jamiepine Feb 2, 2026
af7e981
Remove 'Active' badge for inactive PyTorch providers in ProviderSetti…
jamiepine Feb 2, 2026
73d9b5d
Refactor ProviderSettings component for improved readability and main…
jamiepine Feb 3, 2026
793e392
Add DataFolders component to ServerSettings for managing system folde…
jamiepine Feb 3, 2026
43241b8
Update Dockerfile to install Python 3.12 venv and bootstrap pip
jamiepine Feb 3, 2026
3f633f4
Update ProviderSettings component for improved clarity and user guidance
jamiepine Feb 3, 2026
d219543
Merge branch 'main' into external-provider-binaries
jamiepine Feb 3, 2026
637e0b4
Enhance ProviderSettings component for platform-specific functionality
jamiepine Feb 3, 2026
5d66970
Refactor FloatingGenerateBox and HistoryTable components for improved…
jamiepine Feb 3, 2026
66cdb30
remove redundant file
jamiepine Feb 3, 2026
dab3344
Enhance StoryList component with dynamic bottom padding
jamiepine Feb 3, 2026
1622e08
format
jamiepine Feb 3, 2026
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
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.1.12
current_version = 0.1.13
commit = True
tag = True
tag_name = v{new_version}
Expand Down
55 changes: 55 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Dependencies
node_modules/
__pycache__/
*.pyc
*.pyo
*.pyd
.Python
env/
venv/

# Build outputs
build/
*.egg-info/
.eggs/
target/

# Keep web/dist for the Docker image
!web/dist

# Development
.git/
.github/
.vscode/
.idea/
*.swp
*.swo
*~

# Data and logs
data/
*.log
*.sqlite
*.db

# OS
.DS_Store
Thumbs.db

# Documentation
docs/
landing/
mlx-test/

# Test files
*.test.ts
*.test.tsx
*.spec.ts
*.spec.tsx

# Keep these out
.env
.env.local
*.pem
*.key
credentials.json
253 changes: 238 additions & 15 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,174 @@ on:
tags:
- "v*"

env:
PROVIDER_VERSION: "1.0.0"

jobs:
# ============================================
# Build TTS Providers (uploaded to R2, not GitHub)
# ============================================
build-providers:
runs-on: ${{ matrix.platform }}
strategy:
fail-fast: false
matrix:
include:
# PyTorch CPU provider (Windows)
- platform: "windows-latest"
provider: "pytorch-cpu"
python-version: "3.12"
# PyTorch CUDA provider (Windows) - large binary, uploaded to R2
- platform: "windows-latest"
provider: "pytorch-cuda"
python-version: "3.12"
# PyTorch CPU provider (Linux)
- platform: "ubuntu-22.04"
provider: "pytorch-cpu"
python-version: "3.12"
# PyTorch CUDA provider (Linux) - large binary, uploaded to R2
- platform: "ubuntu-22.04"
provider: "pytorch-cuda"
python-version: "3.12"
# PyTorch CPU provider (macOS Apple Silicon)
- platform: "macos-latest"
provider: "pytorch-cpu"
python-version: "3.12"
# PyTorch CPU provider (macOS Intel)
- platform: "macos-15-intel"
provider: "pytorch-cpu"
python-version: "3.12"

steps:
- uses: actions/checkout@v4

- name: Install dependencies (ubuntu only)
if: matrix.platform == 'ubuntu-22.04'
run: |
sudo apt-get update
sudo apt-get install -y llvm-dev

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: "pip"

- name: Install CPU-only torch (Linux)
if: matrix.provider == 'pytorch-cpu' && matrix.platform == 'ubuntu-22.04'
run: |
python -m pip install --upgrade pip
pip install pyinstaller
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install -r providers/pytorch-cpu/requirements.txt
pip install -r backend/requirements.txt

- name: Install Python dependencies (CPU - non-Linux)
if: matrix.provider == 'pytorch-cpu' && matrix.platform != 'ubuntu-22.04'
run: |
python -m pip install --upgrade pip
pip install pyinstaller
pip install -r providers/pytorch-cpu/requirements.txt
pip install -r backend/requirements.txt

- name: Install Python dependencies (CUDA)
if: matrix.provider == 'pytorch-cuda'
run: |
python -m pip install --upgrade pip
pip install pyinstaller
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install -r providers/pytorch-cuda/requirements.txt
pip install -r backend/requirements.txt

- name: Build provider binary
shell: bash
run: |
cd providers/${{ matrix.provider }}
python build.py

- name: Package provider for distribution
shell: bash
run: |
cd providers/${{ matrix.provider }}/dist

# Add platform suffix for archive name
if [ "${{ matrix.platform }}" == "windows-latest" ]; then
ARCHIVE_NAME="tts-provider-${{ matrix.provider }}-windows.zip"
# On Windows, zip the directory
powershell Compress-Archive -Path "tts-provider-${{ matrix.provider }}/*" -DestinationPath "$ARCHIVE_NAME"
elif [ "${{ matrix.platform }}" == "macos-latest" ]; then
ARCHIVE_NAME="tts-provider-${{ matrix.provider }}-macos-arm64.tar.gz"
tar -czf "$ARCHIVE_NAME" tts-provider-${{ matrix.provider }}/
elif [ "${{ matrix.platform }}" == "macos-15-intel" ]; then
ARCHIVE_NAME="tts-provider-${{ matrix.provider }}-macos-x64.tar.gz"
tar -czf "$ARCHIVE_NAME" tts-provider-${{ matrix.provider }}/
else
ARCHIVE_NAME="tts-provider-${{ matrix.provider }}-linux.tar.gz"
tar -czf "$ARCHIVE_NAME" tts-provider-${{ matrix.provider }}/
fi

echo "Created archive: $ARCHIVE_NAME"
ls -lh "$ARCHIVE_NAME"

- name: Upload provider to R2
shell: bash
env:
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
R2_ENDPOINT: ${{ secrets.R2_ENDPOINT }}
run: |
# Install AWS CLI (compatible with R2)
pip install awscli

# Configure AWS CLI for R2
aws configure set aws_access_key_id $R2_ACCESS_KEY_ID
aws configure set aws_secret_access_key $R2_SECRET_ACCESS_KEY
aws configure set region auto

# Determine archive name based on platform
if [ "${{ matrix.platform }}" == "windows-latest" ]; then
ARCHIVE_NAME="tts-provider-${{ matrix.provider }}-windows.zip"
elif [ "${{ matrix.platform }}" == "macos-latest" ]; then
ARCHIVE_NAME="tts-provider-${{ matrix.provider }}-macos-arm64.tar.gz"
elif [ "${{ matrix.platform }}" == "macos-15-intel" ]; then
ARCHIVE_NAME="tts-provider-${{ matrix.provider }}-macos-x64.tar.gz"
else
ARCHIVE_NAME="tts-provider-${{ matrix.provider }}-linux.tar.gz"
fi

# Upload to R2 (bucket: voicebox)
aws s3 cp "providers/${{ matrix.provider }}/dist/$ARCHIVE_NAME" \
"s3://voicebox/providers/v${{ env.PROVIDER_VERSION }}/$ARCHIVE_NAME" \
--endpoint-url "$R2_ENDPOINT"

echo "Uploaded $ARCHIVE_NAME to R2"

# ============================================
# Build Main App (without bundled TTS on Win/Linux)
# ============================================
release:
permissions:
contents: write
strategy:
fail-fast: false
matrix:
include:
# macOS Apple Silicon - MLX bundled (works out of the box)
- platform: "macos-latest"
args: "--target aarch64-apple-darwin"
python-version: "3.12"
backend: "mlx"
# macOS Intel - PyTorch bundled (smaller user base, keep simple)
- platform: "macos-15-intel"
args: "--target x86_64-apple-darwin"
python-version: "3.12"
backend: "pytorch"
# - platform: 'ubuntu-22.04'
# args: ''
# python-version: '3.12'
# backend: 'pytorch'
# Linux - No TTS bundled, providers downloaded separately
- platform: "ubuntu-22.04"
args: ""
python-version: "3.12"
backend: "none"
# Windows - PyTorch CPU bundled (works out of the box)
- platform: "windows-latest"
args: ""
python-version: "3.12"
Expand All @@ -40,7 +188,7 @@ jobs:
if: matrix.platform == 'ubuntu-22.04'
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf llvm-dev
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf llvm-dev libasound2-dev

- name: Install LLVM (macOS)
if: matrix.platform == 'macos-latest' || matrix.platform == 'macos-15-intel'
Expand All @@ -55,23 +203,27 @@ jobs:
python-version: ${{ matrix.python-version }}
cache: "pip"

- name: Install Python dependencies
- name: Install Python dependencies (with TTS)
if: matrix.backend != 'none'
run: |
python -m pip install --upgrade pip
pip install pyinstaller
pip install -r backend/requirements.txt

- name: Install Python dependencies (without TTS)
if: matrix.backend == 'none'
run: |
python -m pip install --upgrade pip
pip install pyinstaller
# Install base requirements without PyTorch/Qwen-TTS
pip install fastapi uvicorn sqlalchemy librosa soundfile numpy httpx
pip install huggingface_hub # For Whisper downloads

- name: Install MLX dependencies (Apple Silicon only)
if: matrix.backend == 'mlx'
run: |
pip install -r backend/requirements-mlx.txt

# - name: Install PyTorch with CUDA (Windows only)
# if: matrix.platform == 'windows-latest'
# run: |
# pip install torch --index-url https://download.pytorch.org/whl/cu121 --force-reinstall --no-deps
# pip install torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

- name: Build Python server (Linux/macOS)
if: matrix.platform != 'windows-latest'
run: |
Expand Down Expand Up @@ -148,13 +300,84 @@ jobs:
See the assets below to download and install this version.

### Installation
- **macOS (Apple Silicon)**: Download the `aarch64.dmg` file - uses MLX for fast native inference
- **macOS (Apple Silicon)**: Download the `aarch64.dmg` file - uses MLX for fast native inference (works out of the box)
- **macOS (Intel)**: Download the `x64.dmg` file - uses PyTorch
- **Windows**: Download the `.msi` installer
- **Linux**: Download the `.AppImage` or `.deb` package
- **Windows**: Download the `.msi` installer - requires downloading a TTS provider on first use
- **Linux**: Download the `.AppImage` or `.deb` package - requires downloading a TTS provider on first use

### TTS Providers
Windows and Linux users will be prompted to download a TTS provider on first launch:
- **Windows**: PyTorch CPU (~300MB) or PyTorch CUDA (~2.4GB for NVIDIA GPUs)
- **Linux**: PyTorch CUDA (~2.4GB) - requires NVIDIA GPU

The app includes automatic updates - future updates will be installed automatically.
releaseDraft: true
prerelease: false
args: ${{ matrix.args }}
includeUpdaterJson: true

# ============================================
# Build and Push Docker Images
# ============================================
docker:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Setup Bun
uses: oven-sh/setup-bun@v2

- name: Install dependencies and build web UI
run: |
bun install
cd web
bun run build

- name: Extract version from tag
id: version
run: |
if [[ $GITHUB_REF == refs/tags/v* ]]; then
VERSION=${GITHUB_REF#refs/tags/v}
else
VERSION="dev"
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT

- name: Build and push CPU image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: |
ghcr.io/jamiepine/voicebox:latest
ghcr.io/jamiepine/voicebox:${{ steps.version.outputs.version }}
cache-from: type=gha
cache-to: type=gha,mode=max

- name: Build and push CUDA image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile.cuda
platforms: linux/amd64
push: true
tags: |
ghcr.io/jamiepine/voicebox:latest-cuda
ghcr.io/jamiepine/voicebox:${{ steps.version.outputs.version }}-cuda
cache-from: type=gha
cache-to: type=gha,mode=max
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ dist/
build/
*.egg-info/
*.egg
*.spec
target/
*.app
*.dmg
Expand Down
Loading