📥 Sonauto API Documentation - Complete Markdown
Berikut adalah konten Markdown lengkap yang bisa Anda copy-paste dan simpan sebagai file .md:
# 🎵 Sonauto API Documentation (Lengkap)
> **Beta** - Dokumentasi resmi untuk Sonauto Developer API
> Build with the Sonauto API. Generate AI music programmatically and integrate music generation into your applications.
> 🌐 Source: [sonauto.ai/developers](https://sonauto.ai/developers)
> 📅 Last Updated: April 2026
---
## 📋 Daftar Isi
1. [Gambaran Umum](#-gambaran-umum)
2. [Harga & Kredit API](#-harga--kredit-api)
3. [Autentikasi](#-autentikasi)
4. [Parameter Generasi (Core)](#-parameter-generasi-core)
5. [Format Output Audio](#-format-output-audio)
6. [Status Generasi](#-status-generasi)
7. [Endpoint Generasi](#-endpoint-generasi)
- [v3 Preview (Beta)](#-v3-preview-beta)
- [v2 - Generate Song](#-v2-generate-song)
- [v2/extend - Extend Song](#-v2extend-extend-song)
- [v2/inpaint - Inpaint Section](#-v2inpaint-inpaint-section)
8. [Generation History & Data Fetching](#-generation-history--data-fetching)
- [⚠️ Penting: Masa Simpan Lagu](#️-penting-masa-simpan-lagu)
- [GET /v1/generations/{task_id}](#-get-v1generationstask_id)
- [GET /v1/generations/status/{task_id}](#-get-v1generationsstatustask_id)
- [Flow Status Generasi](#-flow-status-generasi-reference)
9. [Streaming (v3 Only)](#-streaming-v3-only)
10. [Lyrics Alignment](#-lyrics-alignment)
11. [Contoh Kode](#-contoh-kode)
12. [Best Practices & Tips](#-best-practices--tips)
13. [Referensi GitHub Examples](#-referensi-github-examples)
14. [Troubleshooting](#-troubleshooting)
15. [Dukungan & Komunitas](#-dukungan--komunitas)
---
## 🔍 Gambaran Umum
Sonauto adalah platform AI music generation yang memungkinkan developer untuk:
- ✅ Membuat lagu lengkap dari prompt teks, lirik, atau tag gaya musik
- ✅ Memperpanjang lagu yang sudah ada (`extend`)
- ✅ Mengganti bagian tertentu dari lagu (`inpaint`)
- ✅ Streaming audio real-time (v3)
- ✅ Sinkronisasi lirik ke audio (`align_lyrics`)
**API Domain:** `https://api.sonauto.ai/v1`
**Streaming Domain:** `https://api-stream.sonauto.ai`
> ⚠️ **PENTING:** Lagu yang dihasilkan akan dihapus dari server **7 hari (168 jam)** setelah generasi. Pastikan untuk mengunduh lagu yang ingin Anda simpan!
---
## 💰 Harga & Kredit API
> Pricing untuk API saja. Generasi lagu via website Sonauto tetap **gratis**!
### 🎁 Free Trial
| Item | Detail |
|------|--------|
| Kredit Gratis | **1,500 credits** setelah registrasi |
| Estimasi Lagu | ~15 lagu (1 lagu = 100 credits) |
### 💡 Sistem Kredit
| Aksi | Kredit |
|------|--------|
| 1 lagu (1:35 menit) via v2 | 100 credits |
| 2 lagu sekaligus (`num_songs=2`) | 150 credits |
| Lagu v3 (variable length 2-4 menit) | 100 credits |
### 📦 Paket Berlangganan
| Paket | Harga/Bulan | Kredit | Kredit/Lagu | Kredit Tambahan |
|-------|-------------|--------|-------------|----------------|
| **Starter** | $11 | 20,000 | 200 lagu | $0.06 / 100 credits |
| **Pro** | $88 | 160,000 | 1,600 lagu | $0.06 / 100 credits |
| **Scale** | $330 | 660,000 | 6,600 lagu | $0.05 / 100 credits |
| **Enterprise** | $1,150 | 2,875,000 | 28,750 lagu | $0.04 / 100 credits |
| **Pay As You Go** | - | Beli sesuai kebutuhan | - | $0.06 / 100 credits |
> 📌 **Attribution Required:** Implementasi user-facing API Sonauto **wajib** mencantumkan atribusi ke Sonauto.
---
## 🔐 Autentikasi
Semua endpoint memerlukan API Key di header `Authorization`:
```http
Authorization: Bearer your_api_key_here
Content-Type: application/json
Mendapatkan API Key
- Daftar akun di sonauto.ai
- Kunjungi https://sonauto.ai/developers
- Generate API Key dari dashboard
🔒 Security Best Practices
- ❌ Jangan hardcode API key di client-side code
- ✅ Gunakan environment variables atau secret manager
- ✅ Rotate API key secara berkala
- ✅ Monitor usage via
/credits/balance
⚙️ Parameter Generasi (Core)
Parameter Wajib (Minimal Satu)
Anda harus menyediakan minimal satu dari: tags, lyrics, atau prompt.
| Parameter | Tipe | Deskripsi | Contoh |
|---|---|---|---|
tags | array[string] | Tag gaya musik | ["rock", "energetic", "male vocals"] |
lyrics | string | Lirik lagu yang ingin digunakan | "Verse 1: Today is the day..." |
prompt | string | Deskripsi teks untuk generate tags/lyrics otomatis | "An upbeat rock song with heavy guitar riffs" |
❗ Jika hanya memberikan
lyricsatautagstanpaprompt, sistem akan menolak. Gunakanprompt: ""(string kosong) jika ingin AI sepenuhnya menentukan style/lirik.
Parameter Opsional Umum
| Parameter | Tipe | Default | Deskripsi |
|---|---|---|---|
instrumental | boolean | false | Jika true, hasilkan lagu instrumental (tanpa vokal). Jangan kirim lyrics. |
prompt_strength | float | 2.0 | Nilai tinggi = lebih patuh ke prompt, tapi kurang natural. Range: 0.0 - 10.0 |
balance_strength | float | 0.7 | Tinggi = vokal lebih natural. Rendah = instrumen lebih tajam. (v2 only) |
seed | integer | - | Seed RNG. Same tags+lyrics+seed = same song. (v2 only) |
webhook_url | string | - | URL untuk menerima POST status updates real-time. |
num_songs | integer | 1 | Jumlah lagu yang digenerate (1 atau 2). 2 lagu = 150 credits! (v2 only) |
align_lyrics | boolean | false | Aktifkan lyrics alignment post-processing. |
output_format | string | "ogg" | Format output: mp3, flac, wav, ogg, m4a. |
output_bit_rate | integer | - | Bitrate untuk mp3/m4a: 128, 192, 256, 320 kbps. |
enable_streaming | boolean | false | Aktifkan streaming real-time (v3 only). |
stream_format | string | "ogg" | Format streaming: ogg atau mp3 (v3 only). |
🎧 Format Output Audio
| Format | Container | Codec | Keterangan |
|---|---|---|---|
ogg | Ogg | Opus (VBR) | Default, kualitas terbaik/ukuran kecil |
mp3 | MPEG | MP3 | Kompatibel universal |
flac | FLAC | FLAC | Lossless, ukuran besar |
wav | WAV | PCM | Uncompressed, sangat besar |
m4a | MP4 | AAC | Kompresi efisien, Apple-friendly |
Untuk
mp3danm4a, Anda dapat mengaturoutput_bit_rate(128/192/256/320 kbps).
📊 Status Generasi
Anda dapat memantau status via:
- Polling endpoint
GET /generations/{task_id} - Webhook real-time via
webhook_url
Urutan Status Updates
01. RECEIVED → Request diterima & diparsing
02. TRANSCRIBE_TASK_STARTED → (inpaint/extend only)
03. TRANSCRIBE_STAGE_1 → (inpaint/extend only)
04. TRANSCRIBE_STAGE_2 → (inpaint/extend only)
05. TRANSCRIBE_STAGE_3 → (inpaint/extend only)
06. TRANSCRIBE_DONE → (inpaint/extend only)
07. PROMPT → Konversi prompt ke tags/lyrics
08. TASK_SENT → Task dikirim ke GPU cluster
09. GENERATE_TASK_STARTED → GPU worker mulai mengerjakan
10. LOADING_SOURCE → (inpaint/extend) Fetch source audio
11. BEGINNING_GENERATION → Persiapan akhir sebelum generate
12. GENERATING → 🎵 Lagu sedang digenerate!
13. GENERATING_STREAMING_READY → (v3 only) Siap untuk streaming
14. DECOMPRESSING → Decompress dari latent space
15. SAVING → Upload ke CDN
16. ✅ SUCCESS → Selesai! URL lagu di `song_paths`
17. ❌ FAILURE → Error (tidak ada kredit dipotong)
⚠️ URL di
song_pathsexpire setelah 7 hari. Download segera!
🚀 Endpoint Generasi
🔹 v3 Preview (Beta)
⚠️ Beta: Hasil mungkin lebih rendah kualitasnya dari v2, dan parameter behavior dapat berubah tanpa notice. Gunakan default values untuk hasil terbaik.
Perbedaan v3 vs v2:
- ❌ Tidak mendukung:
seed,balance_strength,bpm,num_songs - ✅ Lagu variable-length (2-4 menit), kualitas audio lebih baik
- ✅ Streaming real-time tersedia
- ✅ Waktu generate lebih lama, tapi bisa mulai dengar lebih cepat via streaming
POST /v1/generations/v3
{
"tags": ["rock", "energetic"],
"lyrics": "Optional lyrics here...",
"prompt": "An upbeat rock song with heavy guitar riffs",
"instrumental": false,
"prompt_strength": 2.0,
"webhook_url": "https://your-webhook.com/sonauto",
"output_format": "ogg",
"output_bit_rate": null,
"enable_streaming": true,
"stream_format": "ogg",
"align_lyrics": false
}
Response
{
"task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
🔹 v2 - Generate Song
POST /v1/generations/v2
Generate lagu 1 menit 35 detik dengan model v2.
{
"tags": ["rock", "energetic"],
"lyrics": "Optional lyrics...",
"prompt": "An upbeat rock song with heavy guitar riffs",
"instrumental": false,
"prompt_strength": 2.0,
"balance_strength": 0.7,
"seed": 42,
"webhook_url": "https://your-webhook.com/sonauto",
"num_songs": 1,
"output_format": "ogg",
"output_bit_rate": null,
"align_lyrics": false,
"bpm": "auto"
}
Parameter Unik v2
| Parameter | Tipe | Deskripsi |
|---|---|---|
bpm | string | integer | null | Beats per minute. Gunakan "auto" untuk auto-pick berdasarkan tags, atau null untuk tidak conditioning. |
Response
{
"task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
🔹 v2/extend - Extend Song
POST /v1/generations/v2/extend
Perpanjang lagu yang sudah ada dari sisi kiri ("left") atau kanan ("right").
{
"audio_url": "https://cdn.sonauto.ai/generations2/audio_xxx.ogg",
"audio_base64": "optional_base64_string",
"side": "right",
"extend_duration": 45.0,
"crop_duration": 0.0,
"tags": ["rock", "energetic"],
"lyrics": "New lyrics for extension...",
"prompt": "Continue the song with a guitar solo",
"instrumental": false,
"prompt_strength": 2.0,
"balance_strength": 0.7,
"seed": 42,
"webhook_url": "https://your-webhook.com/sonauto",
"num_songs": 1,
"output_format": "ogg",
"output_bit_rate": null,
"align_lyrics": false
}
Parameter Unik Extend
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
audio_url | string | ✅* | URL publik lagu source. *Gunakan audio_base64 jika tidak ada URL publik |
audio_base64 | string | ✅* | Base64-encoded audio file (max 40MB) |
side | "left" | "right" | ✅ | Arah extend: "left" = awal lagu, "right" = akhir lagu |
extend_duration | float | ❌ | Durasi audio baru yang digenerate (0 - 85.0 detik) |
crop_duration | float | ❌ | Crop akhir/awal audio original sebelum extend (default: 0.0) |
💡 Tip: Untuk lagu yang digenerate via Sonauto, gunakan URL CDN (
song_paths) sebagaiaudio_url, bukan file yang sudah di-download. Ini mencegah degradasi kualitas karena sistem akan reuse latent representation.
🔹 v2/inpaint - Inpaint Section
POST /v1/generations/v2/inpaint
Ganti bagian tertentu dari lagu dengan konten baru yang digenerate.
{
"audio_url": "https://cdn.sonauto.ai/generations2/audio_xxx.ogg",
"audio_base64": "optional_base64_string",
"sections": [[0.0, 30.0]],
"selection_crop": false,
"tags": ["rock", "energetic"],
"lyrics": "New lyrics for the section",
"prompt": "Replace with a drum break",
"instrumental": false,
"prompt_strength": 2.0,
"balance_strength": 0.7,
"seed": 42,
"webhook_url": "https://your-webhook.com/sonauto",
"num_songs": 1,
"output_format": "ogg",
"output_bit_rate": null,
"align_lyrics": false
}
Parameter Unik Inpaint
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
audio_url / audio_base64 | string | ✅ | Source audio (sama seperti extend) |
sections | array[array[float]] | ✅ | List sections yang diganti. Saat ini hanya 1 section yang didukung. Format: [[start_sec, end_sec]] |
selection_crop | boolean | ❌ | Jika true, output hanya berisi section yang di-inpaint (default: false) |
⚠️
lyricswajib untuk endpoint inpaint.
📜 Generation History & Data Fetching
⚠️ Penting: Masa Simpan Lagu
🗓️ Songs will be deleted from our servers ONE WEEK (168 hours) after generation.
| Poin | Detail |
|---|---|
| URL Expiry | URL di song_paths tidak akan bekerja setelah 7 hari |
| Tidak Dijamin | Dalam beberapa kasus lagu mungkin masih bisa diakses, tapi tidak dijamin |
| Rekomendasi | 📥 Download segera lagu yang ingin Anda simpan permanen! |
🔍 GET /v1/generations/{task_id}
Retrieve hasil generasi lengkap + semua parameter yang digunakan.
📋 Request
GET https://api.sonauto.ai/v1/generations/{task_id}
Authorization: Bearer your_api_key_here
💻 Code Samples
Python
import requests
task_id = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
url = f"https://api.sonauto.ai/v1/generations/{task_id}"
headers = {"Authorization": "Bearer your_api_key_here"}
response = requests.get(url, headers=headers)
print(response.json())
cURL
curl -X GET "https://api.sonauto.ai/v1/generations/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
-H "Authorization: Bearer your_api_key_here"
📦 Response Schema (SUCCESS)
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"created_at": "2026-04-06T10:30:00Z",
"status": "SUCCESS",
"alignment_status": "SUCCESS",
"model_version": "v3-preview",
"song_paths": [
"https://cdn.sonauto.ai/generations3/audio_xxx.ogg"
],
"error_message": null,
"lyrics": "Generated or provided lyrics here...",
"prompt": "An upbeat rock song with heavy guitar riffs",
"prompt_strength": 2.0,
"tags": ["rock", "energetic", "male vocals"],
"v2_params": {
"balance_strength": 0.7,
"seed": 42,
"bpm": "auto"
},
"inpaint_params": null,
"extend_params": null
}
📚 Field Descriptions
| Field | Tipe | Deskripsi |
|---|---|---|
id | string (UUID) | Unique identifier untuk generasi ini |
created_at | string (ISO 8601) | Timestamp kapan generasi dibuat |
status | string | Status utama generasi: RECEIVED, GENERATING, SUCCESS, FAILURE, dll |
alignment_status | string | null | Status lyrics alignment (null jika tidak diminta) |
model_version | string | Versi model: "v2.2", "v3-preview", dll |
song_paths | array[string] | URL(s) audio hasil generate ⚠️ expire 7 hari |
error_message | string | null | Pesan error jika status: "FAILURE" |
lyrics | string | Lirik yang digunakan/dihasilkan |
prompt | string | null | Prompt teks yang digunakan (jika ada) |
prompt_strength | float | Nilai kepatuhan prompt (semakin tinggi = lebih patuh tapi kurang natural) |
tags | array[string] | Array tag gaya musik yang digunakan |
🔹 v2_params (Hanya untuk model v2, null untuk v3)
| Field | Tipe | Deskripsi |
|---|---|---|
balance_strength | float | Tinggi = vokal lebih natural. Rendah = instrumen lebih tajam. Rekomendasi: 0.7 |
seed | integer | Random seed untuk reproducibility |
bpm | string | integer | null | Beats per minute: "auto", angka, atau null |
🔹 inpaint_params (Hanya jika operasi inpaint)
| Field | Tipe | Deskripsi |
|---|---|---|
sections | array[array[float]] | Sections yang di-inpaint: [[start_sec, end_sec]] |
selection_crop | boolean | Jika true, output hanya section yang di-inpaint |
audio_url | string | URL source audio yang digunakan |
lyrics | string | Lirik untuk section yang di-inpaint |
🔹 extend_params (Hanya jika operasi extend)
| Field | Tipe | Deskripsi |
|---|---|---|
side | string | Arah extend: "left" atau "right" |
crop_duration | float | Durasi crop dari audio original sebelum extend |
audio_url | string | URL source audio yang digunakan |
duration | float | Durasi extend yang diminta |
lyrics | string | Lirik untuk bagian extend |
⚡ GET /v1/generations/status/{task_id}
Cek status task secara ringan (tanpa metadata lengkap). Ideal untuk polling.
📋 Request
GET https://api.sonauto.ai/v1/generations/status/{task_id}?include_alignment=true
Authorization: Bearer your_api_key_here
🔧 Query Parameters
| Parameter | Tipe | Default | Deskripsi |
|---|---|---|---|
task_id | string | - | UUID task yang ingin dicek |
include_alignment | boolean | false | Jika true, return JSON dengan status + alignment_status |
📦 Response
Default (tanpa include_alignment)
"SUCCESS"
Returns plain string dengan status generasi.
Dengan include_alignment=true
{
"status": "SUCCESS",
"alignment_status": "SUCCESS"
}
🔄 Flow Status Generasi (Reference)
01. RECEIVED
02. TRANSCRIBE_TASK_STARTED → (inpaint/extend only)
03. TRANSCRIBE_STAGE_1-3 → (inpaint/extend only)
04. TRANSCRIBE_DONE → (inpaint/extend only)
05. PROMPT → Konversi prompt ke tags/lyrics
06. TASK_SENT → Task dikirim ke GPU cluster
07. GENERATE_TASK_STARTED → GPU worker mulai mengerjakan
08. LOADING_SOURCE → (inpaint/extend) Fetch source audio
09. BEGINNING_GENERATION → Persiapan akhir sebelum generate
10. GENERATING → 🎵 Lagu sedang digenerate!
11. GENERATING_STREAMING_READY → (v3 only) Siap untuk streaming
12. DECOMPRESSING → Decompress dari latent space
13. SAVING → Upload ke CDN
14. ✅ SUCCESS → Selesai! URL lagu di `song_paths`
15. ❌ FAILURE → Error (tidak ada kredit dipotong)
🌊 Streaming (v3 Only)
Streaming memungkinkan Anda memutar lagu sementara masih digenerate.
Prasyarat
- Hanya tersedia untuk generasi v3
- Wajib set
"enable_streaming": truesaat request generasi - Streaming endpoint hanya aktif selama generasi berjalan + beberapa detik setelah selesai
GET https://api-stream.sonauto.ai/stream/{task_id}
Parameters
| Parameter | Lokasi | Wajib | Deskripsi |
|---|---|---|---|
task_id | URL Path | ✅ | Task ID dari response generasi v3 |
Response Headers
Content-Type: audio/ogg; codecs="opus"
# atau
Content-Type: audio/mpeg (jika stream_format: "mp3")
Error Handling
| Status | Penyebab |
|---|---|
400 Bad Request | Track belum siap streaming. Tunggu status GENERATING_STREAMING_READY |
Contoh Penggunaan
HTML Audio Element
<audio controls autoplay>
<source
src="https://api-stream.sonauto.ai/stream/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
type="audio/ogg"
/>
Your browser does not support the audio element.
</audio>
Python (requests)
import requests
task_id = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
url = f"https://api-stream.sonauto.ai/stream/{task_id}"
headers = {"Authorization": "Bearer your_api_key_here"}
with requests.get(url, headers=headers, stream=True) as r:
r.raise_for_status()
with open("streaming_output.ogg", "wb") as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
🔤 Lyrics Alignment
Fitur opsional untuk menghasilkan word-level timing data yang mensinkronkan lirik ke audio.
Persyaratan
- Hanya untuk lagu non-instrumental dengan lirik
- v2: Wajib
num_songs=1saatalign_lyrics=true - Set
"align_lyrics": truedi request generasi
Status Flow Alignment
REQUESTED → TASK_SENT → ALIGNING → ✅ SUCCESS / ❌ FAILURE
⚠️ Jika generasi utama
FAILURE,alignment_statustetapREQUESTED(alignment tidak pernah dijalankan). Selalu cekstatusutama dulu!
Cara Cek Alignment Status
Gunakan endpoint status dengan include_alignment=true:
GET /v1/generations/status/{task_id}?include_alignment=true
Response:
{
"status": "SUCCESS",
"alignment_status": "SUCCESS"
}
Output Alignment
Setelah alignment_status: "SUCCESS", Anda dapat mengambil data alignment via endpoint /generations/{task_id}. Data alignment berisi timestamp per kata untuk sinkronisasi lirik.
💻 Contoh Kode
Python: Generate Lagu v2
import requests
url = "https://api.sonauto.ai/v1/generations/v2"
headers = {
"Authorization": "Bearer your_api_key_here",
"Content-Type": "application/json"
}
payload = {
"tags": ["rock", "energetic"],
"prompt": "An upbeat rock song with heavy guitar riffs",
"num_songs": 1,
"output_format": "mp3",
"output_bit_rate": 320
}
response = requests.post(url, json=payload, headers=headers)
task_id = response.json()["task_id"]
print(f"Task ID: {task_id}")
# Polling status
import time
while True:
status_url = f"https://api.sonauto.ai/v1/generations/status/{task_id}"
status = requests.get(status_url, headers=headers).json()
print(f"Status: {status}")
if status in ["SUCCESS", "FAILURE"]:
break
time.sleep(5)
# Ambil hasil
if status == "SUCCESS":
result = requests.get(
f"https://api.sonauto.ai/v1/generations/{task_id}",
headers=headers
).json()
print(f"Download URL: {result['song_paths'][0]}")
cURL: Generate Lagu v3 dengan Streaming
# 1. Request generasi
curl -X POST https://api.sonauto.ai/v1/generations/v3 \
-H "Authorization: Bearer your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A chill lofi beat for studying",
"tags": ["lofi", "chill", "instrumental"],
"instrumental": true,
"enable_streaming": true,
"stream_format": "mp3"
}'
# 2. Streaming (setelah status GENERATING_STREAMING_READY)
curl -H "Authorization: Bearer your_api_key_here" \
https://api-stream.sonauto.ai/stream/YOUR_TASK_ID \
--output song_stream.mp3
Python: Upload Audio via Base64 (Extend/Inpaint)
import base64
import requests
# Baca file audio & encode ke base64
with open("source_song.ogg", "rb") as f:
audio_b64 = base64.b64encode(f.read()).decode("utf-8")
url = "https://api.sonauto.ai/v1/generations/v2/extend"
headers = {
"Authorization": "Bearer your_api_key_here",
"Content-Type": "application/json"
}
payload = {
"audio_base64": audio_b64,
"side": "right",
"extend_duration": 30.0,
"prompt": "Add a guitar solo outro",
"tags": ["rock", "guitar"]
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
⚠️ Batas ukuran file base64: 40MB
Python: Polling dengan Exponential Backoff
import time
import requests
def wait_for_completion(task_id, api_key, interval=5, timeout=300):
"""Poll status dengan exponential backoff sederhana"""
url = f"https://api.sonauto.ai/v1/generations/status/{task_id}"
headers = {"Authorization": f"Bearer {api_key}"}
start_time = time.time()
while time.time() - start_time < timeout:
response = requests.get(url, headers=headers)
status = response.json()
if status in ["SUCCESS", "FAILURE"]:
return status
elif status == "GENERATING":
print(f"⏳ Masih generating... ({int(time.time()-start_time)}s)")
time.sleep(interval)
raise TimeoutError(f"Task {task_id} belum selesai dalam {timeout} detik")
Python: Download Otomatis Setelah SUCCESS
def download_song(task_id, api_key, output_path="song.ogg"):
"""Ambil hasil dan download langsung"""
headers = {"Authorization": f"Bearer {api_key}"}
# 1. Cek status dulu
status_url = f"https://api.sonauto.ai/v1/generations/status/{task_id}"
if requests.get(status_url, headers=headers).json() != "SUCCESS":
return False
# 2. Ambil detail + URL
detail_url = f"https://api.sonauto.ai/v1/generations/{task_id}"
data = requests.get(detail_url, headers=headers).json()
# 3. Download audio
song_url = data["song_paths"][0]
audio = requests.get(song_url).content
with open(output_path, "wb") as f:
f.write(audio)
print(f"✅ Downloaded: {output_path}")
return True
🎯 Best Practices & Tips
✅ Do's
- Gunakan webhook untuk integrasi real-time, hindari polling berlebihan
- Download segera lagu yang dihasilkan (URL expire 7 hari)
- Gunakan CDN URL (
song_paths) sebagaiaudio_urluntuk extend/inpaint (hindari re-encode) - Set
align_lyrics=truejika butuh sinkronisasi lirik untuk UI/karaoke - Gunakan
seeddi v2 untuk reproducibility selama development - Monitor kredit via
/credits/balancesebelum request besar - Simpan task_id di database Anda untuk tracking history
❌ Don'ts
- Jangan hardcode API key di client-side code
- Jangan asumsikan
song_pathspermanen — selalu download & backup - Jangan set
prompt_strengthterlalu tinggi (>3.0) — hasil bisa tidak natural - Jangan gunakan
num_songs=2jika tidak perlu — lebih hemat kredit dengan 2 request terpisah - Jangan lupa handle error
FAILUREdengan retry logic
🔧 Troubleshooting
| Masalah | Penyebab Mungkin | Solusi |
|---|---|---|
401 Unauthorized | API key salah/tidak ada di header | Periksa Authorization: Bearer ... |
400 Bad Request | Parameter tidak valid | Validasi: minimal satu dari tags/lyrics/prompt |
| Lagu tidak natural | prompt_strength terlalu tinggi | Turunkan ke 1.5 atau naikkan balance_strength ke 0.8 |
| Streaming 400 | Belum ready atau v2 model | Pastikan enable_streaming: true & model v3 |
| Alignment gagal | Instrumental / num_songs>1 | Pastikan lagu punya lirik & num_songs=1 untuk v2 |
404 Not Found pada task_id | ID salah / sudah expired | Verifikasi UUID, cek apakah sudah >7 hari |
song_paths kosong tapi SUCCESS | Bug sementara / alignment proses | Tunggu beberapa detik, polling ulang |
URL song_paths tidak bisa diakses | Sudah expire (>7 hari) | Download segera setelah SUCCESS |
📊 Polling vs Webhook Comparison
| Metode | Kelebihan | Kekurangan | Use Case |
|---|---|---|---|
| Webhook | Real-time, efisien, tidak perlu polling | Perlu server publik, setup lebih kompleks | Production, high-volume apps |
| Polling | Simple, tidak perlu server eksternal | Less efficient, perlu manage interval & timeout | Development, testing, low-volume |
💡 Rekomendasi: Gunakan webhook untuk production, polling untuk development/testing.
📦 Referensi GitHub Examples
Sonauto menyediakan repository contoh resmi:
🔗 github.com/Sonauto/sonauto-api-examples
Contoh Script Tersedia
| File | Deskripsi |
|---|---|
rock_song_generator.py | Generate lagu rock sederhana dengan prompt |
transition_generator.py | Buat transisi mulus antara 2 lagu YouTube |
singing_telegram.py | Buat video "singing telegram" dengan integrasi Lemon Slice API |
Instalasi Contoh
git clone https://github.com/Sonauto/sonauto-api-examples.git
cd sonauto-api-examples
pip install -r requirements.txt
# Setup environment
cp .env.example .env
# Edit .env: tambahkan SONAUTO_API_KEY dan (opsional) LEMONSLICE_API_KEY
Contoh: Transition Generator
# Transisi dari Smash Mouth ke Rick Astley
python transition_generator.py ec1LhrCmzwI dQw4w9WgXcQ \
--trim-to-start 13 \
--trim-from-end 0.5 \
--silence 20 \
--output my_transition.ogg
🔗 Related Endpoints Summary
| Endpoint | Method | Deskripsi |
|---|---|---|
/v1/generations/v2 | POST | Generate lagu dengan model v2 |
/v1/generations/v3 | POST | Generate lagu dengan model v3 (beta) |
/v1/generations/v2/extend | POST | Extend lagu yang sudah ada |
/v1/generations/v2/inpaint | POST | Inpaint/replace section lagu |
/v1/generations/{task_id} | GET | 📜 Ambil hasil generasi lengkap |
/v1/generations/status/{task_id} | GET | ⚡ Cek status task (lightweight) |
/v1/credits/balance | GET | Cek sisa kredit akun |
https://api-stream.sonauto.ai/stream/{task_id} | GET | 🌊 Streaming audio real-time (v3) |
📞 Dukungan & Komunitas
| Channel | Link |
|---|---|
| 🌐 Website | sonauto.ai |
| 💬 Discord | Join Community |
| 🐦 Twitter/X | @sonauto_ai |
| 📧 Enterprise/Custom Plan | Hubungi tim Sonauto via website |
| 🐛 Bug Reports | Discord atau GitHub Issues |
📝 Changelog & Notes
⚠️ Beta Notice
Karena API masih dalam beta, parameter dan behavior dapat berubah tanpa notice. Selalu periksa dokumentasi resmi untuk update terbaru.
Known Limitations
- Inpaint hanya mendukung 1 section per request
- Alignment hanya tersedia untuk lagu non-instrumental dengan lirik
- Streaming hanya tersedia untuk model v3
song_pathsURL expire setelah 7 hari (168 jam)
Future Features (Rumored)
- Batch generation endpoints
- Advanced lyrics alignment with phoneme-level timing
- Custom model fine-tuning API
- Webhook management dashboard
📄 License & Attribution
Attribution Required:
Implementasi user-facing API Sonauto wajib mencantumkan atribusi ke Sonauto.
Contoh atribusi:
"Music generated with Sonauto AI - sonauto.ai"
📌 Quick Reference Card
CodeAPI Base: https://api.sonauto.ai/v1 Stream Base: https://api-stream.sonauto.ai Auth: Authorization: Bearer YOUR_API_KEY Credits: 1 lagu v2 = 100 credits | 2 lagu = 150 credits | v3 = 100 credits Expiry: Download songs within 7 days!
> 🔄 *Dokumentasi ini berdasarkan konten resmi sonauto.ai/developers. Selalu cek sumber untuk update terbaru.*
