AI Dubbing
Multi-segment dubbing — per-line text, voice and emotion
AI Dubbing is podcast manual mode: you provide per-line script (text + voice + emotion + rate),
synthesized into a dubbing track. Shares one engine with AI Podcast; mode is
locked to manual. Async task; poll for status after submitting.
Base URL:
https://api.aiclonevoicefree.com| Auth:Authorization: Bearer sk_...
POST /api/v2/voice/dubbing
| Field | Type | Required | Notes |
|---|---|---|---|
roles | object[] | ✅ | Role list: { name, voice_id, audio_url, volume, model } |
segments | object[] | ✅ | Per-line script (below) |
language | string | ⬜ | Target language |
pause_ms | int | ⬜ | Pause between segments (ms) |
single_track | bool | ⬜ | Return per-role tracks |
generate_subtitle | bool | ⬜ | Generate SRT subtitles |
background | object | ⬜ | Background music config |
tts_model | string | ⬜ | TTS model |
segments[]: { text, voice_id, audio_url, role, speed_ratio, pitch_ratio, volume_ratio, emotion_mode, emotion_vector (8-dim [joy,anger,sorrow,fear,excitement,depression,surprise,calm]), emotion_text, emotion_reference_audio_url }
Billing
Same as podcast: CJK chars 2 credits each, others 1 credit each, settled on completion.
402if insufficient.
Example
curl -X POST https://api.aiclonevoicefree.com/api/v2/voice/dubbing \
-H "Authorization: Bearer sk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"roles": [{ "name": "Narrator", "audio_url": "https://your-cdn.com/narrator.wav" }],
"segments": [
{ "role": "Narrator", "audio_url": "https://your-cdn.com/narrator.wav", "text": "Once upon a time...", "speed_ratio": 1.0, "emotion_mode": "text", "emotion_text": "calm, warm" }
],
"generate_subtitle": true
}'Response 202 → { "task_id": "...", "status": "pending", "capability": "voice", "action": "multi-segment" }
Getting the result
Poll GET /api/v2/tasks/{task_id}; audioUrl (or per-role tracks in single-track mode) holds the result.