- Integrated transcription feature using the useTranscription hook. - Added a button to trigger audio transcription, displaying status during the process. - Updated form handling to reset on dialog close and improved user feedback with toast notifications. - Enhanced form description to clarify supported audio formats and transcription capabilities.
voicebox
A production-quality desktop app for Qwen3-TTS voice cloning and generation.
Domain: voicebox.sh
Vision
Qwen3-TTS is a breakthrough model from Alibaba that achieves near-perfect voice cloning. The existing implementations (Voice-Clone-Studio, mimic, etc.) are either feature-rich but architecturally messy, or well-structured but limited in scope.
voicebox aims to build the definitive Qwen3-TTS application by combining the best patterns from existing projects while avoiding their architectural mistakes.
Design Principles
- Clean architecture from day one - No monolithic files, proper separation of concerns
- Desktop-first experience - Native feel via Tauri, not a web app in disguise
- Production code quality - Type safety, modularity, maintainability
- Performance and UX - Smart caching, async operations, responsive UI
- Extensible design - Easy to add new models, effects, and features
- Flexible deployment - Run backend locally or connect to remote GPU machine with one click
Technology Stack
Backend (Python)
- FastAPI - Async REST API
- SQLAlchemy - Database ORM with migrations
- Pydantic - Request/response validation
- Qwen3-TTS - Voice cloning model
- Whisper - Speech-to-text transcription
- librosa + soundfile - Audio processing
Frontend (Tauri + TypeScript)
- Tauri - Native desktop framework
- React - UI framework
- TypeScript - Type safety throughout
- Bun - Fast package manager and JavaScript runtime
- React Query - Server state management and API calls
- OpenAPI (generated) - Type-safe API client from FastAPI schema
- Tailwind CSS - Styling
- Zustand - Client-side state management
- WaveSurfer.js - Audio visualization
Database
- SQLite - Local storage
- Alembic - Schema migrations
Server/Client Mode
voicebox supports flexible deployment for users with multiple machines:
Local Mode (Default)
- Backend runs locally alongside the Tauri app
- Best for users with GPU on their primary machine
Remote Mode (One-Click Setup)
- Use case: Your laptop doesn't have a GPU, but your desktop does
- Server: Run voicebox on GPU machine, click "Start Server"
- Starts FastAPI backend on local network
- Shows connection URL (e.g.,
http://192.168.1.100:8000)
- Client: Run voicebox on laptop, enter server URL
- Connects to remote backend
- Full UI functionality, inference happens on GPU machine
- Security: Local network only for now (no internet exposure)
How It Works
┌─────────────────┐ ┌─────────────────┐
│ Laptop │ │ Desktop │
│ (Client) │ │ (Server) │
│ │ │ │
│ Tauri App ────────────────▶ FastAPI │
│ React UI │ HTTP │ Qwen3-TTS │
│ │ │ SQLite │
│ │ │ CUDA/GPU │
└─────────────────┘ └─────────────────┘
Benefits:
- Use powerful GPU machine from lightweight laptop
- No complex setup - just click "Start Server"
- All data (history, profiles) lives on server
- Client is just a UI - no local storage needed in remote mode
Core Features
Phase 1 (MVP)
- Voice profile management
- Single-reference voice cloning
- Generation history with search
- Basic audio playback and preview
- Server/client mode (local network)
- One-click server startup
Phase 2
- Multi-reference voice combination
- Batch variation generation
- Advanced audio normalization
- Export options and formats
Phase 3
- Audio studio with timeline editing
- Word-level timestamps
- Project system (save/load sessions)
- Export options
Phase 4
- Voice design (text-to-voice)
- Preset voices with style control
- Conversation mode (multi-speaker)
- Custom audio effects
Key Differentiators
What makes voicebox better than existing implementations:
- Clean codebase - Modular architecture, no 2,000+ line files
- Type safety end-to-end - OpenAPI-generated TypeScript client, Pydantic backend, React Query
- Smart caching - Voice prompt caching for instant re-generation
- Desktop UX - Native performance, keyboard shortcuts, native dialogs
- Server/client mode - One-click remote GPU access from any device
- Multi-reference - Combine voice samples for higher quality
- Audio studio - Timeline-based editing with word-level precision
- Production patterns - Cross-platform, graceful degradation, error recovery
- Database-backed - Searchable history, project persistence
- Extensible - Clean plugin system for models and features
Architecture Overview
voicebox/
├── app/ # Shared React frontend (used by web & desktop)
│ ├── src/
│ │ ├── components/ # React components
│ │ │ ├── VoiceProfiles/
│ │ │ ├── Generation/
│ │ │ ├── AudioStudio/
│ │ │ ├── History/
│ │ │ └── ServerSettings/
│ │ ├── lib/
│ │ │ ├── api/ # Generated OpenAPI client
│ │ │ ├── hooks/ # React Query hooks
│ │ │ └── utils/
│ │ ├── types/
│ │ └── App.tsx
│ ├── package.json
│ └── vite.config.ts
│
├── tauri/ # Tauri desktop app (thin wrapper)
│ ├── src/
│ │ └── main.tsx # Entry point, imports from ../app
│ ├── src-tauri/ # Rust backend
│ │ ├── src/
│ │ │ └── main.rs # Sidecar management, IPC
│ │ ├── binaries/ # Bundled Python server
│ │ │ └── voicebox-server-{platform}
│ │ ├── Cargo.toml
│ │ └── tauri.conf.json
│ └── package.json
│
├── web/ # Web deployment (thin wrapper)
│ ├── src/
│ │ └── main.tsx # Entry point, imports from ../app
│ ├── package.json
│ └── vite.config.ts
│
├── backend/ # Python FastAPI server
│ ├── main.py # FastAPI app + server mode
│ ├── models.py # Pydantic models
│ ├── tts.py # TTS inference
│ ├── transcribe.py # Whisper ASR
│ ├── profiles.py # Voice profiles
│ ├── history.py # Generation history
│ ├── studio.py # Audio editing
│ ├── database.py # SQLite ORM
│ ├── utils/
│ │ ├── audio.py # Audio processing
│ │ ├── cache.py # Prompt caching
│ │ └── validation.py
│ ├── requirements.txt
│ └── build_binary.py # PyInstaller build script
│
├── scripts/
│ ├── build-server.sh # Build Python binary for all platforms
│ └── generate-api.sh # Generate OpenAPI client
│
├── data/ # User data
│ ├── profiles/
│ ├── generations/
│ ├── projects/
│ └── voicebox.db
│
├── package.json # Root workspace config
└── docs/
├── ANALYSIS.md # Analysis of existing projects
├── TAURI_PLAN.md # Tauri app structure and bundling strategy
└── ARCHITECTURE.md # Detailed architecture docs
Key architectural decisions:
- Shared frontend -
app/contains all React code, used by both desktop and web - Thin wrappers -
tauri/andweb/just configure build tools and entry points - Bundled backend - Python server packaged as sidecar binary with PyInstaller
- Type-safe API - OpenAPI schema generated from FastAPI, TypeScript client auto-generated
See TAURI_PLAN.md for detailed bundling strategy.
Lessons from Existing Projects
voicebox learns from five existing Qwen3-TTS implementations:
voice (Rust CLI)
- ✅ Clean Rust/Python IPC pattern
- ✅ M3GAN voice effect
- ✅ Voice profile abstraction
- ❌ No concurrent requests
- ❌ No generation history
Voice-Clone-Studio
- ✅ Brilliant voice prompt caching
- ✅ Feature-rich (voice design, presets, conversations)
- ✅ VRAM-efficient model management
- ❌ 2,815-line single file
- ❌ Global state everywhere
Qwen3-TTS_server
- ✅ Clean modular structure
- ✅ FastAPI REST API design
- ✅ Health endpoint for monitoring
- ❌ No authentication or rate limiting
- ❌ No caching or streaming
- ❌ No OpenAPI client generation
mimic
- ✅ Excellent backend architecture (async, modular)
- ✅ Audio studio with timeline
- ✅ Database-backed history
- ✅ Multi-sample voice profiles
- ❌ 2,794-line app.js frontend
- ❌ Global state in UI
qwen3-tts-enhanced
- ✅ Multi-reference combination
- ✅ Cross-platform graceful degradation
- ✅ Audio validation
- ✅ Production error handling
- ❌ Still monolithic (1,892 lines)
- ❌ No API layer
See ANALYSIS.md for detailed breakdown of each project.
Development Roadmap
Week 1: Foundation
- Project structure setup
- Backend skeleton (FastAPI + SQLite)
- OpenAPI schema generation
- Frontend skeleton (Tauri + React)
- TypeScript client generation from OpenAPI
- React Query setup
- Basic voice profile CRUD
- Server mode implementation
- Client connection UI
Week 2: Core Features
- TTS integration
- Voice cloning pipeline
- Voice prompt caching
- Generation history
Week 3: UX Polish
- Audio playback and preview
- Profile management UI
- History search and filters
- Error handling and validation
Week 4: Advanced Features
- Multi-reference combination
- Batch generation
- Audio normalization
- M3GAN effect
Week 5+: Studio Features
- Timeline editor
- Word-level timestamps
- Project system
- Export pipeline
Technical Decisions
Why Tauri over Electron?
- Smaller bundle size (Rust vs. Node.js)
- Better performance (native vs. V8)
- Lower memory usage
- Rust for system-level operations
Why FastAPI over Flask?
- Native async/await support
- Automatic OpenAPI schema generation
- Pydantic validation built-in
- Better performance
Why OpenAPI + React Query?
- Type safety end-to-end - FastAPI generates OpenAPI schema, we generate TypeScript client
- No manual API code - Client generated from
openapi.jsonusing openapi-typescript-codegen - Automatic caching - React Query handles request deduplication and background refetching
- Optimistic updates - Update UI immediately, rollback on error
- DevX - Full autocomplete and type checking for all API calls
Example workflow:
# Backend generates OpenAPI schema
python backend/main.py --openapi > openapi.json
# Frontend generates TypeScript client
bun run generate-client
# Use type-safe hooks in React
import { useQuery } from '@tanstack/react-query';
import { ProfilesService } from '@/lib/api';
const { data: profiles } = useQuery({
queryKey: ['profiles'],
queryFn: () => ProfilesService.listProfiles()
});
Why Bun over npm/yarn/pnpm?
- Speed - 20-30x faster than npm for install operations
- Drop-in replacement - Compatible with npm ecosystem, no migration needed
- Built-in tooling - Bundler, test runner, and package manager in one
- Performance - Faster script execution than Node.js
- Developer experience - Better error messages, workspaces support
Why SQLite over file-based storage?
- Full-text search
- Transactions and integrity
- Migrations via Alembic
- Easy to backup/restore
Why React over Vue/Svelte?
- Larger ecosystem
- Better TypeScript support
- Familiar to most developers
- Mature tooling
Why bundle Python server with PyInstaller?
- No Python installation required - Users don't need Python on their system
- Consistent environment - Exact dependencies bundled, no version conflicts
- Single-click install - One installer includes everything
- Tauri sidecar pattern - Rust spawns/manages Python process lifecycle
- Platform-specific binaries - PyInstaller creates native executables for each platform
Tradeoffs:
- Larger bundle size (~500MB with models vs ~50MB without backend)
- Need separate build for each platform (macOS Intel/ARM, Windows, Linux)
- First launch slower (model loading time)
Alternative considered: Require users to install Python and run pip install - rejected for poor UX
Why no Docker initially?
- Desktop app, not server deployment
- Users install locally
- Can add later for server mode
Performance Targets
- First generation: < 10 seconds (cold start)
- Cached generation: < 2 seconds (warm start)
- UI responsiveness: 60 FPS at all times
- Memory usage: < 4GB VRAM for small models
- Startup time: < 3 seconds to UI
- Database queries: < 100ms for history search
Quality Standards
- No files over 500 lines (except auto-generated)
- Type hints on all Python functions
- TypeScript strict mode enabled
- OpenAPI client auto-generated from schema
- ESLint + Prettier for frontend
- Black + isort for backend
- All user-facing errors have context
- No global mutable state
- React Query for all server state
Project Status
Current phase: Planning and analysis
Documentation:
- ANALYSIS.md - Comprehensive analysis of existing implementations
- TAURI_PLAN.md - Tauri app architecture and Python server bundling strategy
License
TBD
Credits
Built by analyzing and learning from:
- voice (Rust CLI)
- Voice-Clone-Studio
- Qwen3-TTS_server
- mimic
- qwen3-tts-enhanced
Powered by Alibaba's Qwen3-TTS model.