v1 API now available

Voice AI
for developers

Real-time speech translation, tone analysis, voice cloning, and intent recognition. One API. Three lines of code. 97 languages.

translate.py Python
import voicechat

client = voicechat.Client("vc_live_...")

# Browse voices and pick one
voices = client.voices.list(category="iconic")
freeman = voices[0]  # → { voice_id: "vc_freeman_01", ... }

# Translate using that voice
result = client.translate(
    audio="meeting_clip.wav",
    source="en",
    target="ja",
    voice_id=freeman.id,   # ← speak as Freeman
    detect_tone=True,
)

# result.audio → translated WAV in Freeman's voice
# result.transcript → "Q2にローンチを延期すべきです"
# result.tone → { "label": "confident", "score": 0.94 }
200 OK · 340ms
{
  "audio_url": "https://api.voice.chat/v1/audio/tx_8f3k...",
  "transcript": "Q2にローンチを延期すべきです",
  "voice": { "id": "vc_freeman_01", "name": "Morgan Freeman" },
  "tone": { "label": "confident", "score": 0.94 },
  "language_detected": "en",
  "duration_ms": 3420
}
<300ms
Average latency
97
Languages
99.7%
Uptime SLA
SOC 2
Certified
API Reference

Seven endpoints. Infinite possibilities.

Everything you need to add real-time voice intelligence to your app. Browse voices, translate speech, analyze tone, and manage rooms. REST for one-off requests, WebSocket for streaming.

POST /v1/translate
Translate Speech
Upload audio, receive translated audio and transcript. Pass a voice_id from the library or a cloned voice to control who it sounds like. Supports tone detection and intent tagging in a single call.
{
  "audio": "base64_or_url",
  "source_lang": "en",
  "target_lang": "ja",
  "voice_id": "vc_freeman_01",  // or "self" for own voice
  "detect_tone": true,
  "detect_intent": true
}
WS /v1/stream
Stream Translation
WebSocket endpoint for real-time streaming translation. Send audio chunks, receive translated audio chunks. Simultaneous mode starts translating before the speaker finishes.
ws://api.voice.chat/v1/stream
  ?source=en
  &target=pt
  &mode=simultaneous
  &voice_id=vc_freeman_01

→ Send: binary audio frames (PCM 16kHz)
← Recv: translated audio + JSON metadata
POST /v1/analyze
Analyze Voice
Detect tone (confident, hesitant, warm, urgent), intent (question, commitment, concern), and speaker sentiment. Works on any audio input.
// Response
{
  "tone": {
    "primary": "confident",
    "secondary": "warm",
    "scores": { ... }
  },
  "intent": ["commitment", "action_item"],
  "sentiment": 0.82
}
GET /v1/voices
List Voices
Browse the full voice library. Filter by category, language, or search by name. Returns voice_id, metadata, and a preview URL for each voice. Use voice_id in /translate or /stream calls.
GET /v1/voices?category=iconic&limit=5

// Response
{
  "voices": [
    {
      "voice_id": "vc_freeman_01",
      "name": "Morgan Freeman",
      "category": "iconic",
      "tags": ["narrator", "calm", "deep"],
      "languages": ["en", "es", "fr", "de", "ja"],
      "preview_url": "https://cdn.voice.chat/previews/freeman.mp3",
      "popularity_rank": 1
    },
    {
      "voice_id": "vc_attenborough_01",
      "name": "David Attenborough",
      ...
    }
  ],
  "total": 142,
  "categories": ["iconic", "political", "culture",
    "fictional", "custom"]
}
POST /v1/voices/{id}/preview
Preview Voice
Send any text and hear it spoken in the selected voice. Use this to let users audition voices before committing. Returns a short audio clip.
POST /v1/voices/vc_freeman_01/preview
{
  "text": "Welcome to the meeting.",
  "language": "en"
}

// Response
{
  "audio_url": "https://cdn.voice.chat/prev/tx_p2k...",
  "duration_ms": 1840,
  "voice_id": "vc_freeman_01",
  "voice_name": "Morgan Freeman"
}
POST /v1/voice/clone
Clone Voice
Create a custom voice profile from as little as 10 seconds of audio. The returned voice_id works the same as a library voice in any translate or stream call.
{
  "audio": "base64_reference_clip",
  "name": "Sarah - Sales Lead"
}

// Response
{
  "voice_id": "vc_custom_9x2k...",
  "quality_score": 0.96,
  "ready": true
}
GET /v1/rooms
Room Management
Create, list, and manage multi-participant voice rooms with per-user language settings. Rooms handle routing, translation, and track management automatically.
POST /v1/rooms
{
  "name": "daily-standup",
  "max_participants": 12,
  "auto_translate": true,
  "recording": false
}

// Returns room_id + join tokens
Built for Production

Everything that matters at scale

Not a wrapper around open source models. A purpose-built inference pipeline optimized for real-time voice.

Streaming first

Simultaneous translation starts before the speaker finishes. WebSocket-native architecture with chunked audio processing for sub-300ms latency.

Zero retention

Audio data is processed in memory and never stored. No logs, no recordings, no training on your data. SOC 2 Type II and HIPAA ready.

Edge inference

GPU nodes in 6 regions. Audio is processed at the nearest edge, not routed to a central data center. <40ms network hop for most users.

Voice identity

Clone any voice from 10 seconds of audio. Translated speech preserves the original speaker's pitch, cadence, and rhythm across every language.

Intent extraction

Every utterance is tagged: question, commitment, concern, action item, agreement. Build smart meeting summaries and follow-up workflows automatically.

Tone analytics

Detect confidence, hesitation, warmth, urgency, and frustration from vocal prosody. Feed emotional intelligence into your UX, CRM, or agent systems.

SDKs

Your language. Our voice.

Official SDKs for every major platform. Install, authenticate, call. Full TypeScript definitions included.

Python
Node.js
Go
cURL
import voicechat

client = voicechat.Client("vc_live_sk_...")

# Browse the voice library
voices = client.voices.list(category="iconic", limit=10)
for v in voices:
    print(v.name, v.voice_id)  # "Morgan Freeman", "vc_freeman_01"

# Preview a voice before using it
preview = client.voices.preview("vc_freeman_01", text="Hello team")
preview.play()  # hear it locally

# Translate with that voice
result = client.translate(
    audio=open("input.wav", "rb"),
    target="es",
    voice_id="vc_freeman_01",  # or "self" for your own voice
)

result.save_audio("translated.wav")
print(result.transcript)   # "Deberíamos posponer el lanzamiento..."
print(result.tone)         # {"label": "confident", "score": 0.94}

# Stream in real time with a voice
async with client.stream(target="ja", voice_id="vc_freeman_01") as ws:
    async for chunk in mic_input():
        translated = await ws.send(chunk)
        speaker.play(translated.audio)
import { VoiceChat } from '@voicechat/sdk';

const client = new VoiceChat('vc_live_sk_...');

// Browse and pick a voice
const voices = await client.voices.list({ category: 'iconic' });
const freeman = voices.find(v => v.name === 'Morgan Freeman');

// Preview it
const preview = await client.voices.preview(freeman.voiceId, {
  text: 'Welcome to the meeting.'
});
console.log(preview.audioUrl); // play this for the user

// Translate with that voice
const result = await client.translate({
  audio: fs.readFileSync('input.wav'),
  target: 'es',
  voiceId: freeman.voiceId,
  detectTone: true,
});

// Stream with a voice
const stream = client.createStream({
  target: 'pt',
  voiceId: 'vc_freeman_01'
});

stream.on('translated', (chunk) => {
  speaker.write(chunk.audio);
});

micStream.pipe(stream);
import "github.com/voicechat/go-sdk"

client := voicechat.NewClient("vc_live_sk_...")

// List voices
voices, _ := client.Voices.List(ctx, &voicechat.VoiceFilter{
    Category: "iconic",
})
freeman := voices[0] // { VoiceID: "vc_freeman_01", Name: "Morgan Freeman" }

// Preview
preview, _ := client.Voices.Preview(ctx, freeman.VoiceID, "Hello team")
fmt.Println(preview.AudioURL)

// Translate with that voice
result, _ := client.Translate(ctx, &voicechat.TranslateRequest{
    Audio:      audioBytes,
    TargetLang: "de",
    VoiceID:    freeman.VoiceID,
    DetectTone: true,
})

fmt.Println(result.Transcript)  // "Wir sollten den Start verschieben..."

// Stream with a voice
stream, _ := client.Stream(ctx, &voicechat.StreamOpts{
    Target:  "ja",
    VoiceID: "vc_freeman_01",
    Mode:    voicechat.Simultaneous,
})

for chunk := range micInput {
    translated, _ := stream.Send(chunk)
    speaker.Play(translated.Audio)
}
# List available voices
curl https://api.voice.chat/v1/voices?category=iconic \
  -H "Authorization: Bearer vc_live_sk_..."

# Preview a voice
curl -X POST https://api.voice.chat/v1/voices/vc_freeman_01/preview \
  -H "Authorization: Bearer vc_live_sk_..." \
  -H "Content-Type: application/json" \
  -d '{"text": "Hello team", "language": "en"}'

# Translate with a voice
curl -X POST https://api.voice.chat/v1/translate \
  -H "Authorization: Bearer vc_live_sk_..." \
  -F "audio=@input.wav" \
  -F "target_lang=es" \
  -F "voice_id=vc_freeman_01" \
  -F "detect_tone=true"

# Clone a custom voice (returns a voice_id you can reuse)
curl -X POST https://api.voice.chat/v1/voice/clone \
  -H "Authorization: Bearer vc_live_sk_..." \
  -F "audio=@reference.wav" \
  -F "name=My Custom Voice"
Pricing

Pay for what you use

No minimums. No contracts. Free tier to get started. Scale when you're ready.

Free
$0
100 minutes / month
  • All endpoints
  • 10 languages
  • 5 library voices
  • Tone detection
  • 1 voice clone
  • Community support
Enterprise
Custom
volume discounts from 10M+ seconds
  • Everything in Pro
  • Dedicated GPU cluster
  • Custom model fine-tuning
  • Private voice library
  • On-prem deployment
  • HIPAA + BAA
  • Dedicated support engineer
Try It Live

API Playground

Test the translate endpoint right here. No API key required for the playground.

POST /v1/translate
Ready
Request
Click to record or drop a file
Response
// Response will appear here
// Click "Send Request" to test

{
  "status": "waiting",
  "hint": "Record or upload audio first"
}
pip install voicechat Copy

Build with
every voice

Get your API key in 30 seconds. First 100 minutes free every month. No credit card required.