Ses kararları (Hume Audio Decision Model)
hume/audio-decision-model, Hume'un ses için karar modelidir. Bir ses kaydı (MP3 ya da WAV) ve tanımladığınız soruları alır, her soruya metin yerine olasılıklarla yanıt verir. Bir soru konuşmanın nasıl duyulduğu (arayan kişinin sabırsızlığı, bir sentetik sesin doğallığı), ne söylendiği (aboneliği iptal etme talebi) ya da diğer sesler (arka plan gürültüsü, çalan telefon) hakkında olabilir. Transkript, açıklama ya da cevap metni döndürmez; olasılıkları kodunuzda eşik ve ağırlıklarla birleştirirsiniz.
Model, Yapılandırılmış Kararlar ile aynı POST /v1/systemone ucunda, mevcut LLMTR API anahtarınızla çağrılır. İstek biçimi aynıdır; kayıt audio alanında gelir ve bir soru tipi (span) yalnızca bu modelde vardır.
| Model | Giriş / Çıkış ($/1M token) |
|---|---|
hume/audio-decision-model |
0,47 / 0 |
AUDIO_B64=$(base64 < cagri.wav | tr -d '\n')
curl "$LLMTR_BASE_URL/v1/systemone" \ -H "Authorization: Bearer llmtr-your_key" \ -H "Content-Type: application/json" \ -d @- <<EOF{ "model": "hume/audio-decision-model", "state": "Bir internet sağlayıcısının destek hattına gelen çağrı. Temsilci çağrıyı açıyor, arayan kişi kesinti bildiriyor.", "audio": {"format": "wav", "data_base64": "$AUDIO_B64"}, "questions": { "temsilci_tonu": { "type": "choice", "instructions": "Temsilcinin tonunu en iyi hangisi anlatıyor?", "criteria": { "sicak": "Arayana karşı sıcak ve güler yüzlü", "notr": "Kibar ama mesafeli", "sert": "Kısa kesen ya da umursamaz" } }, "arayan_sabirsizligi": { "type": "score", "instructions": "Arayan kişi ne kadar sabırsız görünüyor?", "criteria": ["Hiç", "2", "3", "4", "Çok"] }, "arka_plan_gurultusu": { "type": "noul", "instructions": "Dikkat dağıtan bir arka plan gürültüsü var mı?" }, "iptal_ani": { "type": "span", "instructions": "Arayan kişi hizmetini iptal etmek istediğini ne zaman söylüyor?" } }}EOFcurl gövdeyi standart girdiden okur; beş dakikalık bir kaydın base64'ü komut satırına sığmak zorunda kalmaz.
import base64, os, requests
with open("cagri.wav", "rb") as f: audio_b64 = base64.b64encode(f.read()).decode("ascii")
res = requests.post( "https://llmtr.com/v1/systemone", headers={"Authorization": f"Bearer {os.environ['LLMTR_API_KEY']}"}, json={ "model": "hume/audio-decision-model", "state": "Bir internet sağlayıcısının destek hattına gelen çağrı.", "audio": {"format": "wav", "data_base64": audio_b64}, "questions": { "arka_plan_gurultusu": { "type": "noul", "instructions": "Dikkat dağıtan bir arka plan gürültüsü var mı?", }, "iptal_ani": { "type": "span", "instructions": "Arayan kişi hizmetini iptal etmek istediğini ne zaman söylüyor?", }, }, }, timeout=120,)res.raise_for_status()
answers = res.json()["answers"]if answers["arka_plan_gurultusu"]["noul"] > 0.7: print("gürültülü kayıt")for span in answers["iptal_ani"]["spans"]: print(span["audio_start_ms"], span["audio_end_ms"], span["probability"])import { readFileSync } from "node:fs";
const res = await fetch("https://llmtr.com/v1/systemone", { method: "POST", headers: { Authorization: `Bearer ${process.env.LLMTR_API_KEY}`, "Content-Type": "application/json" }, body: JSON.stringify({ model: "hume/audio-decision-model", state: "Bir sesli asistanın test çağrısı. İki ses de sentetik, önce asistan konuşuyor.", audio: { format: "wav", data_base64: readFileSync("test_cagrisi.wav").toString("base64") }, questions: { dogallik: { type: "score", instructions: "Asistan ne kadar doğal duyuluyor?", criteria: ["Hiç", "2", "3", "4", "Çok"] }, soz_kesme: { type: "noul", instructions: "Asistan arayanın sözünü kesiyor mu?" } } })});
const { answers, usage } = await res.json();console.log(answers.dogallik.score, answers.soz_kesme.noul, usage.input_tokens);| Alan | Zorunlu | Açıklama |
|---|---|---|
model |
Evet | hume/audio-decision-model |
audio |
Evet | {"format": "wav" veya "mp3", "data_base64": "..."}. Standart base64, data: öneki olmadan. Dosyanın kendisi WAV ya da MP3 olmalıdır; adres (URL) kabul edilmez. |
state |
Evet | Kaydın kısa tanımı, düz metin, en fazla 1.000 karakter: ortam, kimin konuştuğu, okunması istenen metin. Soruların dayandığı metni burada verin, her parçayı Metin: gibi bir etiketle ayrı satıra yazın. |
questions |
Evet | Anahtarlarını sizin seçtiğiniz soru haritası (anahtar 1-256 karakter). Yanıtlar aynı anahtarlarla döner. |
max_budget_usd |
Hayır | İstek öncesi tahmini maliyet kontrolü. Bu modelde tahmin, kaydın gerçek süresinden bağımsız olarak beş dakikalık bir kayıt için yapılır; kısa kayıtlarda gerçek ücret tahminin çok altında kalır. Tahminin altında bir değer verirseniz istek 400 budget_too_low döner. |
assets ve images alanları ve box soru tipi bu modelde kullanılmaz.
Soru tipleri
Bölüm başlığı “Soru tipleri”Her soru tek bir yargı sormalıdır. Bir kararı birden fazla soruya bölün (temsilcinin tonu, arayanın sabırsızlığı, iptal talebi) ve yanıtları kodunuzda birleştirin.
| Tip | Sorar | criteria |
Yanıt |
|---|---|---|---|
noul |
Kayıt için bir şey doğru mu | İsteğe bağlı: {"true": "...", "false": "..."}, her biri 1-300 karakter |
noul: "evet" diyecek dinleyicilerin tahmini payı (0-1) |
choice |
Birkaç seçenekten hangisi | Seçenek adı → açıklama; 2-20 seçenek, ad 1-50, açıklama 1-100 karakter (açıklama null olabilir) |
choice, confidence, her seçeneğin probabilities değeri |
score |
Sıralı bir ölçekte nerede | En düşükten en yükseğe 2-10 seviye, her biri 1-150 karakter | score (olasılık ağırlıklı ortalama seviye), confidence, probabilities, legend |
span |
Bir şey ne zaman oluyor | Yok; olayı instructions içinde tam anlatın |
spans: audio_start_ms, audio_end_ms, probability; boş dizi olay bulunamadı demektir |
Ölçek için beş basamaklı ve uçları etiketli bir dizi kullanın: ["Hiç", "2", "3", "4", "Çok"] ya da ["Kesinlikle katılmıyorum", "Katılmıyorum", "Kararsızım", "Katılıyorum", "Kesinlikle katılıyorum"].
Bir olasılık, o cevabı verecek insan dinleyicilerin tahmini payıdır: 0,5'e yakın bir değer modelin emin olmadığını değil, dinleyicilerin bölüneceğini gösterir.
Sorular tek seferde yanıtlanır. Bu modelde bir istekteki bütün sorular aynı çıkarımda yanıtlanır, yani soru eklemek, çıkarmak ya da sırasını değiştirmek diğer yanıtları değiştirebilir. Karşılaştıracağınız kayıtlara aynı soruları aynı sırayla gönderin. Bir yanıta göre sonraki soruyu seçmeniz gerekiyorsa aynı kayıtla ikinci bir istek gönderin.
{ "model": "hume/audio-decision-model", "answers": { "temsilci_tonu": { "type": "choice", "choice": "sicak", "confidence": 0.3072, "probabilities": { "sicak": 0.5381, "notr": 0.3926, "sert": 0.0693 } }, "arayan_sabirsizligi": { "type": "score", "score": 2.7195, "confidence": 0.4229, "probabilities": { "0": 0.0218, "1": 0.0874, "2": 0.2463, "3": 0.4385, "4": 0.206 }, "legend": { "0": "Hiç", "1": "2", "2": "3", "3": "4", "4": "Çok" } }, "arka_plan_gurultusu": { "type": "noul", "noul": 0.1274 }, "iptal_ani": { "type": "span", "spans": [{ "audio_start_ms": 38120, "audio_end_ms": 38940, "probability": 0.7734 }] } }, "usage": { "input_tokens": 11683, "output_tokens": 0 }}Tanımadığınız bir type ile gelen yanıtı hata değil, bilinmeyen yanıt olarak ele alın.
Kaydı hazırlama
Bölüm başlığı “Kaydı hazırlama”- Kayıt 5 saniye ile 5 dakika arasında olmalıdır. Uzun bir kaydı sabit aralıklarla değil duraklamalardan bölün, her parçaya aynı soruları sorun ve yanıtları kodunuzda birleştirin (genel seviye için ortalama, bir şeyin olup olmadığı için en yüksek değer). Her parça da en az 5 saniye olmalıdır.
- Model sesi 16 kHz, 16 bit, tek kanal olarak duyar; iki kanallı bir dosya tek kanala karıştırılır. Tek bir kişiyi değerlendirmek için o kişinin kanalını ya da konuşma bölümlerini ayrı dosya olarak gönderin.
- Kayıt JSON gövdesinde base64 olarak gittiği için dosya en fazla yaklaşık 18 MB olabilir. WAV dosyalarını 16 kHz, 16 bit, tek kanala çevirin: beş dakikalık bir kayıt böylece yaklaşık 9,6 MB olur.
- Sessiz ya da neredeyse sessiz dosyaları göndermeyin; model sessizliği de değerlendirir ve yüksek güvenle yanıtlayabilir.
- Telefon kayıtlarında genel ses kalitesini değil belirli bir sorunu sorun (arka plan gürültüsü gibi); telefon sesi daha az yüksek frekans taşıdığı için model onu daha düşük kaliteli duyar ve "ses boğuk mu?" sorusu neredeyse her çağrıda yüksek çıkar.
- Müziğe dair sorular (nakaratın nerede başladığı), sesin yönü (sol, sağ) ve açık uçlu sorular ("neden arıyor?") iyi yanıtlanmaz. Açık uçlu bir soru yerine olası nedenleri listeleyen bir
choicesorusu sorun. - Hume desteklenen dillerin listesini yayımlamıyor. Bir soruya güvenmeden önce, cevabını bildiğiniz kendi kayıtlarınızda ve kullanacağınız eşiklerle deneyin.
Faturalandırma
Bölüm başlığı “Faturalandırma”Yalnızca girdi tokenları faturalanır: 1 milyon girdi tokeni 0,47 $, çıktı ücretsizdir. Girdi tokeni sayısı çoğunlukla kaydın süresine bağlıdır; soruların ve state'in metni de sayılır. Hume'un belgesindeki örnekte 135 saniyelik bir çağrı ve dört soru 11.683 girdi tokeni tuttu; bu, yaklaşık 0,0055 $ eder. Faturalanan sayı yanıttaki usage.input_tokens alanındadır.
Limitler
Bölüm başlığı “Limitler”| Limit | Değer |
|---|---|
| Kayıt süresi | 5 saniye - 5 dakika |
| Biçim | MP3 veya WAV, istekte tek dosya |
| Dosya boyutu | yaklaşık 18 MB (base64'ten önce) |
| Soru sayısı | 1-25: noul, choice ve score birlikte en fazla 20, span en fazla 5 |
instructions |
1-500 karakter |
state |
en fazla 1.000 karakter |
Hatalar
Bölüm başlığı “Hatalar”| Durum | Anlamı |
|---|---|
400 invalid_request |
İstek bu modelin kabul ettiği biçimde değil. Mesaj neyin değişeceğini söyler: audio eksik ya da dosya MP3 veya WAV değil; kayıt 5 saniyeden kısa ya da 5 dakikadan uzun; dosya çözülemedi; state ya da instructions metin değil; box sorusu, assets ya da images gönderildi; bir soru ya da state yukarıdaki sınırların dışında (mesaj alanı adlandırır). |
400 budget_too_low |
max_budget_usd bu isteğin tahmini maliyetinin altında. |
413 |
Dosya bu model için fazla büyük. |
503 model_busy |
Model şu anda kapasitede. Retry-After başlığındaki süre kadar bekleyip tekrar deneyin; bu istekten ücret alınmaz. |
503 model_unavailable |
Model geçici olarak kullanılamıyor; ücret alınmaz. |
502 provider_error / 504 provider_timeout |
İstek tamamlanamadı; ücret alınmaz. Tekrar deneyin. |