venice-audio-music
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseVenice Music / Async Audio
Venice 音乐/异步音频
Music (and long-form voice) generation is asynchronous. The flow is:
POST /api/v1/audio/quote → price in USD
POST /api/v1/audio/queue → { queue_id } (funds reserved)
POST /api/v1/audio/retrieve → status or binary audio
POST /api/v1/audio/complete → finalize & delete mediaFor short text-to-speech, use the synchronous endpoint instead.
venice-audio-speech音乐(以及长语音)生成是异步的。流程如下:
POST /api/v1/audio/quote → 美元计价
POST /api/v1/audio/queue → { queue_id } (预扣资金)
POST /api/v1/audio/retrieve → 状态或二进制音频文件
POST /api/v1/audio/complete → 完成并删除媒体文件对于短文本转语音场景,请使用同步的 接口。
venice-audio-speechUse when
适用场景
- You need songs, jingles, score, soundscape, or long narration.
- The selected model uses duration-based or character-based pricing and must be priced before submission.
- The expected generation time is long enough (> 20 s) that sync call would time out.
- 需要生成歌曲、广告配乐、配乐、音景或长旁白时。
- 所选模型采用时长计费或字符计费,提交前需确认价格。
- 预期生成时长较长(>20秒),同步调用会超时的情况。
Lifecycle
生命周期
1. POST /audio/quote
— price it first
POST /audio/quote1. POST /audio/quote
— 先询价
POST /audio/quotebash
curl https://api.venice.ai/api/v1/audio/quote \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "elevenlabs-music",
"duration_seconds": 60
}'Response: (USD).
{"quote": 0.48}| Field | Notes |
|---|---|
| Required. Music/audio model from |
| Integer or numeric string. Only if the model reports duration metadata. |
| Required for models with |
bash
curl https://api.venice.ai/api/v1/audio/quote \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "elevenlabs-music",
"duration_seconds": 60
}'响应:(美元)。
{"quote": 0.48}| 字段 | 说明 |
|---|---|
| 必填项。从 |
| 整数或数字字符串。仅适用于报告时长元数据的模型。 |
| 对于采用 |
2. POST /audio/queue
— enqueue
POST /audio/queue2. POST /audio/queue
— 加入队列
POST /audio/queuebash
curl https://api.venice.ai/api/v1/audio/queue \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "elevenlabs-music",
"prompt": "Uplifting indie-folk acoustic track, 120 BPM, major key.",
"lyrics_prompt": "Verse 1: Walking through the city lights...\nChorus: We are the dreamers...",
"duration_seconds": 60,
"voice": "Aria",
"language_code": "en",
"speed": 1.0,
"force_instrumental": false,
"lyrics_optimizer": false
}'Response: .
{ "model": "...", "queue_id": "uuid" }| Field | Notes |
|---|---|
| Required. |
| Required. Describe genre, mood, tempo, instruments. Length caps in |
| Lyrics. Required when |
| Integer or string. Model-dependent. |
| Only when |
| Auto-generate lyrics from |
| For voice-enabled models. See |
| ISO 639-1. Requires |
| Requires |
bash
curl https://api.venice.ai/api/v1/audio/queue \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "elevenlabs-music",
"prompt": "欢快的独立民谣原声曲目,120 BPM,大调。",
"lyrics_prompt": "主歌1:漫步在城市灯光下...\n副歌:我们是追梦者...",
"duration_seconds": 60,
"voice": "Aria",
"language_code": "en",
"speed": 1.0,
"force_instrumental": false,
"lyrics_optimizer": false
}'响应:。
{ "model": "...", "queue_id": "uuid" }| 字段 | 说明 |
|---|---|
| 必填项。 |
| 必填项。描述流派、情绪、节奏、乐器。长度限制见 |
| 歌词内容。当 |
| 整数或字符串。取决于模型。 |
| 仅适用于 |
| 根据 |
| 适用于支持音色的模型。查看 |
| ISO 639-1标准代码。需要 |
| 需要 |
3. POST /audio/retrieve
— poll status / download
POST /audio/retrieve3. POST /audio/retrieve
— 轮询状态/下载
POST /audio/retrievebash
curl https://api.venice.ai/api/v1/audio/retrieve \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"elevenlabs-music","queue_id":"..."}' \
--output track.mp3- If still processing: JSON .
{"status":"PROCESSING","average_execution_time":...,"execution_duration":...} - If done: binary audio body (or similar). Save the bytes.
audio/mpeg - Set to skip step 4.
delete_media_on_completion: true
Poll every 2–5 s; use (ms, P80) as a guideline for your first poll delay.
average_execution_timebash
curl https://api.venice.ai/api/v1/audio/retrieve \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"elevenlabs-music","queue_id":"..."}' \
--output track.mp3- 若仍在处理中:返回JSON 。
{"status":"PROCESSING","average_execution_time":...,"execution_duration":...} - 若处理完成:返回二进制音频主体(或类似格式)。保存字节数据。
audio/mpeg - 设置 可跳过第4步。
delete_media_on_completion: true
每2-5秒轮询一次;可参考 (毫秒,P80值)设置首次轮询延迟。
average_execution_time4. POST /audio/complete
— cleanup
POST /audio/complete4. POST /audio/complete
— 清理
POST /audio/completebash
curl https://api.venice.ai/api/v1/audio/complete \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"elevenlabs-music","queue_id":"..."}'Removes the media from Venice storage after you've downloaded it. Required unless you used on retrieve.
delete_media_on_completion: truebash
curl https://api.venice.ai/api/v1/audio/complete \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"elevenlabs-music","queue_id":"..."}'下载完成后从Venice存储中删除媒体文件。除非在retrieve时设置了 ,否则此步骤为必填项。
delete_media_on_completion: trueFull loop (TypeScript)
完整流程(TypeScript)
ts
const base = 'https://api.venice.ai/api/v1'
const headers = {
Authorization: `Bearer ${process.env.VENICE_API_KEY}`,
'Content-Type': 'application/json',
}
async function generateTrack() {
// 1. Quote
const quote = await fetch(`${base}/audio/quote`, {
method: 'POST', headers,
body: JSON.stringify({ model: 'elevenlabs-music', duration_seconds: 60 }),
}).then(r => r.json())
console.log('price:', quote.quote)
// 2. Queue
const { queue_id, model } = await fetch(`${base}/audio/queue`, {
method: 'POST', headers,
body: JSON.stringify({
model: 'elevenlabs-music',
prompt: 'Uplifting indie-folk acoustic track, 120 BPM.',
duration_seconds: 60,
force_instrumental: true,
}),
}).then(r => r.json())
// 3. Poll
while (true) {
const res = await fetch(`${base}/audio/retrieve`, {
method: 'POST', headers,
body: JSON.stringify({ model, queue_id }),
})
const ct = res.headers.get('content-type') ?? ''
if (ct.startsWith('audio/')) {
const buf = Buffer.from(await res.arrayBuffer())
await fs.writeFile('track.mp3', buf)
break
}
const { status } = await res.json()
if (status !== 'PROCESSING') throw new Error(`unexpected ${status}`)
await new Promise(r => setTimeout(r, 3000))
}
// 4. Complete
await fetch(`${base}/audio/complete`, {
method: 'POST', headers,
body: JSON.stringify({ model, queue_id }),
})
}ts
const base = 'https://api.venice.ai/api/v1'
const headers = {
Authorization: `Bearer ${process.env.VENICE_API_KEY}`,
'Content-Type': 'application/json',
}
async function generateTrack() {
// 1. 询价
const quote = await fetch(`${base}/audio/quote`, {
method: 'POST', headers,
body: JSON.stringify({ model: 'elevenlabs-music', duration_seconds: 60 }),
}).then(r => r.json())
console.log('price:', quote.quote)
// 2. 加入队列
const { queue_id, model } = await fetch(`${base}/audio/queue`, {
method: 'POST', headers,
body: JSON.stringify({
model: 'elevenlabs-music',
prompt: '欢快的独立民谣原声曲目,120 BPM。',
duration_seconds: 60,
force_instrumental: true,
}),
}).then(r => r.json())
// 3. 轮询
while (true) {
const res = await fetch(`${base}/audio/retrieve`, {
method: 'POST', headers,
body: JSON.stringify({ model, queue_id }),
})
const ct = res.headers.get('content-type') ?? ''
if (ct.startsWith('audio/')) {
const buf = Buffer.from(await res.arrayBuffer())
await fs.writeFile('track.mp3', buf)
break
}
const { status } = await res.json()
if (status !== 'PROCESSING') throw new Error(`unexpected ${status}`)
await new Promise(r => setTimeout(r, 3000))
}
// 4. 完成清理
await fetch(`${base}/audio/complete`, {
method: 'POST', headers,
body: JSON.stringify({ model, queue_id }),
})
}Capability probing
模型能力探测
Before calling , inspect the model entry returned by — each row's exposes (among other fields):
/audio/queueGET /models?type=musicmodel_spec- ,
supports_lyrics,lyrics_requiredsupports_lyrics_optimizer - ,
supports_force_instrumental,supports_speedsupports_language_code - ,
voices[]default_voice - ,
min_prompt_lengthprompt_character_limit - ,
min_speedmax_speed - (per-job),
pricing.generation(per second generated),pricing.per_second(character-priced narration), orpricing.per_thousand_characters(duration-tiered map:pricing.durations) — each model uses one of these shapes{ "<tier>": { usd, diem, min_seconds, max_seconds } }
调用 前,先查看 返回的模型条目 —— 每条记录的 包含以下字段(及其他字段):
/audio/queueGET /models?type=musicmodel_spec- ,
supports_lyrics,lyrics_requiredsupports_lyrics_optimizer - ,
supports_force_instrumental,supports_speedsupports_language_code - ,
voices[]default_voice - ,
min_prompt_lengthprompt_character_limit - ,
min_speedmax_speed - (按任务计费)、
pricing.generation(按生成时长计费)、pricing.per_second(按字符计费的旁白)或pricing.per_thousand_characters(按时长阶梯计费:pricing.durations)—— 每个模型采用其中一种计费方式{ "<tier>": { usd, diem, min_seconds, max_seconds } }
Errors
错误码
| Code | Meaning |
|---|---|
| Wrong params (lyrics on an instrumental-only model, |
| Auth / Pro-only model. |
| Insufficient balance. Bearer → |
| On |
| Content policy violation. |
| Rate limited. |
| Inference or capacity issue. |
| 代码 | 含义 |
|---|---|
| 参数错误(纯器乐模型传入歌词、 |
| 认证失败/仅专业版模型可用。 |
| 余额不足。Bearer认证返回 |
| 在 |
| 违反内容政策。 |
| 请求频率受限。 |
| 推理或容量问题。 |
Gotchas
注意事项
- Quote before queue — music is pay-per-second; unexpected can blow through a budget. Use
duration_secondsto gate the/audio/quotecall against your available balance (queueor/billing/balance)./x402/balance/... - is UUIDv4. Store it alongside the
queue_id— both are required for every subsequent call.model - Media URLs are ephemeral. Download during and store yourself; after
retrieve, Venice deletes the file.complete - and a non-empty
lyrics_optimizer: trueis alyrics_prompt.400 - Poll rate: don't hammer . 2–5 s is plenty — the job queue is the same regardless of poll frequency.
/retrieve - from the retrieve status is cumulative (ms since enqueue);
execution_durationis the P80 expected total.average_execution_time
- 先询价再入队 —— 音乐按秒计费;意外的可能超出预算。使用
duration_seconds结合可用余额检查(/audio/quote或/billing/balance)来控制入队操作。/x402/balance/... - 是UUIDv4格式。需与
queue_id一起存储 —— 后续所有调用都需要这两个参数。model - 媒体URL是临时的。请在时下载并自行存储;调用
retrieve后,Venice会删除文件。complete - 且
lyrics_optimizer: true非空会返回lyrics_prompt错误。400 - 轮询频率:不要频繁调用。2-5秒一次足够 —— 任务队列不受轮询频率影响。
/retrieve - retrieve状态中的是累计时长(从入队开始的毫秒数);
execution_duration是预期总时长的P80值。average_execution_time