Give it a voice. Give it words. Get speech.
Voxcast clones a voice from a short sample, then turns any text into speech in that voice—all on your machine, no GPU required. Add Podcast mode and you get AI personas debating each other in cloned voices, streamed as they’re generated.
You need: Node.js, uv. For Podcast mode, a Backboard API key in .env.
./start.sh
That clears frontend cache (not .env or data), syncs backend deps, starts the API on http://localhost:8001, and runs the UI with /api proxied. Open http://localhost:5173 in the browser. Use Voxcast for voice clone, Podcast for debates.
/api/jobs/{job_id} until the job finishes → you get an embedding_id.embedding_id to POST /api/tts → another background job runs TTS./api/audio/{audio_id} and plays (or downloads).So: reference → embedding job → embedding_id; then text + embedding_id → TTS job → audio.
/api/podcasts/{id} and plays in order so the debate runs with the right voices.backend/: voice (upload reference, create embedding), tts, jobs (poll), files (serve audio/podcasts), pod (personas, history, stream), model, health.BACKBOARD_API_KEY is unset.| Area | Purpose |
|---|---|
backend/ | FastAPI, LuxTTS/ZipVoice, job store, Backboard |
src/ | React (Vite, Tailwind): TtsScreen, PodScreen, PodHistoryScreen |
start.sh | One command: clean run, backend, then frontend |
Secrets and config go in .env—don’t commit it. Backend: uv + pyproject.toml; frontend: npm.
Python
85.3%
TypeScript
12.7%
Give it a voice. Give it words. Get speech.
Voxcast clones a voice from a short sample, then turns any text into speech in that voice—all on your machine, no GPU required. Add Podcast mode and you get AI personas debating each other in cloned voices, streamed as they’re generated.
You need: Node.js, uv. For Podcast mode, a Backboard API key in .env.
./start.sh
That clears frontend cache (not .env or data), syncs backend deps, starts the API on http://localhost:8001, and runs the UI with /api proxied. Open http://localhost:5173 in the browser. Use Voxcast for voice clone, Podcast for debates.
/api/jobs/{job_id} until the job finishes → you get an embedding_id.embedding_id to POST /api/tts → another background job runs TTS./api/audio/{audio_id} and plays (or downloads).So: reference → embedding job → embedding_id; then text + embedding_id → TTS job → audio.
/api/podcasts/{id} and plays in order so the debate runs with the right voices.backend/: voice (upload reference, create embedding), tts, jobs (poll), files (serve audio/podcasts), pod (personas, history, stream), model, health.BACKBOARD_API_KEY is unset.| Area | Purpose |
|---|---|
backend/ | FastAPI, LuxTTS/ZipVoice, job store, Backboard |
src/ | React (Vite, Tailwind): TtsScreen, PodScreen, PodHistoryScreen |
start.sh | One command: clean run, backend, then frontend |
Secrets and config go in .env—don’t commit it. Backend: uv + pyproject.toml; frontend: npm.
Python
85.3%
TypeScript
12.7%