mirror of
https://github.com/jamiepine/voicebox.git
synced 2026-09-16 21:30:39 -07:00
Refactor documentation structure and dependencies for migration to Fumadocs
- Updated `.gitignore` to include new build and generated content directories. - Removed outdated Mintlify configuration files and documentation. - Introduced new `MIGRATION.md` to outline the transition from Mintlify to Fumadocs. - Added `mdx-components.tsx` for MDX component configuration and compatibility. - Updated `package.json` and `next.config.mjs` for new dependencies and Next.js configuration. - Created `source.config.ts` for content source configuration. - Added OpenAPI specification in `openapi.json` for API documentation. - Removed legacy files and adjusted project structure to align with Fumadocs conventions.
This commit is contained in:
+25
-2
@@ -1,3 +1,26 @@
|
|||||||
node_modules
|
# deps
|
||||||
.mintlify
|
/node_modules
|
||||||
|
|
||||||
|
# generated content
|
||||||
|
.source
|
||||||
|
|
||||||
|
# test & build
|
||||||
|
/coverage
|
||||||
|
/.next/
|
||||||
|
/out/
|
||||||
|
/build
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# misc
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
*.pem
|
||||||
|
/.pnp
|
||||||
|
.pnp.js
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# others
|
||||||
|
.env*.local
|
||||||
|
.vercel
|
||||||
|
next-env.d.ts
|
||||||
@@ -1,192 +0,0 @@
|
|||||||
# Auto-Updater Documentation
|
|
||||||
|
|
||||||
Voicebox includes automatic updates powered by Tauri's updater plugin. This document explains how it works for both users and developers.
|
|
||||||
|
|
||||||
## 1. Generate Signing Keys
|
|
||||||
|
|
||||||
Run this command to generate your signing keypair:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd tauri && bun tauri signer generate -w ~/.tauri/voicebox.key
|
|
||||||
```
|
|
||||||
|
|
||||||
This creates:
|
|
||||||
- **Private key**: `~/.tauri/voicebox.key` (keep this secret!)
|
|
||||||
- **Public key**: `~/.tauri/voicebox.key.pub`
|
|
||||||
|
|
||||||
## 2. Update Configuration
|
|
||||||
|
|
||||||
Copy the content from `~/.tauri/voicebox.key.pub` and replace the placeholder in `tauri/src-tauri/tauri.conf.json`:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"plugins": {
|
|
||||||
"updater": {
|
|
||||||
"pubkey": "PASTE_PUBLIC_KEY_CONTENT_HERE",
|
|
||||||
"endpoints": [
|
|
||||||
"https://github.com/YOUR_USERNAME/voicebox/releases/latest/download/latest.json"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Update the endpoint URL with your actual GitHub username/organization.
|
|
||||||
|
|
||||||
## 3. Building with Signatures
|
|
||||||
|
|
||||||
When building releases, set these environment variables:
|
|
||||||
|
|
||||||
**macOS/Linux:**
|
|
||||||
```bash
|
|
||||||
export TAURI_SIGNING_PRIVATE_KEY="$(cat ~/.tauri/voicebox.key)"
|
|
||||||
export TAURI_SIGNING_PRIVATE_KEY_PASSWORD=""
|
|
||||||
bun run build
|
|
||||||
```
|
|
||||||
|
|
||||||
**Windows PowerShell:**
|
|
||||||
```powershell
|
|
||||||
$env:TAURI_SIGNING_PRIVATE_KEY = Get-Content ~/.tauri/voicebox.key -Raw
|
|
||||||
$env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD = ""
|
|
||||||
bun run build
|
|
||||||
```
|
|
||||||
|
|
||||||
## 4. GitHub Release Setup
|
|
||||||
|
|
||||||
When you create a GitHub release, the build process will generate:
|
|
||||||
- Installers for each platform
|
|
||||||
- `.sig` signature files
|
|
||||||
- `latest.json` update manifest
|
|
||||||
|
|
||||||
### Manual Release Process
|
|
||||||
|
|
||||||
1. Build the app with signing keys set
|
|
||||||
2. Create a new GitHub release
|
|
||||||
3. Upload all files from `tauri/src-tauri/target/release/bundle/`
|
|
||||||
4. Create `latest.json` in your release assets:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"version": "0.2.0",
|
|
||||||
"notes": "Bug fixes and improvements",
|
|
||||||
"pub_date": "2026-01-25T12:00:00Z",
|
|
||||||
"platforms": {
|
|
||||||
"darwin-aarch64": {
|
|
||||||
"signature": "CONTENT_FROM_.app.tar.gz.sig",
|
|
||||||
"url": "https://github.com/YOUR_USERNAME/voicebox/releases/download/v0.2.0/voicebox_0.2.0_aarch64.dmg"
|
|
||||||
},
|
|
||||||
"darwin-x86_64": {
|
|
||||||
"signature": "CONTENT_FROM_.app.tar.gz.sig",
|
|
||||||
"url": "https://github.com/YOUR_USERNAME/voicebox/releases/download/v0.2.0/voicebox_0.2.0_x64.dmg"
|
|
||||||
},
|
|
||||||
"linux-x86_64": {
|
|
||||||
"signature": "CONTENT_FROM_.AppImage.sig",
|
|
||||||
"url": "https://github.com/YOUR_USERNAME/voicebox/releases/download/v0.2.0/voicebox_0.2.0_amd64.AppImage"
|
|
||||||
},
|
|
||||||
"windows-x86_64": {
|
|
||||||
"signature": "CONTENT_FROM_.msi.sig",
|
|
||||||
"url": "https://github.com/YOUR_USERNAME/voicebox/releases/download/v0.2.0/voicebox_0.2.0_x64_en-US.msi"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Automated GitHub Actions (Recommended)
|
|
||||||
|
|
||||||
Create `.github/workflows/release.yml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
name: Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'v*'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
platform: [macos-latest, ubuntu-22.04, windows-latest]
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.platform }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup Bun
|
|
||||||
uses: oven-sh/setup-bun@v1
|
|
||||||
|
|
||||||
- name: Install Rust
|
|
||||||
uses: dtolnay/rust-toolchain@stable
|
|
||||||
|
|
||||||
- name: Install dependencies (Ubuntu)
|
|
||||||
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
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: bun install
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
env:
|
|
||||||
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
|
||||||
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
|
|
||||||
run: bun run build
|
|
||||||
|
|
||||||
- name: Upload Release
|
|
||||||
uses: softprops/action-gh-release@v1
|
|
||||||
with:
|
|
||||||
files: tauri/src-tauri/target/release/bundle/**/*
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
```
|
|
||||||
|
|
||||||
Add your private key to GitHub secrets:
|
|
||||||
- Go to Settings → Secrets and variables → Actions
|
|
||||||
- Add `TAURI_SIGNING_PRIVATE_KEY` with the content of `~/.tauri/voicebox.key`
|
|
||||||
- Add `TAURI_SIGNING_PRIVATE_KEY_PASSWORD` (empty string if no password)
|
|
||||||
|
|
||||||
## Frontend Integration
|
|
||||||
|
|
||||||
The frontend integration is complete with automatic update notifications and manual update checks:
|
|
||||||
|
|
||||||
- **Update Notification Banner** - Appears automatically when updates are available
|
|
||||||
- **Settings Panel** - Manual "Check for Updates" button in Settings tab
|
|
||||||
- **Update Hook** - React hook handles all update operations
|
|
||||||
|
|
||||||
See `docs/AUTOUPDATER_QUICKSTART.md` for a quick setup guide.
|
|
||||||
|
|
||||||
## Security Notes
|
|
||||||
|
|
||||||
- Never commit your private key to version control
|
|
||||||
- Store private keys securely (use GitHub secrets for CI/CD)
|
|
||||||
- The public key in `tauri.conf.json` is safe to commit
|
|
||||||
- Updates are cryptographically verified before installation
|
|
||||||
- HTTP endpoints are blocked by default (HTTPS only)
|
|
||||||
|
|
||||||
## Testing Updates
|
|
||||||
|
|
||||||
1. Build version 0.1.0 and install it
|
|
||||||
2. Update version in `tauri.conf.json` to 0.2.0
|
|
||||||
3. Build version 0.2.0 with signatures
|
|
||||||
4. Create a local server or GitHub release with `latest.json`
|
|
||||||
5. Run version 0.1.0 and trigger update check
|
|
||||||
6. Verify update downloads and installs correctly
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
**"Invalid signature" error:**
|
|
||||||
- Verify public key matches the private key used to sign
|
|
||||||
- Ensure signature files (.sig) are uploaded correctly
|
|
||||||
|
|
||||||
**"No update available" when one exists:**
|
|
||||||
- Check endpoint URL is correct
|
|
||||||
- Verify `latest.json` format matches specification
|
|
||||||
- Ensure version in latest.json is higher than current version
|
|
||||||
|
|
||||||
**Build fails with signing:**
|
|
||||||
- Confirm environment variables are set correctly
|
|
||||||
- Check private key file exists and is readable
|
|
||||||
- Verify private key format (should start with `dW50cnVzdGVkIGNvbW1lbnQ6`)
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
# Autoupdater Quick Start
|
|
||||||
|
|
||||||
The Tauri v2 autoupdater has been fully configured and integrated. Follow these steps to activate it.
|
|
||||||
|
|
||||||
## What's Already Done
|
|
||||||
|
|
||||||
✅ Rust plugin installed and initialized
|
|
||||||
✅ Tauri configuration set up with updater settings
|
|
||||||
✅ Permissions granted for update operations
|
|
||||||
✅ GitHub Actions workflow updated with signing support
|
|
||||||
✅ Frontend components created and integrated
|
|
||||||
✅ Update notifications on app startup
|
|
||||||
✅ Manual update check in Settings tab
|
|
||||||
|
|
||||||
## Required Steps (5 minutes)
|
|
||||||
|
|
||||||
### 1. Generate Signing Keys
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bun run generate:keys
|
|
||||||
```
|
|
||||||
|
|
||||||
This creates:
|
|
||||||
- Private key: `~/.tauri/voicebox.key` (keep secret!)
|
|
||||||
- Public key: `~/.tauri/voicebox.key.pub` (safe to share)
|
|
||||||
|
|
||||||
### 2. Update Tauri Config
|
|
||||||
|
|
||||||
Open `tauri/src-tauri/tauri.conf.json` and:
|
|
||||||
|
|
||||||
1. Replace `"REPLACE_WITH_YOUR_PUBLIC_KEY"` with the content from `~/.tauri/voicebox.key.pub`
|
|
||||||
2. Update the endpoint URL with your GitHub username:
|
|
||||||
```json
|
|
||||||
"endpoints": [
|
|
||||||
"https://github.com/YOUR_USERNAME/voicebox/releases/latest/download/latest.json"
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Add GitHub Secrets
|
|
||||||
|
|
||||||
Go to your repo Settings → Secrets and variables → Actions:
|
|
||||||
|
|
||||||
1. Add `TAURI_SIGNING_PRIVATE_KEY`:
|
|
||||||
```bash
|
|
||||||
cat ~/.tauri/voicebox.key
|
|
||||||
```
|
|
||||||
Copy the entire output and paste as the secret value
|
|
||||||
|
|
||||||
2. Add `TAURI_SIGNING_PRIVATE_KEY_PASSWORD`:
|
|
||||||
Leave empty (or add your password if you set one)
|
|
||||||
|
|
||||||
### 4. Test the Setup
|
|
||||||
|
|
||||||
To test locally before creating a release:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bun run build:release
|
|
||||||
```
|
|
||||||
|
|
||||||
This will verify your keys are set up correctly.
|
|
||||||
|
|
||||||
## How It Works
|
|
||||||
|
|
||||||
### For Users
|
|
||||||
1. App checks for updates on startup (only in Tauri builds)
|
|
||||||
2. If an update is available, a banner appears at the top
|
|
||||||
3. Users can click "Install Now" to download and install
|
|
||||||
4. App restarts automatically after installation
|
|
||||||
|
|
||||||
### For Developers
|
|
||||||
1. Create a new git tag: `git tag v0.2.0 && git push --tags`
|
|
||||||
2. GitHub Actions builds signed releases for all platforms
|
|
||||||
3. Uploads installers and generates `latest.json` manifest
|
|
||||||
4. Users running older versions will be notified automatically
|
|
||||||
|
|
||||||
## UI Components
|
|
||||||
|
|
||||||
### Update Notification Banner
|
|
||||||
- Shows at top of app when update is available
|
|
||||||
- Appears automatically on startup
|
|
||||||
- Displays download/install progress
|
|
||||||
|
|
||||||
### Settings Panel
|
|
||||||
- Located in Settings tab
|
|
||||||
- Shows current version
|
|
||||||
- Manual "Check for Updates" button
|
|
||||||
- Update status and progress
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
**"Public key not configured"**
|
|
||||||
- Make sure you copied the entire content from `voicebox.key.pub`
|
|
||||||
- The key should start with `dW50cnVzdGVkIGNvbW1lbnQ6`
|
|
||||||
|
|
||||||
**"Failed to check for updates"**
|
|
||||||
- Endpoint URL might be incorrect
|
|
||||||
- No releases published yet (expected for first setup)
|
|
||||||
|
|
||||||
**Build fails with signing error**
|
|
||||||
- Check that GitHub secrets are set correctly
|
|
||||||
- Verify private key file exists at `~/.tauri/voicebox.key`
|
|
||||||
|
|
||||||
## Next Release Workflow
|
|
||||||
|
|
||||||
1. Update version in `tauri/src-tauri/tauri.conf.json`
|
|
||||||
2. Commit changes
|
|
||||||
3. Create and push tag: `git tag v0.2.0 && git push --tags`
|
|
||||||
4. GitHub Actions will automatically build and create a draft release
|
|
||||||
5. Review the release and publish it
|
|
||||||
6. Users will be notified of the update
|
|
||||||
|
|
||||||
## See Also
|
|
||||||
|
|
||||||
- Full documentation: `docs/AUTOUPDATER.md`
|
|
||||||
- Build script: `scripts/prepare-release.sh`
|
|
||||||
- GitHub workflow: `.github/workflows/release.yml`
|
|
||||||
+29
-48
@@ -1,64 +1,45 @@
|
|||||||
# Voicebox Documentation
|
# fumadocs-ui-template
|
||||||
|
|
||||||
This directory contains the documentation for Voicebox, built with [Mintlify](https://mintlify.com).
|
This is a Next.js application generated with
|
||||||
|
[Create Fumadocs](https://github.com/fuma-nama/fumadocs).
|
||||||
|
|
||||||
## Development
|
Run development server:
|
||||||
|
|
||||||
### Prerequisites
|
|
||||||
|
|
||||||
Install Mintlify globally using bun:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bun add -g mintlify
|
npm run dev
|
||||||
|
# or
|
||||||
|
pnpm dev
|
||||||
|
# or
|
||||||
|
yarn dev
|
||||||
```
|
```
|
||||||
|
|
||||||
Or use the helper script:
|
Open http://localhost:3000 with your browser to see the result.
|
||||||
|
|
||||||
```bash
|
## Explore
|
||||||
bun run install:mintlify
|
|
||||||
```
|
|
||||||
|
|
||||||
### Running Locally
|
In the project, you can see:
|
||||||
|
|
||||||
```bash
|
- `lib/source.ts`: Code for content source adapter, [`loader()`](https://fumadocs.dev/docs/headless/source-api) provides the interface to access your content.
|
||||||
bun run dev
|
- `lib/layout.shared.tsx`: Shared options for layouts, optional but preferred to keep.
|
||||||
```
|
|
||||||
|
|
||||||
This will start the Mintlify dev server.
|
| Route | Description |
|
||||||
|
| ------------------------- | ------------------------------------------------------ |
|
||||||
|
| `app/(home)` | The route group for your landing page and other pages. |
|
||||||
|
| `app/docs` | The documentation layout and pages. |
|
||||||
|
| `app/api/search/route.ts` | The Route Handler for search. |
|
||||||
|
|
||||||
The docs will be available at `http://localhost:3000`
|
### Fumadocs MDX
|
||||||
|
|
||||||
### Structure
|
A `source.config.ts` config file has been included, you can customise different options like frontmatter schema.
|
||||||
|
|
||||||
```
|
Read the [Introduction](https://fumadocs.dev/docs/mdx) for further details.
|
||||||
docs/
|
|
||||||
├── mint.json # Mintlify configuration
|
|
||||||
├── custom.css # Custom styles
|
|
||||||
├── overview/ # Getting started & feature docs
|
|
||||||
├── guides/ # User guides
|
|
||||||
├── api/ # API reference
|
|
||||||
├── development/ # Developer documentation
|
|
||||||
├── logo/ # Logo assets
|
|
||||||
└── public/ # Static assets
|
|
||||||
```
|
|
||||||
|
|
||||||
### Writing Docs
|
## Learn More
|
||||||
|
|
||||||
- Use `.mdx` files for all documentation pages
|
To learn more about Next.js and Fumadocs, take a look at the following
|
||||||
- Follow the existing structure in `mint.json` for navigation
|
resources:
|
||||||
- Use Mintlify components for enhanced formatting (Card, CardGroup, Accordion, etc.)
|
|
||||||
- Reference the [Mintlify documentation](https://mintlify.com/docs) for available components
|
|
||||||
|
|
||||||
## Deployment
|
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js
|
||||||
|
features and API.
|
||||||
Docs are automatically deployed when changes are pushed to the main branch.
|
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
||||||
|
- [Fumadocs](https://fumadocs.dev) - learn about Fumadocs
|
||||||
To manually deploy:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
mintlify deploy
|
|
||||||
```
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
See [CONTRIBUTING.md](../CONTRIBUTING.md) for contribution guidelines.
|
|
||||||
|
|||||||
@@ -1,308 +0,0 @@
|
|||||||
# Troubleshooting Guide
|
|
||||||
|
|
||||||
Common issues and solutions for Voicebox.
|
|
||||||
|
|
||||||
## Installation Issues
|
|
||||||
|
|
||||||
### macOS: "Voicebox cannot be opened because it is from an unidentified developer"
|
|
||||||
|
|
||||||
**Solution:**
|
|
||||||
1. Right-click the `.dmg` file
|
|
||||||
2. Select "Open"
|
|
||||||
3. Click "Open" in the security dialog
|
|
||||||
4. Alternatively, go to System Settings → Privacy & Security → Allow Voicebox
|
|
||||||
|
|
||||||
### Windows: "Windows protected your PC"
|
|
||||||
|
|
||||||
**Solution:**
|
|
||||||
1. Click "More info"
|
|
||||||
2. Click "Run anyway"
|
|
||||||
3. Windows Defender may flag new software; this is normal for unsigned apps
|
|
||||||
|
|
||||||
### Linux: AppImage won't run
|
|
||||||
|
|
||||||
**Solution:**
|
|
||||||
```bash
|
|
||||||
chmod +x voicebox-*.AppImage
|
|
||||||
./voicebox-*.AppImage
|
|
||||||
```
|
|
||||||
|
|
||||||
## Runtime Issues
|
|
||||||
|
|
||||||
### Server won't start
|
|
||||||
|
|
||||||
**Symptoms:** App opens but shows "Server not connected"
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Check Python installation**
|
|
||||||
```bash
|
|
||||||
python --version # Should be 3.11+
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Check server binary exists**
|
|
||||||
- Look in `tauri/src-tauri/binaries/` for your platform
|
|
||||||
- Binary should match your system architecture
|
|
||||||
|
|
||||||
3. **Check permissions**
|
|
||||||
```bash
|
|
||||||
# macOS/Linux
|
|
||||||
chmod +x tauri/src-tauri/binaries/voicebox-server-*
|
|
||||||
```
|
|
||||||
|
|
||||||
4. **Check logs**
|
|
||||||
- macOS: Open Console.app and search for "voicebox"
|
|
||||||
- Linux: Check `~/.local/share/voicebox/` for logs
|
|
||||||
- Windows: Check Event Viewer
|
|
||||||
|
|
||||||
### "Model download failed"
|
|
||||||
|
|
||||||
**Symptoms:** First generation fails with download error
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Check internet connection**
|
|
||||||
- Models download from HuggingFace Hub (~2-4GB)
|
|
||||||
- First download may take several minutes
|
|
||||||
|
|
||||||
2. **Check disk space**
|
|
||||||
- Models are cached in `~/.cache/huggingface/`
|
|
||||||
- Ensure at least 5GB free space
|
|
||||||
|
|
||||||
3. **Manual download** (if automatic fails)
|
|
||||||
```bash
|
|
||||||
pip install huggingface_hub
|
|
||||||
huggingface-cli download Qwen/Qwen3-TTS-12Hz-1.7B-Base
|
|
||||||
```
|
|
||||||
|
|
||||||
### "Out of memory" errors
|
|
||||||
|
|
||||||
**Symptoms:** Generation fails with CUDA/VRAM errors
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Use smaller model**
|
|
||||||
- Switch to 0.6B model instead of 1.7B
|
|
||||||
- Settings → Model Management → Load 0.6B
|
|
||||||
|
|
||||||
2. **Close other applications**
|
|
||||||
- Free up GPU memory
|
|
||||||
- Close browser tabs, other ML apps
|
|
||||||
|
|
||||||
3. **Use CPU mode**
|
|
||||||
- Slower but works without GPU
|
|
||||||
- Backend automatically falls back to CPU
|
|
||||||
|
|
||||||
### MLX "Failed to load the default metallib" error (Apple Silicon)
|
|
||||||
|
|
||||||
**Symptoms:** Generation fails with "library not found" or "metallib" errors
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Rebuild server binary**
|
|
||||||
```bash
|
|
||||||
bun run build:server
|
|
||||||
```
|
|
||||||
The build script should automatically include MLX Metal shader libraries.
|
|
||||||
|
|
||||||
2. **Check MLX installation**
|
|
||||||
```bash
|
|
||||||
pip install -r backend/requirements-mlx.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Verify backend detection**
|
|
||||||
- Check server logs for "Backend: MLX"
|
|
||||||
- If showing "Backend: PYTORCH", MLX may not be installed correctly
|
|
||||||
|
|
||||||
### Audio playback issues
|
|
||||||
|
|
||||||
**Symptoms:** Generated audio won't play
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Check audio format**
|
|
||||||
- Audio is saved as WAV files
|
|
||||||
- Ensure your system supports WAV playback
|
|
||||||
|
|
||||||
2. **Try downloading audio**
|
|
||||||
- Right-click → Download
|
|
||||||
- Play in external player
|
|
||||||
|
|
||||||
3. **Check browser permissions** (web version)
|
|
||||||
- Allow audio autoplay in browser settings
|
|
||||||
|
|
||||||
### Slow generation
|
|
||||||
|
|
||||||
**Symptoms:** Generation takes >30 seconds
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Check backend type** (Apple Silicon)
|
|
||||||
- Check Settings → Server Status
|
|
||||||
- Should show "Backend: MLX" on Apple Silicon
|
|
||||||
- If showing "Backend: PYTORCH", install MLX: `pip install -r backend/requirements-mlx.txt`
|
|
||||||
- MLX provides 4-5x faster inference on Apple Silicon
|
|
||||||
|
|
||||||
2. **Use GPU** (if available)
|
|
||||||
- Check Settings → Server Status
|
|
||||||
- Should show "GPU available: true"
|
|
||||||
- Apple Silicon: Should show "Metal (Apple Silicon via MLX)"
|
|
||||||
- Windows/Linux: Should show "CUDA" if GPU available
|
|
||||||
|
|
||||||
3. **Enable caching**
|
|
||||||
- Voice prompts are cached automatically
|
|
||||||
- Second generation with same voice should be faster
|
|
||||||
|
|
||||||
4. **Use smaller model**
|
|
||||||
- 0.6B model is faster than 1.7B
|
|
||||||
- Quality difference is minimal for most voices
|
|
||||||
|
|
||||||
5. **Check system resources**
|
|
||||||
- Close other CPU/GPU intensive apps
|
|
||||||
- Ensure adequate RAM (8GB+ recommended)
|
|
||||||
|
|
||||||
## API Issues
|
|
||||||
|
|
||||||
### "Connection refused" when using API
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Check server is running**
|
|
||||||
```bash
|
|
||||||
curl http://localhost:8000/health
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Check remote mode**
|
|
||||||
- If connecting remotely, ensure server is started with `--host 0.0.0.0`
|
|
||||||
- Check firewall settings
|
|
||||||
|
|
||||||
3. **Check port availability**
|
|
||||||
- Default port is 8000
|
|
||||||
- Ensure no other service is using it
|
|
||||||
|
|
||||||
### CORS errors in browser
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Use desktop app** (recommended)
|
|
||||||
- Desktop app doesn't have CORS restrictions
|
|
||||||
|
|
||||||
2. **Configure CORS** (for web deployment)
|
|
||||||
- Update `backend/main.py` CORS settings
|
|
||||||
- Add your domain to allowed origins
|
|
||||||
|
|
||||||
## Update Issues
|
|
||||||
|
|
||||||
### "Update check failed"
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Check internet connection**
|
|
||||||
- Updates are fetched from GitHub releases
|
|
||||||
|
|
||||||
2. **Check GitHub access**
|
|
||||||
- Ensure `github.com` is accessible
|
|
||||||
- Check firewall/proxy settings
|
|
||||||
|
|
||||||
3. **Manual update**
|
|
||||||
- Download latest release from GitHub
|
|
||||||
- Install manually
|
|
||||||
|
|
||||||
### "Invalid signature" error
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Re-download installer**
|
|
||||||
- Signature may be corrupted
|
|
||||||
- Download fresh copy from GitHub
|
|
||||||
|
|
||||||
2. **Check release integrity**
|
|
||||||
- Verify `.sig` file matches installer
|
|
||||||
- Report issue if signature is invalid
|
|
||||||
|
|
||||||
## Data Issues
|
|
||||||
|
|
||||||
### Profiles disappeared
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Check data directory**
|
|
||||||
- macOS: `~/Library/Application Support/voicebox/`
|
|
||||||
- Windows: `%APPDATA%/voicebox/`
|
|
||||||
- Linux: `~/.local/share/voicebox/`
|
|
||||||
|
|
||||||
2. **Check database**
|
|
||||||
- Database: `data/voicebox.db`
|
|
||||||
- Ensure file exists and is readable
|
|
||||||
|
|
||||||
3. **Restore from backup**
|
|
||||||
- Profiles can be exported/imported
|
|
||||||
- Check for backup files
|
|
||||||
|
|
||||||
### "Database locked" error
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Close other instances**
|
|
||||||
- Ensure only one Voicebox instance is running
|
|
||||||
|
|
||||||
2. **Restart app**
|
|
||||||
- Close and reopen Voicebox
|
|
||||||
|
|
||||||
3. **Check file permissions**
|
|
||||||
- Ensure database file is writable
|
|
||||||
- Check directory permissions
|
|
||||||
|
|
||||||
## Development Issues
|
|
||||||
|
|
||||||
### Build fails
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Check Rust installation**
|
|
||||||
```bash
|
|
||||||
rustc --version
|
|
||||||
rustup update
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Check Tauri dependencies**
|
|
||||||
```bash
|
|
||||||
cd tauri
|
|
||||||
bun install
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Clean build**
|
|
||||||
```bash
|
|
||||||
cd tauri/src-tauri
|
|
||||||
cargo clean
|
|
||||||
cd ../..
|
|
||||||
bun run build
|
|
||||||
```
|
|
||||||
|
|
||||||
### API client generation fails
|
|
||||||
|
|
||||||
**Solutions:**
|
|
||||||
1. **Start backend server**
|
|
||||||
```bash
|
|
||||||
bun run dev:server
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Check OpenAPI endpoint**
|
|
||||||
```bash
|
|
||||||
curl http://localhost:8000/openapi.json
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Regenerate client**
|
|
||||||
```bash
|
|
||||||
bun run generate:api
|
|
||||||
```
|
|
||||||
|
|
||||||
## Still Having Issues?
|
|
||||||
|
|
||||||
1. **Check existing issues**
|
|
||||||
- Search GitHub issues for similar problems
|
|
||||||
- Check closed issues for solutions
|
|
||||||
|
|
||||||
2. **Create new issue**
|
|
||||||
- Include:
|
|
||||||
- OS and version
|
|
||||||
- Voicebox version
|
|
||||||
- Steps to reproduce
|
|
||||||
- Error messages/logs
|
|
||||||
- Screenshots (if applicable)
|
|
||||||
|
|
||||||
3. **Get help**
|
|
||||||
- Check documentation in `docs/`
|
|
||||||
- Review `backend/README.md` for API details
|
|
||||||
- See `CONTRIBUTING.md` for development help
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
For more help, open an issue on [GitHub](https://github.com/jamiepine/voicebox/issues).
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Authentication"
|
|
||||||
description: "API authentication and security"
|
|
||||||
---
|
|
||||||
|
|
||||||
## Current Status
|
|
||||||
|
|
||||||
<Warning>
|
|
||||||
Authentication is not currently implemented in Voicebox. The API is intended for local use only.
|
|
||||||
</Warning>
|
|
||||||
|
|
||||||
## Local Usage
|
|
||||||
|
|
||||||
For local development and usage:
|
|
||||||
- API runs on `localhost:17493`
|
|
||||||
- No authentication required
|
|
||||||
- Access restricted to local machine
|
|
||||||
|
|
||||||
## Future Implementation
|
|
||||||
|
|
||||||
Authentication will be added in a future release for:
|
|
||||||
- Remote deployments
|
|
||||||
- Multi-user access
|
|
||||||
- Production environments
|
|
||||||
|
|
||||||
Planned authentication methods:
|
|
||||||
- API keys
|
|
||||||
- OAuth 2.0
|
|
||||||
- JWT tokens
|
|
||||||
|
|
||||||
## Security Best Practices
|
|
||||||
|
|
||||||
Until authentication is implemented:
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Use VPN" icon="shield">
|
|
||||||
Use WireGuard or Tailscale for remote access
|
|
||||||
</Card>
|
|
||||||
<Card title="Reverse Proxy" icon="server">
|
|
||||||
Run behind nginx with basic auth
|
|
||||||
</Card>
|
|
||||||
<Card title="Firewall" icon="fire">
|
|
||||||
Restrict access to trusted IPs only
|
|
||||||
</Card>
|
|
||||||
<Card title="Local Only" icon="laptop">
|
|
||||||
Don't expose to public internet
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
## Coming Soon
|
|
||||||
|
|
||||||
- API key management
|
|
||||||
- User accounts
|
|
||||||
- Rate limiting
|
|
||||||
- Access control
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Generation API"
|
|
||||||
description: "Generate speech from text"
|
|
||||||
---
|
|
||||||
|
|
||||||
## Generate Speech
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /generate
|
|
||||||
```
|
|
||||||
|
|
||||||
**Request:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"text": "Hello world",
|
|
||||||
"profile_id": "abc123",
|
|
||||||
"language": "en"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"id": "gen123",
|
|
||||||
"text": "Hello world",
|
|
||||||
"profile_id": "abc123",
|
|
||||||
"language": "en",
|
|
||||||
"audio_url": "/audio/gen123.wav",
|
|
||||||
"duration": 2.3,
|
|
||||||
"created_at": "2024-01-29T12:00:00Z"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## List History
|
|
||||||
|
|
||||||
```http
|
|
||||||
GET /history
|
|
||||||
```
|
|
||||||
|
|
||||||
**Query Parameters:**
|
|
||||||
- `profile_id` (optional) - Filter by voice profile
|
|
||||||
- `limit` (optional) - Number of results (default: 50)
|
|
||||||
- `offset` (optional) - Pagination offset
|
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"generations": [
|
|
||||||
{
|
|
||||||
"id": "gen123",
|
|
||||||
"text": "Hello world",
|
|
||||||
"profile_id": "abc123",
|
|
||||||
"duration": 2.3,
|
|
||||||
"created_at": "2024-01-29T12:00:00Z"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"total": 100
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Get Generation
|
|
||||||
|
|
||||||
```http
|
|
||||||
GET /history/{id}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"id": "gen123",
|
|
||||||
"text": "Hello world",
|
|
||||||
"profile_id": "abc123",
|
|
||||||
"language": "en",
|
|
||||||
"audio_url": "/audio/gen123.wav",
|
|
||||||
"duration": 2.3,
|
|
||||||
"created_at": "2024-01-29T12:00:00Z"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Delete Generation
|
|
||||||
|
|
||||||
```http
|
|
||||||
DELETE /history/{id}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"success": true
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## TypeScript Example
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { VoiceboxClient } from '@/lib/api'
|
|
||||||
|
|
||||||
const client = new VoiceboxClient({
|
|
||||||
baseUrl: 'http://localhost:17493'
|
|
||||||
})
|
|
||||||
|
|
||||||
// Generate speech
|
|
||||||
const generation = await client.generate({
|
|
||||||
text: 'Hello world',
|
|
||||||
profile_id: 'abc123',
|
|
||||||
language: 'en'
|
|
||||||
})
|
|
||||||
|
|
||||||
// Get audio URL
|
|
||||||
const audioUrl = generation.audio_url
|
|
||||||
|
|
||||||
// List history
|
|
||||||
const history = await client.listHistory({
|
|
||||||
profile_id: 'abc123',
|
|
||||||
limit: 20
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
For full API documentation, visit `http://localhost:17493/docs` when the server is running.
|
|
||||||
@@ -1,219 +0,0 @@
|
|||||||
---
|
|
||||||
title: "API Overview"
|
|
||||||
description: "Integrate voice synthesis into your applications with the Voicebox REST API"
|
|
||||||
---
|
|
||||||
|
|
||||||
## Introduction
|
|
||||||
|
|
||||||
Voicebox exposes a full REST API that allows you to integrate voice synthesis into your own applications. The API runs on `http://localhost:17493` by default.
|
|
||||||
|
|
||||||
<Card title="Interactive API Docs" icon="book" href="http://localhost:17493/docs">
|
|
||||||
When Voicebox is running, visit the auto-generated API documentation at `http://localhost:17493/docs`
|
|
||||||
</Card>
|
|
||||||
|
|
||||||
## Base URL
|
|
||||||
|
|
||||||
```
|
|
||||||
http://localhost:17493
|
|
||||||
```
|
|
||||||
|
|
||||||
For remote deployments, replace `localhost` with your server's IP or hostname.
|
|
||||||
|
|
||||||
## Authentication
|
|
||||||
|
|
||||||
<Note>
|
|
||||||
Currently, the API does not require authentication for local development. Authentication will be added in a future release for production deployments.
|
|
||||||
</Note>
|
|
||||||
|
|
||||||
## Quick Example
|
|
||||||
|
|
||||||
Here's a simple example of generating speech:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Generate speech
|
|
||||||
curl -X POST http://localhost:17493/generate \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{
|
|
||||||
"text": "Hello world",
|
|
||||||
"profile_id": "abc123",
|
|
||||||
"language": "en"
|
|
||||||
}'
|
|
||||||
```
|
|
||||||
|
|
||||||
## API Endpoints
|
|
||||||
|
|
||||||
The Voicebox API is organized into several categories:
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Voice Profiles" icon="user" href="/api/voice-profiles">
|
|
||||||
Create, list, update, and delete voice profiles
|
|
||||||
</Card>
|
|
||||||
<Card title="Generation" icon="waveform" href="/api/generation">
|
|
||||||
Generate speech from text using voice profiles
|
|
||||||
</Card>
|
|
||||||
<Card title="Recordings" icon="microphone" href="/api/recordings">
|
|
||||||
Record and transcribe audio
|
|
||||||
</Card>
|
|
||||||
<Card title="Stories" icon="film">
|
|
||||||
Create and manage multi-voice stories (coming soon)
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
## Core Endpoints
|
|
||||||
|
|
||||||
### Voice Profiles
|
|
||||||
|
|
||||||
```http
|
|
||||||
GET /profiles # List all profiles
|
|
||||||
POST /profiles # Create a new profile
|
|
||||||
GET /profiles/{id} # Get profile details
|
|
||||||
PUT /profiles/{id} # Update a profile
|
|
||||||
DELETE /profiles/{id} # Delete a profile
|
|
||||||
POST /profiles/{id}/samples # Add voice sample
|
|
||||||
```
|
|
||||||
|
|
||||||
### Generation
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /generate # Generate speech
|
|
||||||
GET /history # List generation history
|
|
||||||
GET /history/{id} # Get generation details
|
|
||||||
DELETE /history/{id} # Delete from history
|
|
||||||
```
|
|
||||||
|
|
||||||
### Recordings
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /recordings # Start recording
|
|
||||||
POST /recordings/stop # Stop recording
|
|
||||||
POST /transcribe # Transcribe audio
|
|
||||||
```
|
|
||||||
|
|
||||||
## Response Format
|
|
||||||
|
|
||||||
All API responses follow a consistent JSON format:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"success": true,
|
|
||||||
"data": {
|
|
||||||
// Response data
|
|
||||||
},
|
|
||||||
"error": null
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Error responses:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"success": false,
|
|
||||||
"data": null,
|
|
||||||
"error": {
|
|
||||||
"message": "Error description",
|
|
||||||
"code": "ERROR_CODE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Data Models
|
|
||||||
|
|
||||||
### Voice Profile
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"id": "abc123",
|
|
||||||
"name": "John Smith",
|
|
||||||
"language": "en",
|
|
||||||
"description": "Professional narrator voice",
|
|
||||||
"created_at": "2024-01-29T12:00:00Z",
|
|
||||||
"samples": [
|
|
||||||
{
|
|
||||||
"id": "sample123",
|
|
||||||
"audio_path": "/path/to/sample.wav",
|
|
||||||
"duration": 15.5
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Generation
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"id": "gen123",
|
|
||||||
"text": "Hello world",
|
|
||||||
"profile_id": "abc123",
|
|
||||||
"language": "en",
|
|
||||||
"audio_path": "/path/to/output.wav",
|
|
||||||
"duration": 2.3,
|
|
||||||
"created_at": "2024-01-29T12:00:00Z"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## TypeScript Client
|
|
||||||
|
|
||||||
Voicebox provides an auto-generated TypeScript client with full type safety:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { VoiceboxClient } from '@/lib/api'
|
|
||||||
|
|
||||||
const client = new VoiceboxClient({
|
|
||||||
baseUrl: 'http://localhost:17493'
|
|
||||||
})
|
|
||||||
|
|
||||||
// Create a profile
|
|
||||||
const profile = await client.createProfile({
|
|
||||||
name: 'John Smith',
|
|
||||||
language: 'en'
|
|
||||||
})
|
|
||||||
|
|
||||||
// Generate speech
|
|
||||||
const generation = await client.generate({
|
|
||||||
text: 'Hello world',
|
|
||||||
profile_id: profile.id,
|
|
||||||
language: 'en'
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
The client is automatically generated from the OpenAPI schema. See [Development Setup](/development/setup#generate-openapi-client) for details.
|
|
||||||
|
|
||||||
## Rate Limiting
|
|
||||||
|
|
||||||
<Info>
|
|
||||||
Currently, there are no rate limits for local usage. Rate limiting will be added in a future release for production deployments.
|
|
||||||
</Info>
|
|
||||||
|
|
||||||
## WebSocket Support
|
|
||||||
|
|
||||||
<Note>
|
|
||||||
Real-time streaming generation via WebSockets is planned for a future release.
|
|
||||||
</Note>
|
|
||||||
|
|
||||||
## Use Cases
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Game Development" icon="gamepad">
|
|
||||||
Generate dynamic dialogue for NPCs and characters
|
|
||||||
</Card>
|
|
||||||
<Card title="Content Creation" icon="video">
|
|
||||||
Automate voiceovers for videos and podcasts
|
|
||||||
</Card>
|
|
||||||
<Card title="Accessibility" icon="universal-access">
|
|
||||||
Build text-to-speech tools for visually impaired users
|
|
||||||
</Card>
|
|
||||||
<Card title="Voice Assistants" icon="robot">
|
|
||||||
Create custom voice interfaces
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
## Next Steps
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Voice Profiles API" icon="user" href="/api/voice-profiles">
|
|
||||||
Learn how to manage voice profiles
|
|
||||||
</Card>
|
|
||||||
<Card title="Generation API" icon="waveform" href="/api/generation">
|
|
||||||
Generate speech from text
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Recordings API"
|
|
||||||
description: "Record and transcribe audio"
|
|
||||||
---
|
|
||||||
|
|
||||||
## Start Recording
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /recordings/start
|
|
||||||
```
|
|
||||||
|
|
||||||
**Request:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"source": "microphone"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"recording_id": "rec123",
|
|
||||||
"status": "recording"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Stop Recording
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /recordings/stop
|
|
||||||
```
|
|
||||||
|
|
||||||
**Request:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"recording_id": "rec123"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"recording_id": "rec123",
|
|
||||||
"audio_url": "/audio/rec123.wav",
|
|
||||||
"duration": 15.5
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Transcribe Audio
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /transcribe
|
|
||||||
```
|
|
||||||
|
|
||||||
**Request:** (multipart/form-data)
|
|
||||||
```
|
|
||||||
audio: <file>
|
|
||||||
language: "en" (optional)
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"text": "Transcribed speech text here",
|
|
||||||
"language": "en",
|
|
||||||
"duration": 15.5,
|
|
||||||
"confidence": 0.95
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## TypeScript Example
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { VoiceboxClient } from '@/lib/api'
|
|
||||||
|
|
||||||
const client = new VoiceboxClient({
|
|
||||||
baseUrl: 'http://localhost:17493'
|
|
||||||
})
|
|
||||||
|
|
||||||
// Start recording
|
|
||||||
const recording = await client.startRecording({
|
|
||||||
source: 'microphone'
|
|
||||||
})
|
|
||||||
|
|
||||||
// ... record audio ...
|
|
||||||
|
|
||||||
// Stop recording
|
|
||||||
const result = await client.stopRecording(recording.id)
|
|
||||||
|
|
||||||
// Transcribe
|
|
||||||
const transcription = await client.transcribe(audioFile, 'en')
|
|
||||||
console.log(transcription.text)
|
|
||||||
```
|
|
||||||
|
|
||||||
For full API documentation, visit `http://localhost:17493/docs` when the server is running.
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Voice Profiles API"
|
|
||||||
description: "Manage voice profiles programmatically"
|
|
||||||
---
|
|
||||||
|
|
||||||
## Endpoints
|
|
||||||
|
|
||||||
### List Profiles
|
|
||||||
|
|
||||||
```http
|
|
||||||
GET /profiles
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"profiles": [
|
|
||||||
{
|
|
||||||
"id": "abc123",
|
|
||||||
"name": "John Smith",
|
|
||||||
"language": "en",
|
|
||||||
"description": "Professional narrator",
|
|
||||||
"created_at": "2024-01-29T12:00:00Z",
|
|
||||||
"sample_count": 2
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Get Profile
|
|
||||||
|
|
||||||
```http
|
|
||||||
GET /profiles/{id}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"id": "abc123",
|
|
||||||
"name": "John Smith",
|
|
||||||
"language": "en",
|
|
||||||
"description": "Professional narrator",
|
|
||||||
"created_at": "2024-01-29T12:00:00Z",
|
|
||||||
"samples": [
|
|
||||||
{
|
|
||||||
"id": "sample123",
|
|
||||||
"duration": 15.5,
|
|
||||||
"created_at": "2024-01-29T12:00:00Z"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Create Profile
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /profiles
|
|
||||||
```
|
|
||||||
|
|
||||||
**Request:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"name": "John Smith",
|
|
||||||
"language": "en",
|
|
||||||
"description": "Professional narrator"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"id": "abc123",
|
|
||||||
"name": "John Smith",
|
|
||||||
"language": "en",
|
|
||||||
"description": "Professional narrator",
|
|
||||||
"created_at": "2024-01-29T12:00:00Z"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Update Profile
|
|
||||||
|
|
||||||
```http
|
|
||||||
PUT /profiles/{id}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Request:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"name": "Updated Name",
|
|
||||||
"description": "Updated description"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Delete Profile
|
|
||||||
|
|
||||||
```http
|
|
||||||
DELETE /profiles/{id}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"success": true
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Add Voice Sample
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /profiles/{id}/samples
|
|
||||||
```
|
|
||||||
|
|
||||||
**Request:** (multipart/form-data)
|
|
||||||
```
|
|
||||||
audio: <file>
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"sample_id": "sample123",
|
|
||||||
"duration": 15.5
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## TypeScript Example
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { VoiceboxClient } from '@/lib/api'
|
|
||||||
|
|
||||||
const client = new VoiceboxClient({
|
|
||||||
baseUrl: 'http://localhost:17493'
|
|
||||||
})
|
|
||||||
|
|
||||||
// Create profile
|
|
||||||
const profile = await client.createProfile({
|
|
||||||
name: 'John Smith',
|
|
||||||
language: 'en',
|
|
||||||
description: 'Professional narrator'
|
|
||||||
})
|
|
||||||
|
|
||||||
// Add sample
|
|
||||||
await client.addSample(profile.id, audioFile)
|
|
||||||
|
|
||||||
// List all profiles
|
|
||||||
const profiles = await client.listProfiles()
|
|
||||||
```
|
|
||||||
|
|
||||||
For full API documentation, visit `http://localhost:17493/docs` when the server is running.
|
|
||||||
+276
-1278
File diff suppressed because it is too large
Load Diff
@@ -1,15 +0,0 @@
|
|||||||
/* Anchor hover styles */
|
|
||||||
.nav-anchor:hover {
|
|
||||||
@apply text-[#BF9E40];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Icon wrapper on hover */
|
|
||||||
.nav-anchor:hover div {
|
|
||||||
background: #BF9E40 !important;
|
|
||||||
filter: brightness(1) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Icon SVG on hover */
|
|
||||||
.nav-anchor:hover svg {
|
|
||||||
@apply bg-white !important;
|
|
||||||
}
|
|
||||||
@@ -1,326 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Contributing"
|
|
||||||
description: "How to contribute to Voicebox"
|
|
||||||
---
|
|
||||||
|
|
||||||
Thank you for your interest in contributing to Voicebox! This guide will help you get started.
|
|
||||||
|
|
||||||
## Code of Conduct
|
|
||||||
|
|
||||||
- Be respectful and inclusive
|
|
||||||
- Welcome newcomers and help them learn
|
|
||||||
- Focus on constructive feedback
|
|
||||||
- Respect different viewpoints and experiences
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
Before you start contributing, make sure you have:
|
|
||||||
|
|
||||||
1. **Read the documentation** to understand how Voicebox works
|
|
||||||
2. **Set up your development environment** - see [Development Setup](/development/setup)
|
|
||||||
3. **Explored the codebase** to understand the project structure
|
|
||||||
4. **Checked existing issues** to see if someone else is working on something similar
|
|
||||||
|
|
||||||
## Ways to Contribute
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Report Bugs" icon="bug">
|
|
||||||
Found a bug? Open an issue with reproduction steps
|
|
||||||
</Card>
|
|
||||||
<Card title="Request Features" icon="lightbulb">
|
|
||||||
Have an idea? Start a discussion or open an issue
|
|
||||||
</Card>
|
|
||||||
<Card title="Improve Docs" icon="book">
|
|
||||||
Fix typos, add examples, or clarify instructions
|
|
||||||
</Card>
|
|
||||||
<Card title="Write Code" icon="code">
|
|
||||||
Fix bugs, add features, or optimize performance
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
## Development Workflow
|
|
||||||
|
|
||||||
### 1. Fork & Clone
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Fork the repository on GitHub
|
|
||||||
# Then clone your fork
|
|
||||||
git clone https://github.com/YOUR_USERNAME/voicebox.git
|
|
||||||
cd voicebox
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Create a Branch
|
|
||||||
|
|
||||||
Use descriptive branch names:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# For features
|
|
||||||
git checkout -b feature/voice-effects
|
|
||||||
|
|
||||||
# For bug fixes
|
|
||||||
git checkout -b fix/audio-playback-issue
|
|
||||||
|
|
||||||
# For documentation
|
|
||||||
git checkout -b docs/api-examples
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Make Your Changes
|
|
||||||
|
|
||||||
Follow these guidelines:
|
|
||||||
|
|
||||||
<AccordionGroup>
|
|
||||||
<Accordion title="Code Style">
|
|
||||||
**TypeScript/React:**
|
|
||||||
- Use TypeScript strict mode
|
|
||||||
- Prefer functional components with hooks
|
|
||||||
- Use named exports
|
|
||||||
- Format with Biome (runs automatically)
|
|
||||||
|
|
||||||
**Python:**
|
|
||||||
- Follow PEP 8
|
|
||||||
- Use type hints
|
|
||||||
- Use async/await for I/O
|
|
||||||
- Document functions with docstrings
|
|
||||||
|
|
||||||
**Rust:**
|
|
||||||
- Follow Rust conventions
|
|
||||||
- Use meaningful names
|
|
||||||
- Handle errors explicitly
|
|
||||||
- Run `rustfmt`
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<Accordion title="Commit Messages">
|
|
||||||
Write clear, descriptive commit messages:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Good
|
|
||||||
git commit -m "Add voice profile export feature"
|
|
||||||
git commit -m "Fix audio playback stopping after 30 seconds"
|
|
||||||
|
|
||||||
# Avoid
|
|
||||||
git commit -m "Update code"
|
|
||||||
git commit -m "Fix bug"
|
|
||||||
```
|
|
||||||
|
|
||||||
Format:
|
|
||||||
- Use imperative mood ("Add feature" not "Added feature")
|
|
||||||
- Keep first line under 50 characters
|
|
||||||
- Add detailed description if needed
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<Accordion title="Testing">
|
|
||||||
- Test your changes manually in the app
|
|
||||||
- Ensure backend API endpoints work
|
|
||||||
- Check for TypeScript/Python errors
|
|
||||||
- Verify UI components render correctly
|
|
||||||
- Add automated tests when possible
|
|
||||||
</Accordion>
|
|
||||||
</AccordionGroup>
|
|
||||||
|
|
||||||
### 4. Push & Create PR
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Push your branch
|
|
||||||
git push origin feature/your-feature-name
|
|
||||||
|
|
||||||
# Then create a pull request on GitHub
|
|
||||||
```
|
|
||||||
|
|
||||||
## Pull Request Guidelines
|
|
||||||
|
|
||||||
When creating a pull request:
|
|
||||||
|
|
||||||
<Steps>
|
|
||||||
<Step title="Use a Clear Title">
|
|
||||||
Examples:
|
|
||||||
- "Add voice profile export functionality"
|
|
||||||
- "Fix audio playback stopping after 30 seconds"
|
|
||||||
- "Improve generation speed with caching"
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Provide Description">
|
|
||||||
Include:
|
|
||||||
- What changes you made
|
|
||||||
- Why you made them
|
|
||||||
- How to test them
|
|
||||||
- Screenshots (for UI changes)
|
|
||||||
- Reference related issues
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Update Documentation">
|
|
||||||
- Update relevant docs if behavior changes
|
|
||||||
- Add API documentation for new endpoints
|
|
||||||
- Update README if needed
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Check the Checklist">
|
|
||||||
- [ ] Code follows style guidelines
|
|
||||||
- [ ] Documentation updated
|
|
||||||
- [ ] Changes tested
|
|
||||||
- [ ] No breaking changes (or documented)
|
|
||||||
- [ ] CHANGELOG.md updated
|
|
||||||
</Step>
|
|
||||||
</Steps>
|
|
||||||
|
|
||||||
## Project Structure
|
|
||||||
|
|
||||||
Understanding the codebase:
|
|
||||||
|
|
||||||
```
|
|
||||||
voicebox/
|
|
||||||
├── app/ # Shared React frontend
|
|
||||||
│ ├── src/
|
|
||||||
│ │ ├── components/ # UI components
|
|
||||||
│ │ ├── lib/ # Utilities and API client
|
|
||||||
│ │ ├── hooks/ # React hooks
|
|
||||||
│ │ └── stores/ # Zustand state stores
|
|
||||||
├── backend/ # Python FastAPI server
|
|
||||||
│ ├── main.py # API routes
|
|
||||||
│ ├── tts.py # Voice synthesis logic
|
|
||||||
│ ├── database.py # SQLite operations
|
|
||||||
│ └── models.py # Pydantic models
|
|
||||||
├── tauri/ # Desktop app wrapper
|
|
||||||
│ └── src-tauri/ # Rust backend
|
|
||||||
├── web/ # Web deployment
|
|
||||||
├── landing/ # Marketing website
|
|
||||||
└── scripts/ # Build & release scripts
|
|
||||||
```
|
|
||||||
|
|
||||||
## Areas for Contribution
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
- Check [existing issues](https://github.com/jamiepine/voicebox/issues) for bugs
|
|
||||||
- Test your fix thoroughly
|
|
||||||
- Add regression tests if possible
|
|
||||||
|
|
||||||
### New Features
|
|
||||||
|
|
||||||
- Check the [roadmap](https://github.com/jamiepine/voicebox#roadmap) for planned features
|
|
||||||
- Discuss major features in an issue first
|
|
||||||
- Keep features focused and well-scoped
|
|
||||||
|
|
||||||
### Documentation
|
|
||||||
|
|
||||||
- Improve clarity and fix typos
|
|
||||||
- Add code examples
|
|
||||||
- Create tutorials or guides
|
|
||||||
- Document API endpoints
|
|
||||||
|
|
||||||
### UI/UX Improvements
|
|
||||||
|
|
||||||
- Improve accessibility
|
|
||||||
- Enhance visual design
|
|
||||||
- Optimize performance
|
|
||||||
- Add animations/transitions
|
|
||||||
|
|
||||||
### Infrastructure
|
|
||||||
|
|
||||||
- Improve build process
|
|
||||||
- Add CI/CD improvements
|
|
||||||
- Optimize bundle size
|
|
||||||
- Add testing infrastructure
|
|
||||||
|
|
||||||
## API Development
|
|
||||||
|
|
||||||
When adding new API endpoints:
|
|
||||||
|
|
||||||
<Steps>
|
|
||||||
<Step title="Add Route">
|
|
||||||
In `backend/main.py`:
|
|
||||||
|
|
||||||
```python
|
|
||||||
@app.post("/api/new-endpoint")
|
|
||||||
async def new_endpoint(data: RequestModel) -> ResponseModel:
|
|
||||||
"""Endpoint description."""
|
|
||||||
# Implementation
|
|
||||||
return response
|
|
||||||
```
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Create Models">
|
|
||||||
In `backend/models.py`:
|
|
||||||
|
|
||||||
```python
|
|
||||||
class RequestModel(BaseModel):
|
|
||||||
field: str
|
|
||||||
|
|
||||||
class ResponseModel(BaseModel):
|
|
||||||
result: str
|
|
||||||
```
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Regenerate Client">
|
|
||||||
```bash
|
|
||||||
bun run generate:api
|
|
||||||
```
|
|
||||||
|
|
||||||
This updates the TypeScript client with type-safe bindings.
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Update Docs">
|
|
||||||
Add documentation in `/docs/api/`
|
|
||||||
</Step>
|
|
||||||
</Steps>
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
Currently testing is primarily manual. When adding tests:
|
|
||||||
|
|
||||||
**Backend:**
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
pytest
|
|
||||||
```
|
|
||||||
|
|
||||||
**Frontend:**
|
|
||||||
```bash
|
|
||||||
bun run test
|
|
||||||
```
|
|
||||||
|
|
||||||
**E2E (future):**
|
|
||||||
```bash
|
|
||||||
bun run test:e2e
|
|
||||||
```
|
|
||||||
|
|
||||||
## Release Process
|
|
||||||
|
|
||||||
Releases are managed by maintainers using `bumpversion`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Bump version (patch, minor, or major)
|
|
||||||
bumpversion patch
|
|
||||||
|
|
||||||
# Push with tags
|
|
||||||
git push && git push --tags
|
|
||||||
```
|
|
||||||
|
|
||||||
GitHub Actions automatically builds and publishes releases when tags are pushed.
|
|
||||||
|
|
||||||
## Community
|
|
||||||
|
|
||||||
- **GitHub Issues:** Bug reports and feature requests
|
|
||||||
- **GitHub Discussions:** General questions and ideas
|
|
||||||
- **Discord:** Real-time chat (coming soon)
|
|
||||||
|
|
||||||
## Recognition
|
|
||||||
|
|
||||||
Contributors are recognized in:
|
|
||||||
- [CHANGELOG.md](https://github.com/jamiepine/voicebox/blob/main/CHANGELOG.md)
|
|
||||||
- GitHub contributor list
|
|
||||||
- Release notes
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
By contributing, you agree that your contributions will be licensed under the MIT License.
|
|
||||||
|
|
||||||
## Questions?
|
|
||||||
|
|
||||||
If you have questions:
|
|
||||||
|
|
||||||
1. Check the [documentation](/overview/introduction)
|
|
||||||
2. Search [existing issues](https://github.com/jamiepine/voicebox/issues)
|
|
||||||
3. Open a new issue or discussion
|
|
||||||
4. See [CONTRIBUTING.md](https://github.com/jamiepine/voicebox/blob/main/CONTRIBUTING.md) in the repo
|
|
||||||
|
|
||||||
Thank you for contributing to Voicebox! 🎉
|
|
||||||
@@ -1,239 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Development Setup"
|
|
||||||
description: "Set up your local development environment for Voicebox"
|
|
||||||
---
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
Before you begin, ensure you have the following installed:
|
|
||||||
|
|
||||||
<CardGroup cols={3}>
|
|
||||||
<Card title="Bun" icon="package">
|
|
||||||
[Download Bun](https://bun.sh)
|
|
||||||
```bash
|
|
||||||
curl -fsSL https://bun.sh/install | bash
|
|
||||||
```
|
|
||||||
</Card>
|
|
||||||
<Card title="Python 3.11+" icon="python">
|
|
||||||
[Download Python](https://python.org)
|
|
||||||
```bash
|
|
||||||
python --version
|
|
||||||
```
|
|
||||||
</Card>
|
|
||||||
<Card title="Rust" icon="rust">
|
|
||||||
[Install Rust](https://rustup.rs)
|
|
||||||
```bash
|
|
||||||
rustc --version
|
|
||||||
```
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
## Clone the Repository
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/jamiepine/voicebox.git
|
|
||||||
cd voicebox
|
|
||||||
```
|
|
||||||
|
|
||||||
## Quick Setup (Recommended)
|
|
||||||
|
|
||||||
The easiest way to get started is using the Makefile:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Setup everything
|
|
||||||
make setup
|
|
||||||
|
|
||||||
# Start development
|
|
||||||
make dev
|
|
||||||
```
|
|
||||||
|
|
||||||
<Note>
|
|
||||||
The Makefile is available on macOS and Linux. Windows users should follow the manual setup below.
|
|
||||||
</Note>
|
|
||||||
|
|
||||||
## Manual Setup
|
|
||||||
|
|
||||||
### 1. Install JavaScript Dependencies
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bun install
|
|
||||||
```
|
|
||||||
|
|
||||||
This installs dependencies for:
|
|
||||||
- `app/` - Shared React frontend
|
|
||||||
- `tauri/` - Tauri desktop wrapper
|
|
||||||
- `web/` - Web deployment wrapper
|
|
||||||
|
|
||||||
### 2. Set Up Python Backend
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
|
|
||||||
# Create virtual environment
|
|
||||||
python -m venv venv
|
|
||||||
|
|
||||||
# Activate virtual environment
|
|
||||||
source venv/bin/activate # macOS/Linux
|
|
||||||
# or
|
|
||||||
venv\Scripts\activate # Windows
|
|
||||||
|
|
||||||
# Install Python dependencies
|
|
||||||
pip install -r requirements.txt
|
|
||||||
|
|
||||||
# Install MLX dependencies (Apple Silicon only - for faster inference)
|
|
||||||
# On Apple Silicon, this enables native Metal acceleration
|
|
||||||
if [[ $(uname -m) == "arm64" ]]; then
|
|
||||||
pip install -r requirements-mlx.txt
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Install Qwen3-TTS
|
|
||||||
pip install git+https://github.com/QwenLM/Qwen3-TTS.git
|
|
||||||
```
|
|
||||||
|
|
||||||
## Running in Development
|
|
||||||
|
|
||||||
Development requires **two terminals**: one for the Python backend, one for the Tauri app.
|
|
||||||
|
|
||||||
<Tabs>
|
|
||||||
<Tab title="Terminal 1: Backend">
|
|
||||||
Start the Python server first:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
source venv/bin/activate # Activate venv
|
|
||||||
bun run dev:server
|
|
||||||
```
|
|
||||||
|
|
||||||
Or manually:
|
|
||||||
```bash
|
|
||||||
uvicorn main:app --reload --port 17493
|
|
||||||
```
|
|
||||||
|
|
||||||
Backend will be available at `http://localhost:17493`
|
|
||||||
</Tab>
|
|
||||||
|
|
||||||
<Tab title="Terminal 2: Desktop App">
|
|
||||||
Then start the Tauri app:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bun run dev
|
|
||||||
```
|
|
||||||
|
|
||||||
This will:
|
|
||||||
- Create a placeholder sidecar binary
|
|
||||||
- Start Vite dev server on port 5173
|
|
||||||
- Launch Tauri window
|
|
||||||
- Enable hot reload
|
|
||||||
</Tab>
|
|
||||||
</Tabs>
|
|
||||||
|
|
||||||
<Info>
|
|
||||||
In dev mode, the app connects to your manually-started Python server. The bundled server binary is only used in production builds.
|
|
||||||
</Info>
|
|
||||||
|
|
||||||
### Optional: Web App
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bun run dev:web
|
|
||||||
```
|
|
||||||
|
|
||||||
Web app will be available at `http://localhost:5174`
|
|
||||||
|
|
||||||
## Model Downloads
|
|
||||||
|
|
||||||
Models are automatically downloaded from HuggingFace Hub on first use:
|
|
||||||
|
|
||||||
- **Whisper** (transcription): Auto-downloads on first transcription
|
|
||||||
- **Qwen3-TTS** (voice cloning): Auto-downloads on first generation (~2-4GB)
|
|
||||||
|
|
||||||
<Warning>
|
|
||||||
First-time usage will be slower due to model downloads, but subsequent runs will use cached models.
|
|
||||||
</Warning>
|
|
||||||
|
|
||||||
## Project Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
voicebox/
|
|
||||||
├── app/ # Shared React frontend
|
|
||||||
│ └── src/
|
|
||||||
│ ├── components/ # UI components
|
|
||||||
│ ├── lib/ # Utilities and API client
|
|
||||||
│ └── hooks/ # React hooks
|
|
||||||
├── backend/ # Python FastAPI server
|
|
||||||
│ ├── main.py # API routes
|
|
||||||
│ ├── tts.py # Voice synthesis
|
|
||||||
│ └── database.py # SQLite operations
|
|
||||||
├── tauri/ # Desktop app wrapper
|
|
||||||
│ └── src-tauri/ # Rust backend
|
|
||||||
├── web/ # Web deployment
|
|
||||||
├── landing/ # Marketing website
|
|
||||||
└── scripts/ # Build & release scripts
|
|
||||||
```
|
|
||||||
|
|
||||||
## Available Make Commands
|
|
||||||
|
|
||||||
Run `make help` to see all available commands:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
make setup # Install all dependencies
|
|
||||||
make dev # Start development servers
|
|
||||||
make dev-web # Start web development server
|
|
||||||
make build # Build desktop app
|
|
||||||
make build-web # Build web app
|
|
||||||
make clean # Clean build artifacts
|
|
||||||
make test # Run tests
|
|
||||||
```
|
|
||||||
|
|
||||||
## Generate OpenAPI Client
|
|
||||||
|
|
||||||
After starting the backend server, generate the TypeScript API client:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./scripts/generate-api.sh
|
|
||||||
# or
|
|
||||||
bun run generate:api
|
|
||||||
```
|
|
||||||
|
|
||||||
This downloads the OpenAPI schema and generates the TypeScript client in `app/src/lib/api/`
|
|
||||||
|
|
||||||
## Next Steps
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Architecture" icon="diagram-project" href="/development/architecture">
|
|
||||||
Understand the system architecture
|
|
||||||
</Card>
|
|
||||||
<Card title="Contributing" icon="code-pull-request" href="/development/contributing">
|
|
||||||
Read the contribution guidelines
|
|
||||||
</Card>
|
|
||||||
<Card title="Building" icon="hammer" href="/development/building">
|
|
||||||
Learn how to build production releases
|
|
||||||
</Card>
|
|
||||||
<Card title="API Reference" icon="code" href="/api/overview">
|
|
||||||
Explore the REST API
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
<AccordionGroup>
|
|
||||||
<Accordion title="Backend won't start">
|
|
||||||
- Check Python version (must be 3.11+)
|
|
||||||
- Ensure virtual environment is activated
|
|
||||||
- Verify all dependencies are installed: `pip install -r requirements.txt`
|
|
||||||
- Check if port 17493 is available
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<Accordion title="Tauri build fails">
|
|
||||||
- Ensure Rust is installed: `rustc --version`
|
|
||||||
- Clean the build: `cd tauri/src-tauri && cargo clean`
|
|
||||||
- Try rebuilding: `bun run dev`
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<Accordion title="OpenAPI client generation fails">
|
|
||||||
- Ensure backend is running: `curl http://localhost:17493/openapi.json`
|
|
||||||
- Check network connectivity
|
|
||||||
- Verify the backend is accessible at localhost:17493
|
|
||||||
</Accordion>
|
|
||||||
</AccordionGroup>
|
|
||||||
|
|
||||||
See the full [Troubleshooting Guide](/guides/troubleshooting) for more issues and solutions.
|
|
||||||
-102
@@ -1,102 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://mintlify.com/schema.json",
|
|
||||||
"name": "Voicebox",
|
|
||||||
"logo": {
|
|
||||||
"light": "/logo/icon-light.png",
|
|
||||||
"dark": "/logo/icon-dark.png"
|
|
||||||
},
|
|
||||||
"favicon": "/favicon.png",
|
|
||||||
"colors": {
|
|
||||||
"primary": "#BF9E40",
|
|
||||||
"light": "#D4B560",
|
|
||||||
"dark": "#A68A35"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"css": ["/custom.css"]
|
|
||||||
},
|
|
||||||
"anchors": [
|
|
||||||
{
|
|
||||||
"name": "Overview",
|
|
||||||
"icon": "book-open",
|
|
||||||
"url": "overview"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "API",
|
|
||||||
"icon": "code",
|
|
||||||
"url": "api"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Developer",
|
|
||||||
"icon": "book-open-cover",
|
|
||||||
"url": "developer"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "GitHub",
|
|
||||||
"icon": "github",
|
|
||||||
"url": "https://github.com/jamiepine/voicebox"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"navigation": [
|
|
||||||
{
|
|
||||||
"group": "Getting Started",
|
|
||||||
"icon": "rocket",
|
|
||||||
"pages": ["overview/introduction", "overview/installation", "overview/quick-start"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "Features",
|
|
||||||
"icon": "sparkles",
|
|
||||||
"pages": [
|
|
||||||
"overview/voice-cloning",
|
|
||||||
"overview/stories-editor",
|
|
||||||
"overview/recording-transcription",
|
|
||||||
"overview/generation-history",
|
|
||||||
"overview/remote-mode"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "User Guides",
|
|
||||||
"icon": "compass",
|
|
||||||
"pages": [
|
|
||||||
"overview/creating-voice-profiles",
|
|
||||||
"overview/generating-speech",
|
|
||||||
"overview/building-stories",
|
|
||||||
"overview/troubleshooting"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "Development",
|
|
||||||
"icon": "wrench",
|
|
||||||
"pages": [
|
|
||||||
"developer/setup",
|
|
||||||
"developer/architecture",
|
|
||||||
"developer/contributing",
|
|
||||||
"developer/building",
|
|
||||||
"developer/autoupdater"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "API Reference",
|
|
||||||
"icon": "code",
|
|
||||||
"pages": [
|
|
||||||
"api/overview",
|
|
||||||
"api/authentication",
|
|
||||||
"api/voice-profiles",
|
|
||||||
"api/generation",
|
|
||||||
"api/recordings"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "Architecture",
|
|
||||||
"icon": "book-open-cover",
|
|
||||||
"pages": [
|
|
||||||
"developer/voice-profiles",
|
|
||||||
"developer/tts-generation",
|
|
||||||
"developer/history",
|
|
||||||
"developer/stories",
|
|
||||||
"developer/transcription",
|
|
||||||
"developer/audio-channels",
|
|
||||||
"developer/model-management"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
[phases.setup]
|
|
||||||
nixPkgs = ["nodejs_20", "bun"]
|
|
||||||
|
|
||||||
[phases.install]
|
|
||||||
cmds = ["bun install"]
|
|
||||||
|
|
||||||
[phases.build]
|
|
||||||
cmds = ["bun run build"]
|
|
||||||
|
|
||||||
[start]
|
|
||||||
cmd = "bun run start"
|
|
||||||
@@ -1,296 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Creating Voice Profiles"
|
|
||||||
description: "Advanced guide to creating high-quality voice profiles"
|
|
||||||
---
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
Voice profiles are the foundation of voice cloning in Voicebox. This guide covers best practices for creating professional-quality voice profiles.
|
|
||||||
|
|
||||||
## Quick Start
|
|
||||||
|
|
||||||
<Steps>
|
|
||||||
<Step title="Prepare Audio">
|
|
||||||
10-30 seconds of clear speech
|
|
||||||
</Step>
|
|
||||||
<Step title="Create Profile">
|
|
||||||
**Profiles** → **+ New Profile**
|
|
||||||
</Step>
|
|
||||||
<Step title="Upload Sample">
|
|
||||||
Add your audio file
|
|
||||||
</Step>
|
|
||||||
<Step title="Generate">
|
|
||||||
Use the profile to generate speech
|
|
||||||
</Step>
|
|
||||||
</Steps>
|
|
||||||
|
|
||||||
## Audio Requirements
|
|
||||||
|
|
||||||
### Ideal Sample Characteristics
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Duration" icon="clock">
|
|
||||||
**10-30 seconds**
|
|
||||||
|
|
||||||
Too short: Poor quality
|
|
||||||
Too long: Unnecessary
|
|
||||||
</Card>
|
|
||||||
<Card title="Clarity" icon="volume">
|
|
||||||
**Clear speech**
|
|
||||||
|
|
||||||
No background noise
|
|
||||||
No music or overlapping voices
|
|
||||||
</Card>
|
|
||||||
<Card title="Quality" icon="sparkles">
|
|
||||||
**High fidelity**
|
|
||||||
|
|
||||||
44.1kHz or 48kHz sample rate
|
|
||||||
Minimal compression
|
|
||||||
</Card>
|
|
||||||
<Card title="Content" icon="microphone">
|
|
||||||
**Natural speech**
|
|
||||||
|
|
||||||
Conversational tone
|
|
||||||
Complete sentences
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
### File Formats
|
|
||||||
|
|
||||||
Supported formats:
|
|
||||||
- **WAV** (recommended) - Lossless quality
|
|
||||||
- **MP3** - Acceptable, minimal compression
|
|
||||||
- **M4A** - Acceptable
|
|
||||||
- **FLAC** - Lossless alternative
|
|
||||||
|
|
||||||
<Tip>
|
|
||||||
Use WAV for best results. Avoid heavily compressed formats.
|
|
||||||
</Tip>
|
|
||||||
|
|
||||||
## Recording Tips
|
|
||||||
|
|
||||||
### Environment
|
|
||||||
|
|
||||||
<AccordionGroup>
|
|
||||||
<Accordion title="Quiet Space">
|
|
||||||
- Record in a quiet room
|
|
||||||
- Turn off fans, AC, appliances
|
|
||||||
- Close windows to reduce outside noise
|
|
||||||
- Use soft furnishings to reduce echo
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<Accordion title="Microphone Placement">
|
|
||||||
- 6-12 inches from mouth
|
|
||||||
- Slight angle to reduce plosives (p, b, t)
|
|
||||||
- Use a pop filter if available
|
|
||||||
- Maintain consistent distance
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<Accordion title="Recording Settings">
|
|
||||||
- 44.1kHz or 48kHz sample rate
|
|
||||||
- 16-bit or 24-bit depth
|
|
||||||
- Mono is fine (stereo will be converted)
|
|
||||||
- Avoid automatic gain control
|
|
||||||
</Accordion>
|
|
||||||
</AccordionGroup>
|
|
||||||
|
|
||||||
### Speaking
|
|
||||||
|
|
||||||
- **Natural pace** - Don't rush or speak too slowly
|
|
||||||
- **Clear articulation** - Pronounce words clearly
|
|
||||||
- **Consistent volume** - Maintain steady loudness
|
|
||||||
- **Normal tone** - Speak as you normally would
|
|
||||||
- **Complete sentences** - Avoid fragments or "ums"
|
|
||||||
|
|
||||||
## Multiple Samples
|
|
||||||
|
|
||||||
Adding multiple samples can significantly improve quality:
|
|
||||||
|
|
||||||
### Why Multiple Samples?
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Robustness" icon="shield">
|
|
||||||
Model learns a more complete representation
|
|
||||||
</Card>
|
|
||||||
<Card title="Versatility" icon="palette">
|
|
||||||
Handles different speaking styles better
|
|
||||||
</Card>
|
|
||||||
<Card title="Quality" icon="star">
|
|
||||||
Reduces artifacts and improves naturalness
|
|
||||||
</Card>
|
|
||||||
<Card title="Consistency" icon="check">
|
|
||||||
More reliable across different texts
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
### Sample Variety
|
|
||||||
|
|
||||||
Consider adding samples with:
|
|
||||||
|
|
||||||
1. **Different tones**
|
|
||||||
- Casual conversation
|
|
||||||
- Professional/formal
|
|
||||||
- Excited/enthusiastic
|
|
||||||
- Calm/serious
|
|
||||||
|
|
||||||
2. **Different content**
|
|
||||||
- Narratives
|
|
||||||
- Questions
|
|
||||||
- Statements
|
|
||||||
- Emotions (happy, sad, neutral)
|
|
||||||
|
|
||||||
3. **Different recording conditions**
|
|
||||||
- Studio quality
|
|
||||||
- Phone call quality (if needed)
|
|
||||||
- Room acoustics
|
|
||||||
|
|
||||||
<Warning>
|
|
||||||
All samples should be from the **same speaker**. Mixing voices will produce poor results.
|
|
||||||
</Warning>
|
|
||||||
|
|
||||||
## Processing Existing Audio
|
|
||||||
|
|
||||||
If you have existing audio (podcasts, videos, etc.):
|
|
||||||
|
|
||||||
### Extracting Clean Segments
|
|
||||||
|
|
||||||
<Steps>
|
|
||||||
<Step title="Find Clean Speech">
|
|
||||||
Look for segments with:
|
|
||||||
- Just the target speaker
|
|
||||||
- No background music
|
|
||||||
- Minimal noise
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Use Audio Editor">
|
|
||||||
Tools like Audacity or Adobe Audition:
|
|
||||||
- Cut out clean 10-30s segments
|
|
||||||
- Remove silence at start/end
|
|
||||||
- Normalize volume if needed
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Export as WAV">
|
|
||||||
Save as high-quality WAV file
|
|
||||||
</Step>
|
|
||||||
</Steps>
|
|
||||||
|
|
||||||
### Noise Reduction
|
|
||||||
|
|
||||||
If you have light background noise:
|
|
||||||
|
|
||||||
```
|
|
||||||
1. Use noise reduction in Audacity:
|
|
||||||
- Select noise-only section
|
|
||||||
- Get Noise Profile
|
|
||||||
- Select full audio
|
|
||||||
- Apply noise reduction (gentle settings)
|
|
||||||
|
|
||||||
2. Avoid over-processing:
|
|
||||||
- Can introduce artifacts
|
|
||||||
- May reduce voice quality
|
|
||||||
```
|
|
||||||
|
|
||||||
## Testing & Iteration
|
|
||||||
|
|
||||||
### Test Your Profile
|
|
||||||
|
|
||||||
After creating a profile:
|
|
||||||
|
|
||||||
<Steps>
|
|
||||||
<Step title="Generate Test">
|
|
||||||
Generate a simple phrase:
|
|
||||||
```
|
|
||||||
"Hello, this is a test of my voice profile."
|
|
||||||
```
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Evaluate Quality">
|
|
||||||
Listen for:
|
|
||||||
- Natural tone
|
|
||||||
- Clear pronunciation
|
|
||||||
- Proper prosody
|
|
||||||
- Lack of artifacts
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Iterate">
|
|
||||||
If quality is poor:
|
|
||||||
- Add more samples
|
|
||||||
- Try different source audio
|
|
||||||
- Check sample quality
|
|
||||||
</Step>
|
|
||||||
</Steps>
|
|
||||||
|
|
||||||
### Common Issues
|
|
||||||
|
|
||||||
<AccordionGroup>
|
|
||||||
<Accordion title="Robotic Voice">
|
|
||||||
**Cause**: Poor quality samples or too short
|
|
||||||
|
|
||||||
**Fix**: Use longer, higher quality samples
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<Accordion title="Wrong Tone">
|
|
||||||
**Cause**: Sample tone doesn't match desired output
|
|
||||||
|
|
||||||
**Fix**: Record samples in the style you want to generate
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<Accordion title="Artifacts/Glitches">
|
|
||||||
**Cause**: Background noise or audio issues in samples
|
|
||||||
|
|
||||||
**Fix**: Clean up samples or re-record in quieter environment
|
|
||||||
</Accordion>
|
|
||||||
</AccordionGroup>
|
|
||||||
|
|
||||||
## Advanced Tips
|
|
||||||
|
|
||||||
### Celebrity/Character Voices
|
|
||||||
|
|
||||||
For cloning public figures or characters:
|
|
||||||
|
|
||||||
1. **Legal considerations** - Ensure you have rights or it's fair use
|
|
||||||
2. **Source quality** - Find high-quality interview audio or clean clips
|
|
||||||
3. **Consistency** - Use clips where they speak similarly
|
|
||||||
4. **Multiple samples** - Very important for recognizable voices
|
|
||||||
|
|
||||||
### Accent & Dialect
|
|
||||||
|
|
||||||
The model will preserve accent and dialect:
|
|
||||||
|
|
||||||
- British English will generate British English
|
|
||||||
- Southern accent will produce Southern accent
|
|
||||||
- Regional pronunciations will be maintained
|
|
||||||
|
|
||||||
### Emotion Transfer
|
|
||||||
|
|
||||||
The emotional tone of samples affects generation:
|
|
||||||
|
|
||||||
- Energetic samples → Energetic output
|
|
||||||
- Calm samples → Calm output
|
|
||||||
- Mix samples for versatile profile
|
|
||||||
|
|
||||||
## Managing Profiles
|
|
||||||
|
|
||||||
### Organization
|
|
||||||
|
|
||||||
- **Descriptive names** - "John Smith - Professional Narrator"
|
|
||||||
- **Add descriptions** - Note recording conditions, use cases
|
|
||||||
- **Language tags** - Mark the primary language
|
|
||||||
- **Archive unused** - Keep profile list manageable
|
|
||||||
|
|
||||||
### Export/Import
|
|
||||||
|
|
||||||
- **Export** profiles to share or backup
|
|
||||||
- **Import** from colleagues or teammates
|
|
||||||
- Profiles include voice embeddings, not original audio
|
|
||||||
|
|
||||||
## Next Steps
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Generate Speech" icon="waveform" href="/guides/generating-speech">
|
|
||||||
Use your profile to generate speech
|
|
||||||
</Card>
|
|
||||||
<Card title="Build Stories" icon="film" href="/guides/building-stories">
|
|
||||||
Create multi-voice narratives
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Introduction"
|
|
||||||
description: "Welcome to Voicebox - the open-source voice synthesis studio"
|
|
||||||
---
|
|
||||||
|
|
||||||
## What is Voicebox?
|
|
||||||
|
|
||||||
Voicebox is a **local-first voice cloning studio** with DAW-like features for professional voice synthesis. Think of it as a **local, free and open-source alternative to ElevenLabs** — download models, clone voices, and generate speech entirely on your machine.
|
|
||||||
|
|
||||||
<Frame>
|
|
||||||
<img src="/images/app-screenshot-1.webp" alt="Voicebox App Screenshot" />
|
|
||||||
</Frame>
|
|
||||||
|
|
||||||
Unlike cloud services that lock your voice data behind subscriptions, Voicebox gives you:
|
|
||||||
|
|
||||||
- **Complete privacy** — models and voice data stay on your machine
|
|
||||||
- **Professional tools** — multi-track timeline editor, audio trimming, conversation mixing
|
|
||||||
- **Model flexibility** — currently powered by Qwen3-TTS, with support for XTTS, Bark, and other models coming soon
|
|
||||||
- **API-first** — use the desktop app or integrate voice synthesis into your own projects
|
|
||||||
- **Native performance** — built with Tauri (Rust), not Electron
|
|
||||||
|
|
||||||
Download a voice model, clone any voice from a few seconds of audio, and compose multi-voice projects with studio-grade editing tools. No Python install required, no cloud dependency, no limits.
|
|
||||||
|
|
||||||
## Key Features
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Voice Cloning" icon="microphone">
|
|
||||||
Instant cloning from just a few seconds of audio with Qwen3-TTS
|
|
||||||
</Card>
|
|
||||||
<Card title="Stories Editor" icon="film">
|
|
||||||
Multi-track timeline for creating conversations and narratives
|
|
||||||
</Card>
|
|
||||||
<Card title="Full API" icon="code">
|
|
||||||
REST API for integrating voice synthesis into your apps
|
|
||||||
</Card>
|
|
||||||
<Card title="Local-First" icon="shield">
|
|
||||||
Everything runs on your machine - complete privacy
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
## Use Cases
|
|
||||||
|
|
||||||
- **Game Development** — Generate dynamic dialogue for characters
|
|
||||||
- **Content Creation** — Produce podcasts and video voiceovers
|
|
||||||
- **Accessibility** — Build text-to-speech tools
|
|
||||||
- **Voice Assistants** — Create custom voice interfaces
|
|
||||||
- **Production Pipelines** — Automate voiceover workflows
|
|
||||||
|
|
||||||
## Next Steps
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Installation" icon="download" href="/overview/installation">
|
|
||||||
Download and install Voicebox on your machine
|
|
||||||
</Card>
|
|
||||||
<Card title="Quick Start" icon="rocket" href="/overview/quick-start">
|
|
||||||
Get up and running in 5 minutes
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Quick Start"
|
|
||||||
description: "Get started with Voicebox in 5 minutes"
|
|
||||||
---
|
|
||||||
|
|
||||||
This guide will walk you through creating your first voice profile and generating speech.
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
Make sure you have [installed Voicebox](/overview/installation) and launched the app.
|
|
||||||
|
|
||||||
## Step 1: Create a Voice Profile
|
|
||||||
|
|
||||||
Voice profiles are the foundation of Voicebox. Each profile contains voice samples that the AI uses to clone the voice.
|
|
||||||
|
|
||||||
<Steps>
|
|
||||||
<Step title="Navigate to Profiles">
|
|
||||||
Click the **Profiles** tab in the sidebar
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Create New Profile">
|
|
||||||
Click the **+ New Profile** button
|
|
||||||
|
|
||||||
Fill in the details:
|
|
||||||
- **Name:** A descriptive name (e.g., "John Smith")
|
|
||||||
- **Language:** Select the primary language
|
|
||||||
- **Description:** Optional notes about the voice
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Add Voice Sample">
|
|
||||||
You have two options:
|
|
||||||
|
|
||||||
**Option A: Upload Audio**
|
|
||||||
- Click **Upload Sample**
|
|
||||||
- Select an audio file (WAV, MP3, or M4A)
|
|
||||||
- Ideal length: 10-30 seconds of clear speech
|
|
||||||
|
|
||||||
**Option B: Record Live**
|
|
||||||
- Click **Record Sample**
|
|
||||||
- Speak clearly for 10-30 seconds
|
|
||||||
- Click stop when finished
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Save Profile">
|
|
||||||
Click **Create Profile** to save
|
|
||||||
</Step>
|
|
||||||
</Steps>
|
|
||||||
|
|
||||||
<Tip>
|
|
||||||
For best results, use clean audio with minimal background noise and consistent speaking tone.
|
|
||||||
</Tip>
|
|
||||||
|
|
||||||
## Step 2: Generate Speech
|
|
||||||
|
|
||||||
Now let's use your new voice profile to generate speech.
|
|
||||||
|
|
||||||
<Steps>
|
|
||||||
<Step title="Go to Generation">
|
|
||||||
Click the **Generate** tab in the sidebar
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Select Voice Profile">
|
|
||||||
Choose your newly created profile from the dropdown
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Enter Text">
|
|
||||||
Type or paste the text you want to generate:
|
|
||||||
|
|
||||||
```
|
|
||||||
Hello! This is my first voice generation with Voicebox.
|
|
||||||
```
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Generate">
|
|
||||||
Click **Generate** and wait a few seconds
|
|
||||||
|
|
||||||
<Note>
|
|
||||||
First generation may take longer due to model initialization. Subsequent generations will be faster.
|
|
||||||
</Note>
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Play & Download">
|
|
||||||
- Click **Play** to preview the audio
|
|
||||||
- Click **Download** to save the audio file
|
|
||||||
- The generation is also saved to your **History**
|
|
||||||
</Step>
|
|
||||||
</Steps>
|
|
||||||
|
|
||||||
## Step 3: Build a Story (Optional)
|
|
||||||
|
|
||||||
The Stories Editor lets you create multi-voice narratives with a timeline-based interface.
|
|
||||||
|
|
||||||
<Steps>
|
|
||||||
<Step title="Create New Story">
|
|
||||||
Navigate to **Stories** and click **+ New Story**
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Add Voice Tracks">
|
|
||||||
Click **+ Add Track** to create tracks for different speakers
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Add Audio Clips">
|
|
||||||
- Drag generated audio from your History
|
|
||||||
- Or generate new clips directly in the timeline
|
|
||||||
- Arrange clips on the timeline
|
|
||||||
</Step>
|
|
||||||
|
|
||||||
<Step title="Edit & Export">
|
|
||||||
- Trim clips by dragging edges
|
|
||||||
- Adjust timing and spacing
|
|
||||||
- Click **Export** to render the final audio
|
|
||||||
</Step>
|
|
||||||
</Steps>
|
|
||||||
|
|
||||||
## What's Next?
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Voice Cloning Guide" icon="microphone" href="/guides/creating-voice-profiles">
|
|
||||||
Learn advanced techniques for high-quality voice cloning
|
|
||||||
</Card>
|
|
||||||
<Card title="API Integration" icon="code" href="/api/overview">
|
|
||||||
Integrate Voicebox into your own applications
|
|
||||||
</Card>
|
|
||||||
<Card title="Stories Editor" icon="film" href="/overview/stories-editor">
|
|
||||||
Master the multi-track timeline editor
|
|
||||||
</Card>
|
|
||||||
<Card title="Remote Mode" icon="server" href="/overview/remote-mode">
|
|
||||||
Connect to a GPU server for faster generation
|
|
||||||
</Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
## Tips for Success
|
|
||||||
|
|
||||||
<AccordionGroup>
|
|
||||||
<Accordion title="Getting the Best Voice Quality">
|
|
||||||
- Use 10-30 seconds of clear, consistent speech
|
|
||||||
- Avoid background noise and echo
|
|
||||||
- Multiple samples from the same speaker improve quality
|
|
||||||
- Match the speaking style you want to generate
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<Accordion title="Improving Generation Speed">
|
|
||||||
- Use a CUDA-capable GPU for 5-10x faster generation
|
|
||||||
- Enable voice prompt caching for repeated generations
|
|
||||||
- Consider running the backend on a remote GPU server
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<Accordion title="Troubleshooting Common Issues">
|
|
||||||
- **Server won't start:** Check if port 17493 is available
|
|
||||||
- **Poor audio quality:** Try adding more voice samples
|
|
||||||
- **Slow generation:** Verify GPU acceleration is enabled
|
|
||||||
- See the full [Troubleshooting Guide](/guides/troubleshooting) for more
|
|
||||||
</Accordion>
|
|
||||||
</AccordionGroup>
|
|
||||||
+25
-10
@@ -1,17 +1,32 @@
|
|||||||
{
|
{
|
||||||
"name": "voicebox-docs",
|
"name": "example-next-mdx",
|
||||||
"version": "0.1.0",
|
"version": "0.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "mintlify dev",
|
"build": "fumadocs-mdx && next build",
|
||||||
"build": "mintlify build",
|
"dev": "fumadocs-mdx && next dev",
|
||||||
"start": "mintlify serve",
|
"start": "next start",
|
||||||
"install:mintlify": "bun add -g mintlify"
|
"postinstall": "fumadocs-mdx"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"fumadocs-core": "^16.4.11",
|
||||||
|
"fumadocs-mdx": "13",
|
||||||
|
"fumadocs-openapi": "^10.2.7",
|
||||||
|
"fumadocs-ui": "^16.4.11",
|
||||||
|
"lucide-react": "^0.546.0",
|
||||||
|
"next": "^16.1.6",
|
||||||
|
"react": "^19.2.0",
|
||||||
|
"react-dom": "^19.2.0",
|
||||||
|
"shiki": "^3.22.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"mintlify": "latest"
|
"@tailwindcss/postcss": "^4.1.15",
|
||||||
},
|
"@types/mdx": "^2.0.13",
|
||||||
"engines": {
|
"@types/node": "^24.9.1",
|
||||||
"bun": ">=1.0.0"
|
"@types/react": "^19.2.2",
|
||||||
|
"@types/react-dom": "^19.2.2",
|
||||||
|
"postcss": "^8.5.6",
|
||||||
|
"tailwindcss": "^4.1.15",
|
||||||
|
"typescript": "^5.9.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user