uncloseai.

Open-Source Text-to-Speech Infrastructure

ðŸĶ Raccoon Mission: Rescuing Abandoned TTS Models

uncloseai-speech is our community-driven initiative to rescue, preserve, and unify abandoned text-to-speech models into a single, resilient, self-hostable API.

"Why raccoons?" Because like raccoons, we dig through the digital dumpsters of abandoned GitHub repos and archived projects, rescuing valuable open-source TTS models that orgs have left behind. We give them a new home, maintain them, and make them accessible to everyone.

Why This Matters

Proprietary TTS APIs lock you into vendor ecosystems, charge per character, and can vanish overnight. We're building something different:

Try It Now (Free API)

Test our community-hosted endpoint before self-hosting:

# Auto-detect model from voice name
curl https://speech.ai.unturf.com/v1/audio/speech \
  -H "Content-Type: application/json" \
  -d '{
    "input": "Welcome to uncloseai-speech. Four TTS engines, zero API keys.",
    "voice": "alloy"
  }' > output.mp3

# Explicitly specify model (tts-1, tts-1-hd, tts-1-silero, tts-1-kokoro)
curl https://speech.ai.unturf.com/v1/audio/speech \
  -H "Content-Type: application/json" \
  -d '{
    "model": "tts-1-hd",
    "input": "High quality XTTS voice cloning.",
    "voice": "alloy"
  }' > output-hd.mp3

Auto-Detection Magic

Our voice routing is smart - no need to specify the model:

from openai import OpenAI

client = OpenAI(
    api_key="not-needed",  # Seriously, any string works
    base_url="https://speech.ai.unturf.com/v1"
)

# Auto-detects the right engine for each voice
client.audio.speech.create(
    voice="alloy",      # → Piper (fast CPU)
    input="Fast synthesis on CPU"
).stream_to_file("piper.mp3")

client.audio.speech.create(
    voice="en_50",      # → Silero (native voice name)
    input="CPU-friendly multilingual"
).stream_to_file("silero.mp3")

client.audio.speech.create(
    voice="af_heart",   # → Kokoro (lightweight)
    input="Decoder-only architecture"
).stream_to_file("kokoro.mp3")

Discover Voices

Extended /v1/voices endpoint shows all 227 voices with engine metadata:

curl https://speech.ai.unturf.com/v1/voices | jq .

Discover Models

Standard OpenAI /v1/models endpoint shows available TTS models:

curl https://speech.ai.unturf.com/v1/models | jq .

Self-Hosting

For complete installation instructions and documentation, see the uncloseai-speech repository.

Quick Start

# Clone the repository
git clone https://git.unturf.com/engineering/unturf/uncloseai-speech.git
cd uncloseai-speech

# See all available commands
make help

# Deploy locally with Docker
make local-deploy

# Download voice models (Piper + XTTS samples)
make voices

# Test it
make test

# Watch logs
make logs

That's it. You now have a production TTS API running locally.

Remote Deployment (Production)

Deploy to a GPU server for XTTS voice cloning:

# Configure deployment target
cp vars.sh.example vars.sh
# Edit vars.sh with your server details

# Deploy to remote server (syncs, builds, restarts)
make deploy

# Download all voice models
make voices

# Test remote endpoint
make test

The Four Engines

🏃 Piper TTS (tts-1)

🎙ïļ XTTS v2 (tts-1-hd)

⚡ Silero TTS (tts-1-silero)

ðŸŠķ Kokoro TTS (tts-1-kokoro)

Get Involved

We run a free public endpoint at https://speech.ai.unturf.com/v1 but we need help scaling:

Contribute Infrastructure

Contribute Code

Resources

Complete Example: Voice Cloning

Let's clone your voice and use it via the API:

Step 1: Record Your Voice Sample

# Record 10 seconds of clean audio (22050 Hz, mono)
ffmpeg -f alsa -i default -ac 1 -ar 22050 -t 10 -y my_voice.wav

# Clean up background noise
ffmpeg -i my_voice.wav \
  -af "highpass=f=200, lowpass=f=3000, afftdn=nf=25" \
  -ac 1 -ar 22050 my_voice_clean.wav

Step 2: Add to Voice Configuration

# Copy sample to voices directory
cp my_voice_clean.wav ~/uncloseai-speech/voices/me.wav

# Add to config/voice_to_speaker.yaml
cat >> config/voice_to_speaker.yaml << 'EOF'
tts-1-hd:
  my_voice:
    model: xtts
    speaker: voices/me.wav
    language: en
EOF

# Restart server
make deploy

Step 3: Use Your Voice

from openai import OpenAI

client = OpenAI(
    api_key="not-needed",
    base_url="https://speech.ai.unturf.com/v1"
)

# Generate speech with YOUR voice
client.audio.speech.create(
    model="tts-1-hd",
    voice="my_voice",
    input="This is my cloned voice speaking!"
).stream_to_file("cloned_output.mp3")

That's the power of open source TTS. No API keys, no usage limits, your voice, your infrastructure.

Questions & Community

Ask questions, share your deployments, or discuss TTS research below!