Skip to content

Yapay Zeka Ses Üretimi

Bir metin açıklamasından kısa müzik klipleri (30 saniyeye kadar) oluşturun. Platform, ses üretmek için Google Lyria'yı kullanıyor ve oluşturulan dosyaya zaman sınırlı bir URL döndürüyor.

İki giriş noktası mevcuttur:

PathWhen to use
Chao tool (media.audio.generate)Inside an AI chat session — let the model decide when to generate based on the conversation
REST API (POST /ai/generative-media/context-runs)Direct, programmatic invocation — optionally enriched with personal context

Ses oluşturmak, etkin planda ai.audio.generate yetkisini gerektirir.


Chao Takım Yolu

Tanım

Bir oturuma kullanıcı mesajı gönderin. Niyet tespitini atlamak ve doğrudan ses oluşturma aracına yönlendirmek için "capabilityKey"i "ai.audio.generate" olarak ayarlayın.

Uç noktalar

MethodPathDescriptionAuthRate Limit
POST/ai/sessions/:sessionId/messagesSend a message that triggers audio generationJWT + Entitlement20/min
GET/ai/sessions/:sessionId/messages/:messageId/streamSSE stream of progress and completion eventsJWT + Entitlement20/min

Rica etmek

Talep Gövdesi

FieldTypeRequiredDescription
contentstringYesFree-text description of the music to generate
capabilityKeystringYesSet to ai.audio.generate
durationSecondsnumberNoTarget clip length in seconds (5–30). Default: 20. Clamped to 30; ignored if ≤ 0
bpmnumberNoBeats per minute (40–220). Clamped to range; omitted from the request if missing or ≤ 0
styleTokensstring[]NoGenre, instrument, or mood hints (e.g. ["jazz", "piano", "late night"]). Max 10 items
effortModestringNobasic, thinking, or pro
idempotencyKeystringNoClient-generated key to deduplicate retries

Kimliği doğrulanmış istek aktöre bilgi sağlar. İstek gövdeleri hiçbir zaman "accountId", "chainerId" veya "workspaceId" içermemelidir.

Cevap

json
{
  "data": {
    "sessionId": "550e8400-e29b-41d4-a716-446655440000",
    "userMessage": {
      "id": "550e8400-e29b-41d4-a716-446655440010",
      "role": "user",
      "content": "A calm jazz piano piece for late-night focus sessions.",
      "createdAt": "2026-05-22T10:00:00Z",
      "toolCalls": []
    },
    "assistantMessage": {
      "id": "550e8400-e29b-41d4-a716-446655440011",
      "role": "assistant",
      "content": "",
      "createdAt": "2026-05-22T10:00:00Z",
      "runId": "550e8400-e29b-41d4-a716-446655440012",
      "status": "pending",
      "toolCalls": [],
      "modelName": "Lyria",
      "providerKey": "google"
    },
    "run": {
      "id": "550e8400-e29b-41d4-a716-446655440012",
      "status": "running"
    }
  }
}

SSE Olay Sırası

text
event: run.started
event: tool.started      toolKey=media.audio.generate
event: tool.progress     message="Generating audio..."      activityType=audio_generation
event: tool.completed    toolKey=media.audio.generate  data={ audioUrl, durationSeconds, ... }
event: message.delta     (assistant prose summarising the result)
event: message.completed
event: run.settlement.completed

SSE — tool.completed Yükü

json
{
  "eventId": 4,
  "type": "tool.completed",
  "runId": "550e8400-e29b-41d4-a716-446655440012",
  "stepId": "tc_abc123",
  "timestamp": "2026-05-22T10:00:28Z",
  "payload": {
    "toolKey": "media.audio.generate",
    "callId": "tc_abc123",
    "executionMs": 22400,
    "success": true,
    "data": {
      "success": true,
      "audioUrl": "https://media.chainabit.com/ai-generated/audio/...wav",
      "durationSeconds": 20,
      "mimeType": "audio/wav"
    }
  }
}

Hata Yanıtları

HTTPMeaning
400Schema validation failed (e.g. bpm outside 40–220, durationSeconds > 30, sending image-capability fields like aspectRatio)
401Missing or invalid JWT
402Insufficient credits to reserve the requested duration
403Plan does not include ai.audio.generate
404sessionId not found
429Rate limit exceeded

Yetenek farkındalığına sahip 400 örneği — ses özelliğine sahip bir görüntü alanı gönderme:

json
{
  "error": {
    "code": "bad_request",
    "message": "aspectRatio is only valid for ai.image.generate",
    "details": {
      "fields": [
        { "field": "aspectRatio", "message": "aspectRatio is only valid for ai.image.generate", "capabilityKey": "ai.image.generate" }
      ]
    }
  }
}

Parametreler ayrıca "parametreler" altında yuvalanmış olarak da gönderilebilir (yeni kod için tercih edilir) - bkz. Mesajlar: Yetenek Parametreleri.

Kod Örnekleri

Mesaj Gönderme

Oturum Oluştur yanıtındaki "id"yi "$SESSION_ID" olarak kullanın.

bash
curl -X POST "$BASE_URL/ai/sessions/$SESSION_ID/messages" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "A calm jazz piano piece for late-night focus sessions.",
    "capabilityKey": "ai.audio.generate"
  }'
bash
curl -X POST "$BASE_URL/ai/sessions/$SESSION_ID/messages" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Upbeat pop background music for a workout video.",
    "capabilityKey": "ai.audio.generate",
    "durationSeconds": 25,
    "bpm": 128,
    "styleTokens": ["guitar", "synth", "energetic"]
  }'
javascript
const sessionId = process.env.SESSION_ID; // id of the AI session to send the message to

const res = await fetch(
  `${BASE_URL}/ai/sessions/${sessionId}/messages`,
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${TOKEN}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      content: "Ambient electronic music for deep focus.",
      capabilityKey: "ai.audio.generate",
      durationSeconds: 30,
      bpm: 80,
      styleTokens: ["ambient", "electronic", "minimal"],
    }),
  },
);
const { data } = await res.json();
const { assistantMessage, run } = data;
console.log("Run id:", run.id, "stream:", assistantMessage.id);
python
import os
import requests

session_id = os.environ["SESSION_ID"]  # id of the AI session to send the message to

res = requests.post(
    f"{BASE_URL}/ai/sessions/{session_id}/messages",
    headers={
        "Authorization": f"Bearer {TOKEN}",
        "Content-Type": "application/json",
    },
    json={
        "content": "A cinematic orchestral piece with rising tension.",
        "capabilityKey": "ai.audio.generate",
        "durationSeconds": 20,
        "bpm": 90,
        "styleTokens": ["cinematic", "orchestral", "strings"],
    },
)
body = res.json()["data"]
assistant_id = body["assistantMessage"]["id"]
run_id = body["run"]["id"]

Yanıtın Akışı

Yukarıdakiyle aynı "$SESSION_ID"yi ve mesaj gönderme yanıtındaki "assistantMessage.id"yi ("data.assistantMessage.id") "$MESSAGE_ID" olarak kullanın.

javascript
const sessionId = process.env.SESSION_ID; // same session used to send the message
const assistantId = process.env.MESSAGE_ID; // assistantMessage.id from the send-message response

const stream = new EventSource(
  `${BASE_URL}/ai/sessions/${sessionId}/messages/${assistantId}/stream`,
  { withCredentials: true },
);

stream.addEventListener("tool.progress", (event) => {
  const { payload } = JSON.parse(event.data);
  if (payload.activityType === "audio_generation") {
    console.log("progress:", payload.message);
  }
});

stream.addEventListener("tool.completed", (event) => {
  const { payload } = JSON.parse(event.data);
  if (payload.toolKey === "media.audio.generate") {
    console.log("Audio ready:", payload.data.audioUrl);
    stream.close();
  }
});

stream.addEventListener("run.settlement.completed", () => stream.close());
python
import os
import sseclient, requests, json

session_id = os.environ["SESSION_ID"]  # same session used to send the message
assistant_id = os.environ["MESSAGE_ID"]  # assistantMessage.id from the send-message response

response = requests.get(
    f"{BASE_URL}/ai/sessions/{session_id}/messages/{assistant_id}/stream",
    headers={"Authorization": f"Bearer {TOKEN}"},
    stream=True,
)
client = sseclient.SSEClient(response)
for event in client.events():
    if event.event == "tool.completed":
        payload = json.loads(event.data)["payload"]
        if payload["toolKey"] == "media.audio.generate":
            print("audio:", payload["data"]["audioUrl"])
            break

Doğrudan REST Yolu

Tanım

Programatik kontrol istediğinizde veya ses üretimini kişisel bağlamla (örneğin, kullanıcının Chainies'i veya belleği) birleştirmek istediğinizde 'POST /ai/generative-media/context-runs'ı kullanın.

http
POST /ai/generative-media/context-runs
Authorization: Bearer $TOKEN
Content-Type: application/json

'ai.contextMedia.generate' ve 'ai.audio.generate' gerektirir.

Rica etmek

Talep Gövdesi

FieldTypeRequiredDescription
promptstringYesMusic description — max 4000 chars
mediaTypestringYesMust be "audio"
generationModestringNocontext_aware, prompt_only
requestedContextSourcesstring[]NoPersonal context sources to include (see Generative Media API)
durationSecondsnumberNo1–30 seconds
bpmnumberNo40–220 BPM
styleTokensstring[]NoMax 10 items, max 60 chars each. Merged with context-derived style tokens
sessionIdUUIDNoLinks the generation job to a chat session
providerPreferencestringNoOverride provider routing
modelPreferencestringNoOverride model within the provider

Cevap

json
{
  "data": {
    "jobId": "550e8400-e29b-41d4-a716-446655440010",
    "status": "completed",
    "mediaType": "audio",
    "generationMode": "prompt_only",
    "permissionRequired": false,
    "allowedContextSources": [],
    "blockedContextSources": [],
    "resultMediaId": "550e8400-e29b-41d4-a716-446655440020",
    "errorCode": null,
    "createdAt": "2026-05-22T10:00:00Z",
    "updatedAt": "2026-05-22T10:00:25Z"
  }
}

Ses dosyasını Files API aracılığıyla almak için resultMediaIdyi kullanın.

İş Durumu Değerleri

StatusMeaning
pendingJob accepted, generation not yet started
permission_requiredNo consented context sources; proceed with prompt_only or grant permissions
runningGeneration in progress
completedAudio generated and stored; resultMediaId is set
generation_failedLyria returned an error or empty result
storage_failedGeneration succeeded but R2 upload failed
cancelledCancelled by the user

Hata Yanıtları

HTTPMeaning
400Validation failed — e.g. bpm not in 40–220, styleTokens item exceeds 60 chars
401Missing or invalid JWT
403Plan does not include ai.contextMedia.generate or ai.audio.generate
429Rate limit exceeded

Kod Örnekleri

bash
curl -X POST "$BASE_URL/ai/generative-media/context-runs" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A reflective lo-fi hip hop beat for studying.",
    "mediaType": "audio",
    "generationMode": "prompt_only",
    "durationSeconds": 25
  }'
bash
curl -X POST "$BASE_URL/ai/generative-media/context-runs" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Create background music that fits my mood today.",
    "mediaType": "audio",
    "generationMode": "context_aware",
    "requestedContextSources": ["preferences", "chainies"],
    "durationSeconds": 20,
    "bpm": 90,
    "styleTokens": ["calm", "acoustic", "morning"]
  }'
javascript
const res = await fetch(`${BASE_URL}/ai/generative-media/context-runs`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    prompt: "Upbeat electronic music for a productivity sprint.",
    mediaType: "audio",
    generationMode: "prompt_only",
    durationSeconds: 15,
    bpm: 120,
    styleTokens: ["electronic", "upbeat", "synth"],
  }),
});
const { data } = await res.json();
console.log("Job:", data.jobId, "Status:", data.status);
if (data.status === "completed") {
  // Fetch the presigned audio URL via the files API using data.resultMediaId
}
python
import requests

res = requests.post(
    f"{BASE_URL}/ai/generative-media/context-runs",
    headers={
        "Authorization": f"Bearer {TOKEN}",
        "Content-Type": "application/json",
    },
    json={
        "prompt": "A jazz trio improvisation, late night bar setting.",
        "mediaType": "audio",
        "generationMode": "prompt_only",
        "durationSeconds": 30,
        "bpm": 75,
        "styleTokens": ["jazz", "piano", "bass", "brushed-drums"],
    },
)
data = res.json()["data"]
print(f"Job {data['jobId']}: {data['status']}")

Parametre Davranışı

Süre

  • Varsayılan: durationSeconds atlandığında 20 saniye.
  • Maksimum: 30 saniye. 30'un üzerindeki değerler 30'a sabitlenir.
  • Geçersiz: ≤ 0 değerleri (sıfır ve negatif sayılar dahil) varsayılana (20 s) geri döner.
  • Yanıtta döndürülen gerçek süre, modelin ürettiğini yansıtır; bu süre, istenen değerden biraz farklı olabilir. Faturalandırma fiili süreye göre hesaplanır.

BPM

  • Aralık: 40–220. Bu aralığın dışındaki değerler en yakın sınıra sabitlenir.
  • Geçersiz: Sayısal olmayan değerler, sıfır ve negatif sayılar, oluşturma isteğinden sessizce çıkarılır. Model kendi temposunu çıkarır.
  • BPM atlandığında Lyria, istem ve stil belirteçlerine uygun bir tempo seçer.

Stil Jetonları

  • Türü, enstrümanı veya ruh halini tanımlayan serbest biçimli dizeler (ör. "caz", "piyano", "sinematik", "iyimser"").
  • Ana istemin yanında ağırlıklı istemler olarak Lyria'ya aktarıldı.
  • Bağlama duyarlı REST yolunda, kullanıcı tarafından sağlanan belirteçler, kullanıcının kişisel verilerinden oluşturulan bağlamdan türetilen belirteçlerle birleştirilir. Kullanıcı jetonları eklenir ve eşit ağırlıktadır.
  • Hiçbir sözcük kısıtlaması geçerli değildir; uzunluk sınırına bağlı olarak herhangi bir dize kabul edilir (belirteç başına 60 karakter, REST yoluyla maksimum 10 belirteç; Chao araç şeması aracılığıyla örtülü olarak maksimum 10 belirteç).

Faturalandırma

Ses üretimi süreye göre faturalandırılır:

  • Birim: dakika (durationSaniye / 60)
  • Krediler, üretim isteği gönderilmeden önce rezerve edilir.
  • Krediler, Lyria tarafından döndürülen fiili süre (ya da Lyria rapor etmezse talep edilen süre) kullanılarak işlenir.
  • Üretimin ses üretmemesi durumunda, ayrılan krediler serbest bırakılır ve herhangi bir ücret uygulanmaz.

Davranış Notları

  • Geriye dönük uyumluluk: Herhangi bir isteğe bağlı parametre olmadan { content,abilityKey: "ai.audio.generate" } gönderimi tam olarak eskisi gibi çalışır. Tüm yapılandırılmış parametreler isteğe bağlıdır.
  • Depolama: Oluşturulan ses, çalışma alanının R2 klasörüne yüklenir ve zaman sınırlı, önceden imzalanmış bir URL olarak döndürülür. Orijinalin süresi dolduğunda Files API aracılığıyla yeni bir URL alın.
  • Boş sonuç: Lyria hiçbir ses parçası üretmezse, araç boş bir "audioUrl" ile "success: false" değerini döndürür. Hiçbir ücret uygulanmaz.
  • Onay kapısı: Chao aracı "Onay gerektirir: doğru"dur; bir sohbet oturumunda ses oluşturma işlemi yürütülmeden önce kullanıcının bunu onaylaması gerekir.

İlgili

  • AI Mesajları — tüm AI yetenekleri tarafından kullanılan genel mesaj / akış hattı.
  • AI Oturumları — bir nesil çalıştırmayı barındıran oturumu oluşturun.
  • Generative Media API — kaynak başına izin kontrollerine sahip tam bağlama duyarlı medya hattı.
  • AI Video Generation — video oluşturmaya yönelik eşdeğer belgeler.
  • Files API — oluşturulan medyayı "resultMediaId" ile alır.

Built with purpose.