AI Audio

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

FieldTypeRequiredNotes
rolesobject[]Role list: { name, voice_id, audio_url, volume, model }
segmentsobject[]Per-line script (below)
languagestringTarget language
pause_msintPause between segments (ms)
single_trackboolReturn per-role tracks
generate_subtitleboolGenerate SRT subtitles
backgroundobjectBackground music config
tts_modelstringTTS 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. 402 if 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.

On this page