ساخت قطعهٔ موسیقی از روی توصیف متنی، با مدلهای Lyria گوگل. خروجی یک فایل صوتی استریو (MP3) است که در قالب base64 برمیگردد. مدلهای ElevenLabs هم، برای موسیقی با طول دلخواه و جلوه صوتی، از همین endpoint کار میکنند؛ پایینتر آمدهاند. فهرست مدلها و قیمت هر قطعه در صفحهٔ مدلها.
مدلها
مدلهای موسیقی را از دو مسیر صدا میزنید: مستقیم از خود گوگل، یا از OpenRouter با پیشوند openrouter/google/. endpoint، درخواست و پاسخ در هر دو یکی است.
| شناسهٔ مدل | چه میسازد |
|---|---|
lyria-3.5 | جدیدترین مدل: آهنگ کامل چنددقیقهای. ترانه به زبانی خوانده میشود که توصیف را به آن نوشتهاید؛ برای کیفیت تلفظ فارسی قولی نمیدهیم. |
lyria-3-clip-preview | کلیپ ۳۰ ثانیهای؛ برای اینترو، لوپ یا جینگل. |
lyria-3-pro-preview | نسل قبلی آهنگ کامل. |
openrouter/google/lyria-3-clip-previewopenrouter/google/lyria-3-pro-preview | همان کلیپ و آهنگ کامل Lyria 3، از مسیر OpenRouter. |
eleven-music-v1 | موسیقی ElevenLabs با طولی که خودتان میگویید (۳ تا ۳۰۰ ثانیه). |
eleven-sound-effects-v2eleven-sound-effects-v3 | جلوه صوتی ElevenLabs (۰٫۵ تا ۳۰ ثانیه). |
مدل موسیقی نه یک مدل گفتوگوی معمولی است و نه یک مدل متن به گفتار: در OpenRouter فقط به شکل استریم جواب میدهد و در گوگل از API جداگانهای میآید. درگاه هر دو را پشت یک endpoint گذاشته و همیشه یک فایل کامل به شما میدهد — چون نصفِ یک آهنگ به درد کسی نمیخورد. پس مدلهای موسیقی را به /chat/completions نفرستید؛ خطای model_endpoint_mismatch میگیرید.
درخواست
import base64, httpx
res = httpx.post(
"https://netarz.ir/api/ai/v1/audio/music",
headers={"Authorization": f"Bearer {NETARZ_API_KEY}"},
json={
"model": "lyria-3-clip-preview",
"prompt": "قطعهٔ آرام لوفای با پیانو، تمپوی کند، حالوهوای امیدوار، بدون کلام",
},
timeout=180,
).json()
clip = res["data"][0]
open(f"clip.{clip['format']}", "wb").write(base64.b64decode(clip["b64_json"]))
import { writeFile } from "node:fs/promises";
const res = await fetch("https://netarz.ir/api/ai/v1/audio/music", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.NETARZ_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "lyria-3-clip-preview",
prompt: "قطعهٔ آرام لوفای با پیانو، تمپوی کند، حالوهوای امیدوار، بدون کلام",
}),
}).then((r) => r.json());
const clip = res.data[0];
await writeFile(`clip.${clip.format}`, Buffer.from(clip.b64_json, "base64"));
curl https://netarz.ir/api/ai/v1/audio/music \
-H "Authorization: Bearer $NETARZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "lyria-3.5",
"prompt": "آهنگ پاپ شاد با گیتار آکوستیک و ریتم تند، متن ترانه دربارهٔ سفر جادهای"
}' | jq -r '.data[0].b64_json' | base64 -d > song.mp3
{
"id": "req_8f1c…",
"object": "music.generation",
"created": 1790899200,
"model": "lyria-3-clip-preview",
"text": "",
"data": [
{ "b64_json": "SUQzAwAAAAAvMkdFT0IA…", "format": "mp3", "bytes": 744608 }
],
"usage": { "input_tokens": 18, "output_tokens": 0, "total_tokens": 18 }
}
پارامترها
| پارامتر | توضیح |
|---|---|
model الزامی | یکی از شناسههای جدول بالا. |
prompt الزامی | توصیف قطعه، تا ۴۰۰۰ کاراکتر: سبک، سازها، تمپو و حالوهوا. اگر متن ترانه بدهید، خوانده میشود. |
messages | اگر بهجای prompt بفرستید، همان شکل پیامهای Chat Completions پذیرفته میشود — برای وقتی که تصویری را هم بهعنوان الهام ضمیمه میکنید. در مدلهای مستقیم گوگل، تصویر باید data URL یا base64 باشد؛ لینک اینترنتی خوانده نمیشود. |
temperature | میزان آزادی مدل در برداشت از توصیف شما، صفر تا ۱. فقط روی مدلهای openrouter/… اثر دارد. |
seed | با seed ثابت و همان توصیف، قطعهای نزدیک به قبلی میگیرید. فقط روی مدلهای openrouter/… اثر دارد. |
seconds | فقط مدلهای ElevenLabs: طول قطعه به ثانیه. eleven-music-v1 از ۳ تا ۳۰۰ (پیشفرض ۳۰) و مدلهای جلوه صوتی از ۰٫۵ تا ۳۰ (پیشفرض ۵). در پاسخ هم data[0].seconds میآید. |
فیلدهای پاسخ
data[0].b64_json— خود فایل صوتی در قالب base64.data[0].format— قالب فایل؛ معمولاًmp3. فایل را با همین پسوند ذخیره کنید، مثل نمونههای بالا.text— متنی که خود مدل همراه قطعه برمیگرداند، مثل متن ترانه یا یادداشتی کوتاه دربارهٔ ساختار قطعه؛ ممکن است خالی باشد.
ElevenLabs: موسیقی با طول دلخواه و جلوه صوتی
این مدلها مثل Lyria صدا زده میشوند، با یک فیلد اضافه: seconds. راهنمای کامل ElevenLabs، با گفتار فارسی و Scribe، در صفحهٔ صدا است.
curl https://netarz.ir/api/ai/v1/audio/music \
-H "Authorization: Bearer $NETARZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "eleven-music-v1",
"prompt": "قطعهٔ آرام لوفای با پیانو و صدای باران، بدون کلام",
"seconds": 60
}' | jq -r '.data[0].b64_json' | base64 -d > theme.mp3
پاسخ همان شکل بالا را دارد و data[0].seconds طول واقعی قطعه است.
قیمتگذاری
موسیقی Lyria بهازای هر قطعه حساب میشود، نه بهازای توکن: طول توصیف شما در مبلغ اثری ندارد و هر قطعه از یک مدل همیشه یک قیمت دارد. نرخ دقیق هر مدل زیر کلید per_request در فهرست قیمتها و به تومان در صفحهٔ مدلها آمده است.
- مدلهای ElevenLabs بهازای طول قطعه (
seconds) حساب میشوند؛ نرخشان در صفحهٔ مدلها است. - درخواستی که به هر دلیل فایل صوتی برنگرداند، هزینهای ندارد. اگر فیلتر محتوایی گوگل قطعهای را نسازد، پاسخ خطای ۴۰۰ با کد
upstream_rejectedاست و چیزی از اعتبارتان کم نمیشود. - ساخت یک کلیپ حدود ده ثانیه طول میکشد و آهنگ کامل بیشتر؛ در کلاینت خود
timeoutرا دستکم روی ۱۸۰ ثانیه بگذارید.
نکات
- فایل را همانجا ذخیره کنید؛ درگاه نسخهای از قطعه نگه نمیدارد.
- سبک، سازها، تمپو و حس قطعه را بنویسید. هرچه توصیف مشخصتر باشد، نتیجه نزدیکتر است.
- برای قطعهٔ بیکلام، «بدون کلام» را هم در توصیف بیاورید.
- نام یک هنرمند یا اثر واقعی در توصیف، ممکن است باعث شود گوگل قطعه را نسازد؛ سبک را توصیف کنید، نه نام را.
- حق استفادهٔ تجاری از خروجی را با شرایط خود گوگل بسنجید؛ ما قراردادی جدا از آن نداریم.