Kurs
SpaceXAI'nin Grok Voice Think Fast 2.0'ı bir konuşmadan konuşmaya modelidir. Bir WebSocket üzerinden ona ses gönderirsiniz ve o da size ses geri gönderir; bu arada, karar verdiği bir fonksiyon çağrısı çoktan çalışırken gerekçelendirme yapabilir ve konuşmaya devam edebilir. Ayrı bir konuşmadan metne adımı yok, ayrı bir metinden konuşmaya adımı yok.
SpaceXAI Think Fast 2.0'ı 29 Temmuz 2026'da duyurdu: daha hızlı ilk ses, daha dengeli tam çift yönlü davranış (katı dönüşler almak yerine konuşurken dinleme) ve turun erken aşamasında tetiklenen araç çağrıları. Kıyas konuşmasını kısa tutacağım; bir eğitim için önemli olan, kodunuzda nelerin değiştiğidir.
Bir çevrimiçi mağaza için müşteri destek ses aracısı oluşturacağız. Arayan bir siparişi sorabilir, teslimat talimatını değiştirebilir, iptal edebilir, aracı yarıda kesebilir ve bağlantı koptuktan sonra konuşmayı kaldığı yerden sürdürebilir. Bu, Grok Voice Agent Builder eğitimimizin adım adım anlattığı kodsuz Voice Agent Builder değil, API yoludur. Konsol-öncelikli sürüm için oradan başlayın.
Grok Voice Think Fast 2.0 Nedir?
Grok Voice Think Fast 2.0, SpaceXAI'nin Konuşmadan Konuşmaya API'si için en yeni modelidir; çoğu kişinin yalnızca Grok Voice dediği şeyin arkasındaki ürün adıdır. Şirketi hâlâ xAI olarak düşünüyorsanız, aynı ekip: 6 Temmuz 2026'da SpaceX'e dahil edildi ve SpaceXAI olarak yeniden markalandı. API yeniden markalamayı takip etmedi, bu yüzden aşağıdaki her tanımlayıcı hâlâ xai diyor; XAI_API_KEY değişkeninden api.x.ai ana makinesine kadar.
Geleneksel bir ses yığını üç hizmeti zincirler: konuşmadan metne, bir dil modeli, ardından metinden konuşmaya; her sıçrama gecikme ekler ve bağlamın kaybolabileceği bir yer doğurur. Think Fast 2.0, aynı bağlantı üzerinden ses veya metin alıp ses veya metin üreten tek bir modele indirger.

Konuşmadan konuşmaya WebSocket ile üç hizmetli boru hattı mimarisi. Görsel: Yazar.
Yalnızca konuşan değil, eyleme geçen bir aracı için önemli olan, mantık yürütmenin ve konuşmanın paralel çalışmasıdır. SpaceXAI, araç çağrılarının genellikle aracının ilk cümlesini bitirmeden önce çalışmaya başladığını söylüyor ve bu "genellikle" sözcüğü burada gerçekten önemli.
SpaceXAI'nin Artificial Analysis kaynaklı kıyaslarına göre Think Fast 2.0, Speech to Speech Index'te 1.0'ın 75.7'sine karşı 82.9 puan alıyor ve ilk sese kadar geçen süreyi 1.25 saniyeden 0.70 saniyeye indiriyor. Bir tedarikçi sayısı, genel bir benchmark üzerinde sizin arama akışınız hakkında bir hipotezdir; bir test planı değildir.
Üç model dizesi göreceksiniz: grok-voice-latest, grok-voice-think-fast-2.0 ve grok-voice-think-fast-1.0. Alias, prototipleme sırasında kullanışlıdır ve onun dışında yeterince stabil değildir.
4 Ağustos 2026'da test ettiğimde grok-voice-latest hâlâ grok-voice-think-fast-1.0 olarak çözülüyordu; SpaceXAI'nin sürüm notları taşımanın ertesi gün Think Fast 2.0'a yapılacağını planlıyordu. Bu geçiş, model değişimi kadar bir fiyat değişimidir; 1.0 için 0,05 $'a karşı, dakika başına 0,08 $ ses ücreti. Dolayısıyla sabitlenmemiş bir alias, bir satır kodunuz değişmeden daha pahalıya gelir. Dağıttığınız her şeyde sürümlenmiş dizeyi sabitleyin.
Ne İnşa Edeceğiz
Aracı, bir destek hattına sorulanları kapsar: bir siparişi sorgulama, arayanın numarası yoksa e-postadan bulma, bir teslimat talimatını değiştirme, iptal etme, bir talep açma veya kontrol etme ve çağrıyı bir insana devretme. Yolda kesintiler ve bağlantı kopmaları da olacak.
Tek bir betik yerine birkaç küçük dosyadan oluşur; çünkü her parçanın farklı bir görevi vardır ve bunları ayrı ayrı test etmek istersiniz. Yapı şöyle:
-
config.pyAPI anahtarını yükler ve model dizesini, örnekleme hızını ve uç nokta URL'lerini tutar -
voice_client.pyWebSocket'i sarar, faturalandırmayı izler ve gönderme/alma yardımcılarını sunar -
tools.pysipariş fonksiyonlarını ve gerçek bir veritabanının yerini alan küçük bir bellek içi sipariş deposunu tanımlar -
assistant.pysistem istemini, oturum yapılandırmasını ve her şeyi birbirine bağlayan olay döngüsünü tutar -
token_server.pykısa ömürlü belirteçler üreten küçük bir FastAPI uç noktasıdır -
app_streamlit.pyaynı istemciyi canlı bir tarayıcı çağrısının arkasına koyar; test bölümünden sonra buna geri döneceğim
Öğretim yolu terminalden ilerler. Demo mikrofona ekleme yapar.
Önkoşullar
Bir SpaceXAI hesabına ve bir API anahtarına, finanse edilmiş bir faturalandırma düzenine (kalıcı bir ücretsiz katman yoktur ve yeni hesap promosyon kredileri yeterli olmayacaktır) ve asyncio ve WebSocket'lere yeterince aşinalığa ihtiyacınız var; await için satır satır açıklama olmadan takip edebilecek kadar.
SpaceXAI'nin hızlı başlangıç örnekleri özel bir SDK yerine ham websockets paketini kullanır; biz de öyle yapıyoruz. Belgeler gerekli bir Python sürümü belirtmiyor. Ben 3.11'de test ettim.
API anahtarını sunucuda tutun. Bir tarayıcı veya mobil uygulama Voice API ile doğrudan konuşuyorsa, gerçek anahtarınız yerine aşağıda güvenlik bölümünde ele alınan bir kısa ömürlü belirteç alır.
Projeyi kurma
Aşağıdaki her dosya proje deposunda yer alıyor; parçaları kopyalamak yerine klonlayabilirsiniz:
git clone https://github.com/KhalidAbdelaty/grok-voice-think-fast-2.0.git
cd grok-voice-think-fast-2.0
pip install -r requirements.txt
websockets gerçek zamanlı bağlantıyı taşır ve python-dotenv anahtarınızı okur. Geri kalanı belirteç uç noktasını ve tarayıcı demosunu kapsar. Anahtarınızı .env'e koyun:
XAI_API_KEY=xai-your-key-here
Kurulumun çoğu bu kadar. İlginç olan bağlantıdır.
Grok Voice Gerçek Zamanlı API'yi Anlamak
Grok Voice ürün adıdır. Aslında kod yazdığınız şey, wss://api.x.ai/v1/realtime adresinde bir WebSocket uç noktasıdır ve tüm konuşma bu tek soket üzerinden bir JSON olayları akışı olarak gerçekleşir.
Olay yaşam döngüsü
Bir bağlantı sabit bir şekli izler: siz bağlanır bağlanmaz sunucu session.created ve conversation.created gönderir; siz session.update göndererek ses ve araçları yapılandırırsınız; sunucu session.updated ile bunu teyit eder ve buradan itibaren konuşma öğeleri oluşturup yanıtlar istersiniz. Bunu canlı bir anahtarla çalıştırdım ve sıralama belgelerle birebir uydu.
-
session.update(istemci) sesi, talimatları, araçları ve ses biçimini yapılandırır -
conversation.item.create(istemci) bir kullanıcı mesajı, bir asistan mesajı veya bir araç sonucunu ekler -
response.create(istemci) modelden konuşmasını ister; sunucu VAD bunu sizin için otomatik gönderir -
response.output_audio.deltaveresponse.output_audio_transcript.delta(sunucu) yanıtı oluşturulurken akışlar -
response.done(sunucu) turu kapatır
İki şey insanları yanıltır. Yukarıda bağladığım Konuşmadan Konuşmaya doküman sayfası, oturum sürdürme sırasında bir conversation.item.created olayından bahseder; ancak kanonik olay referansı yalnızca conversation.item.added listeler; yaptığım her testte de gelen buydu; bu yüzden ona göre kodlayın. Ayrıca çoğu bağlantının birkaç saniye içinde belgesiz bir ping olayı göreceksiniz; yalnızca bunu bir hata olarak okumamanız için anılmıştır.
Ses biçimleri ve taşıma
Kodek ve taşıma ayrı tercihlerdir. audio.input.format ve audio.output.format altında ayarlanan kodek; audio/pcm (Linear16, varsayılan 24000 Hz), audio/pcmu veya audio/pcma (telefoni için 8 kHz'de G.711) ya da audio/opus (24 kHz). Taşıma ise bu baytların kablo üzerinde nasıl iletildiğidir:
-
json(varsayılan) sesiinput_audio_buffer.appendveresponse.output_audio.deltaiçinde base64 metni olarak gönderir; kaydetmesi ve hata ayıklaması kolaydır -
binarybase64 ek yükünü atlayarak kodek ham baytlarını WebSocket ikili çerçeveleri olarak gönderir; bunun bedeli, ileti türüne göre dallanması gereken bir alma döngüsüdür
JSON ile başlayın. Belgelerdeki her örnek onu kullanır; incelemesi çok kolaydır ve base64 ek yükü bir destek aracısı kurulumunu darboğaz yapmaz. Ölçtüğünüz bir gerekçe varsa ikiliye geçin.
OpenAI Realtime API ile uyumluluk
OpenAI'nin Realtime API'sine hiç dokunmadıysanız bu bölümü atlayın. Diğerleri için, Konuşmadan Konuşmaya API, OpenAI Realtime API'yi, çoğu istemci kodunun yalnızca temel URL ve anahtarı değiştirerek taşınabileceği kadar yakından izler; ancak kusursuz bir muadil değildir.
Metin dökümleri burada conversation.item.input_audio_transcription.updated olarak gelir; OpenAI'nin delta'sı yerine. Birkaç OpenAI olayı desteklenmez ve SpaceXAI kendi uzantılarını ekler: senaryolu bir bilgilendirme satırı için force_message, yeniden bağlanmalar için resumption ve metinden konuşmaya geçişten önce yanlış telaffuz edilen marka adlarını düzeltmek için replace.
Gerçek Zamanlı Ses Aracısını Oluşturma
Yeterince protokol. İşte onunla konuşan istemci.
Bağlanma ve oturumu yapılandırma
Bağlantı, bir bearer belirteci ve bir model sorgu parametresiyle açılır; gönderdiğiniz ilk mesaj, aracının davranışıyla ilgili her şeyi yapılandırır:
import asyncio
import json
import os
import websockets
MODEL = "grok-voice-think-fast-2.0" # pin the version, not grok-voice-latest
async def connect():
url = f"wss://api.x.ai/v1/realtime?model={MODEL}"
ws = await websockets.connect(
url, additional_headers={"Authorization": f"Bearer {os.environ['XAI_API_KEY']}"}
)
await ws.send(json.dumps({
"type": "session.update",
"session": {
"voice": "eve",
"instructions": SYSTEM_PROMPT,
"turn_detection": {"type": "server_vad"},
"tools": ORDER_TOOLS,
"resumption": {"enabled": True},
}
}))
return ws
instructions sistem istemidir ve bu model kısa olanlarını ister. SpaceXAI'nin geçiş notları, GPT dönemindeki eski ses modelleri için yazılan istemleri olduğu gibi taşımak yerine basitleştirmeyi söylüyor. Benimki, aracının yanıtlarda kısa tutmasını, aynı anda bir soru sormasını ve işlem yapmadan önce her yazmayı geri okumasını söylüyor. Konuşulan bir onay, bir UX inceliğidir, bir güvenlik kontrolü değil. Uygulamanız yine de yazmanın yetkilendirmesini kendisi uygular.
Beni şaşırtan bir şey: tanınmayan bir model dizesi, bağlanma anında hata yükseltmez; sessizce grok-voice-think-fast-1.0'a geri döner. Ücretli bir isteği bir yazım hatası yüzünden, bunu söylemeden düşürmek garip bir varsayılandır. İstediğinizi aldığınızdan emin olmak için başlangıçta bir kez session.created içindeki session.model alanını günlüğe kaydedin ve kontrol edin.

Bağlandıktan sonra session.created çıktısını gösteren terminal. Görsel: Yazar.
Kullanıcı sesini akıtma
turn_detection.type server_vad olarak ayarlandığında, tek yapmanız gereken ses eklemeye devam etmektir. Arayanın konuşmayı ne zaman bıraktığına sunucu karar verir ve yanıtı sizin için tetikler. Bunun yerine null olarak ayarlayın ve bu kararı kendiniz verin; turun bittiğini düşündüğünüzde arabelleği açıkça taahhüt edersiniz.
async def send_audio_chunk(ws, pcm_bytes: bytes):
await ws.send(json.dumps({
"type": "input_audio_buffer.append",
"audio": base64.b64encode(pcm_bytes).decode(),
}))
Sunucu VAD'nin üç ayarı vardır; bunları yanlış yapmak, günlüklerde hata olmasa da bir ses aracısının bozuk hissettirmesinin en yaygın yoludur. Hiçbiri varsayılan olarak session.updated'ın yankısında görünmez; bu yüzden varsaymak yerine belgelere göre kontrol edin.
-
threshold(0.1 ila 0.9, varsayılan 0.85), sesin konuşma sayılması için ne kadar yüksek olması gerektiği; gürültülü odalarda yükseltin, sessiz konuşmacılar kaçırılıyorsa düşürün -
silence_duration_ms, sunucunun konuşmayı bitirmeden önce arayanın ne kadar süre sessiz kaldığı; çok kısa olursa insanlar düşünürken sözünü keser, çok uzun olursa hantallaşmış gibi hissettirir -
prefix_padding_ms(varsayılan 333), konuşmanın algılanmasından hemen önce tutulan bir ses dilimi; böylece ilk hece kırpılmaz
Arayanlar düşünmek için duraklarken sürekli sözleri kesiliyorsa önce silence_duration_ms 'i ayarlayın. Diğer ikisine dokunmadan önce uzandığım ayar budur.
Yanıtı alma ve çalma
Ses, küçük parçalar halinde response.output_audio.delta olarak gelir ve akışın amacı, response.done'ı beklemek yerine her parça iner inmez onu çalmaktır.
async def play_response(ws):
async for message in ws:
event = json.loads(message)
if event["type"] == "response.output_audio.delta":
chunk = base64.b64decode(event["delta"])
speaker.write(chunk) # your playback call goes here
elif event["type"] == "response.output_audio_transcript.delta":
print(event["delta"], end="", flush=True)
Üretimde bile metin dökümünü saklayın. Bir arayan, aracının "garip bir şey söylediğini" iddia ettiğinde elinizdeki en ucuz hata ayıklama aracıdır.
Ses Aracısına Araçlar Ekleme
Yalnızca konuşan bir ses aracısı, mikrofonlu bir sohbet botudur.
Sipariş araçlarını oluşturma
Her araç, bizim tarafımızda bir JSON şeması artı düz bir Python fonksiyonudur. Model veritabanına asla dokunmaz; yalnızca fonksiyonumuzun döndürdüğünü görür.
ORDER_TOOLS = [
{
"type": "function",
"name": "check_order_status",
"description": "Look up the status, ETA, and delivery instructions for an order.",
"parameters": {
"type": "object",
"properties": {
"order_number": {"type": "string", "description": "e.g. ORD-1042"},
},
"required": ["order_number"],
},
},
# find_orders, update_delivery_instructions, cancel_order,
# create_support_ticket, check_ticket_status and transfer_to_human
# all follow the same shape
]
check_order_status gibi okuma işlemleri, bir zaman aşımında yeniden denemek için güvenlidir. Yazma işlemleri değildir: belirsiz bir zaman aşımından sonra update_delivery_instructions'ı yeniden denemek, aynı değişikliğin iki kez uygulanmasına neden olabilir. İstemdeki bir onay satırı bunu engellemez; bunun yerine yazmalara bir idempotency anahtarı veya yinelenen kontrolü verin.
Reddedilmeleri de fonksiyona koyun. cancel_order, gönderilmiş bir siparişi iptal etmek yerine bir gerekçe ve alternatif döndürür; çünkü "gönderilmiş siparişleri asla iptal etme" diyen bir istem bir öneridir; reddeden bir fonksiyon ise değildir.
Araç çağırma döngüsünü yönetme
Dört adım vardır ve sıralama göründüğünden daha çok önemlidir. Model response.function_call_arguments.done gönderir, kodunuz fonksiyonu çalıştırır, sonucu bir function_call_output öğesi olarak geri gönderirsiniz ve ancak ondan sonra modelden devam etmesini istersiniz.
async def handle_tool_call(ws, event):
args = json.loads(event["arguments"])
result = execute(event["name"], args) # never raises; errors come back as {"error": ...}
await ws.send(json.dumps({
"type": "conversation.item.create",
"item": {
"type": "function_call_output",
"call_id": event["call_id"],
"output": json.dumps(result),
},
}))
Model, bir istek için birden fazla araca ihtiyaç duyarsa, herhangi bir ses çalınmadan önce birden çok function_call_arguments.done olayı tetikler. Hepsini çözün ve her sonucu tek bir response.create göndermeden önce yollayın. Çok erken gönderirseniz model, hâlâ yürütülmekte olan çağrılardan gelen bağlam olmadan yanıt verir.
SpaceXAI'nin belgelendirdiği ve ilk denemede yine de takıldığım bir püf noktası var: araç sonucunuz çıkar çıkmaz response.create göndermek, aracının hâlâ çalmakta olduğu giriş cümlesiyle çakışabilir. Bir çalıştırmada "ORD-1042 siparişinin durumuna hemen bakacağım" diye açıp cümlenin ortasında aracı çağırdı; dolayısıyla anında bir yanıt, kendi giriş cümlesinin üzerine konuşmasına yol açardı.
Mevcut turun sesi bitene kadar bekleyin ve arada kısa bir "düşünüyor" durumu gösterin.

Yanıta devam etmeden önce araç çağrısı akışı. Görsel: Yazar.
Kesintileri ve Konuşma Durumunu Yönetme
Burada iki ayrı sorun var. Arayan, aracının yanıtı ortasındayken üzerine konuşur ve bir WebSocket düşer ve yeniden kaldığı yerden alınması gerekir.
Doğal kesintileri destekleme
server_vad açıkken barge-in, sunucu tarafında otomatik olarak gerçekleşir: arayanın yeniden konuştuğunu algıladığı anda input_audio_buffer.speech_started sinyali verir ve eski yanıtın üretilmesini durdurur. Sizin işiniz, bu el sıkışmanın istemci tarafıdır: kuyrukta olan sesleri temizleyin ki aracı, kimsenin duymak istemediği bir cümleyi bitirmek yerine sussun.
if event["type"] == "input_audio_buffer.speech_started":
playback_queue.clear()
VAD olmayan, manuel oturumlar için response.cancel aynı işi isteğe bağlı olarak yapar. Ayrıca bir asistan öğesini gerçekten duyulana kadar kırpmak için conversation.item.truncate da vardır. Belgeler bunun varlığını doğrular ancak canlı bir barge-in sırasında ne zaman tetikleneceğini doğrulamaz; bu yüzden zamanlamayı kendiniz test edin.
Bunu, yanıt ortasında bir teslimat talimatı değişikliğiyle test ettim: isteği başlatın, aracının onayı sırasında farklı bir adresle araya girin. Önemli olan, sesin durup durmadığı değil; aracının, eskiyi sessizce bitirmek yerine düzeltilmiş talimatı uygulamasıdır. Sessizliği değil, sipariş kaydını doğrulayın. Sondaki tarayıcı demosu bunu duymanızı sağlar.
Bağlantısı kesilen bir oturumu sürdürme
Oturum sürdürme isteğe bağlıdır ve hafıza değildir. session.update üzerinde resumption.enabled: true ayarlayın, conversation.created olayından kimliği alın ve soket düşerse, URL'de ?conversation_id=<id> ile yeniden bağlanın ve yeni bağlantıda tekrar opt-in yapın.
async def reconnect(conversation_id):
url = f"wss://api.x.ai/v1/realtime?model={MODEL}&conversation_id={conversation_id}"
ws = await websockets.connect(url, additional_headers=auth_header)
await ws.send(json.dumps({"type": "session.update", "session": {"resumption": {"enabled": True}}}))
return ws
Önbelleğe alınan turlar, metin dökümleri, araç çağrıları ve araç sonuçları bir sonraki sorunuzdan önce yeniden oynatılır ve önbellek 30 dakikalık hareketsizlikten sonra kaybolur. Bir siparişi sorup bağlantıyı düşürerek ve tekrar etmeden devam sorusu için yeniden bağlanarak test ettim; aracı ETA'yı doğru şekilde kaldığı yerden aldı.
Belgesiz bir püf noktası: yeniden oynatma anında inmez; bu yüzden soket açıldığı anda gönderilen bir soru öne geçebilir ve önceki turun belleği olmadan dönebilir. Suçu sürdürmeye atmadan önce bir saniye verin.

Devam eden bir oturumun terminal günlüğü. Görsel: Yazar.
Bunu, sipariş durumunu kendi veritabanınıza kaydetmenin yerine kullanmayın. Önbellek süresi dolarsa veya arayan yarın tekrar ararsa sıfır bağlamla başlarsınız ve bu, tasarım gereğidir.
Aracıyı Güvenli Hale Getirme ve İzleme
Kalıcı bir API anahtarını asla tarayıcı veya mobil koda koymayın. Bir istemci doğrudan bağlanıyorsa, kısa ömürlü bir belirteç oluşturun:
from fastapi import FastAPI
import httpx, os
app = FastAPI()
@app.post("/session")
async def create_session():
async with httpx.AsyncClient() as client:
response = await client.post(
"https://api.x.ai/v1/realtime/client_secrets",
headers={"Authorization": f"Bearer {os.environ['XAI_API_KEY']}"},
json={"expires_after": {"seconds": 300}},
)
return response.json() # {"value": "xai-realtime-client-secret-...", "expires_at": ...}
Bir tarayıcı, bir WebSocket el sıkışmasında özel bir Authorization başlığı ayarlayamaz; bu yüzden belirteci, xai-client-secret. önekiyle sec-websocket-protocol başlığından iletir.

Sunucu belirteç basar, tarayıcı çağrıya katılır. Görsel: Yazar.
Faturalandırma iki ölçekte çalışır. Gönderilen veya alınan ses, daha önce bahsettiğim dakika başına 0,08 $ üzerinden işler; bu da saat başına 4,80 $ eder ve ses olmayan ve function_call_output olmayan her conversation.item.create sabit 0,004 $ tutar. response.create hiç ücretlendirilmez. Her response.done, testimde output_audio_seconds ile birlikte ayrı bir billable_audio_seconds bildiren bir usage nesnesi taşır. Tahminlerden değil, bunlardan fatura çıkarın.
Konuşmadan Konuşmaya API üzerindeki belgelenmiş sınırlar, takım başına 10 eşzamanlı oturum ve 120 dakikalık oturum üst sınırıdır; her ikisi de us-east-1 içindedir. Sığayı Voice Agent API'nin farklı olan rakamlarına göre planlamayın.
Gizlilik konusunda net olun. SpaceXAI'nin güvenlik SSS'si, kötüye kullanımı izlemek için API istek ve yanıtlarının 30 gün süreyle şifreli saklandığını ve izin olmadan eğitim için kullanılmadığını ve takımların Sıfır Veri Saklama'yı (ZDR) açabileceğini söylüyor; ancak ZDR, kalıcı ses aracısı konuşma geçmişini düşürür ve bu nedenle sürdürme ile çalışmaz.
Bir çağrının kaydedildiğini veya yapay zekâ tarafından yönetildiğini açıklıyorsanız, bunun için daha önce listelediğim force_message uzantısı vardır. Satır, modelin çevireceği herhangi bir biçimde değil, tam yazıldığı gibi çalar.
Ses Aracısını Test Etme
WebSocket el sıkışmasında 200 durumu, aracının doğru şeyi yapıp yapmadığı hakkında size hiçbir şey söylemez. Yalnızca bağlantıyı değil, sonucu test edin.
- Kayıttaki veriyle karşılaştırarak, yalnızca bir yanıt geldiğini değil, konuşulan yanıta göre temiz bir sipariş sorgulaması
- Kesilen bir yanıt; oynatmanın durduğunu ve aracının yeni talebi ele aldığını doğrulama
- Onay gerektiren bir teslimat güncellemesi; sipariş kaydına göre kontrol edilir
- Gönderilmiş bir siparişin iptali gibi bir ret; burada aracının kuralı açıklaması, özür dilemek yerine gerekir
- Bilinmeyen bir sipariş numarası; aracının uydurma bir durum oluşturmak yerine bunu söylediğinden emin olun
- Bir hata döndüren bir araç; aracının duraklamak yerine hatayı seslendirdiğini kontrol edin
- Yeniden bağlanma ve sürdürme; daha önce yaşadığım yeniden oynatma penceresi dahil
- Gürültülü ses, hızlı konuşma ve sayı ile adresleri heceleyen bir arayan
Bunların çoğunu yazarken canlı bir anahtarla çalıştırdım. İlginç başarısızlıklar, hatalar değil davranışsaldı: yukarıdaki sürdürme zamanlaması ve aralık dışı bir VAD eşiğinin reddedilmek yerine kabul edilmesi; yalnızca mutlu yolu test ederseniz sessizce bozuk gönderilecek türden şeyler. Çok dilli bir test de ekleyin ve dili nasıl adlandırdığınıza dair bir ayrıntı için SSS'lere bakın.
Bunlardan ikisini yazarak test edemezsiniz. app_streamlit.py bir Streamlit sayfasıdır; tarayıcıda canlı bir çağrı koyar: mikrofon aynı WebSocket'e WebRTC üzerinden akış yapar, aracının sesi geri akar ve soket boyunca açık kalır.
streamlit run app_streamlit.pyAracının üzerine konuşun; speech_started geldiği ve sayfa kuyruktaki sesi temizlediği için durur. Bu, kesintiler bölümündeki el sıkışmanın gerçekte çalışmasıdır.
Metin dökümünden ziyade sipariş kaydını izleyin: aracı bir teslimat değişikliğini geri okur ve bittiğini söyler; kayıt ya değişmiştir ya da değişmemiştir. Kulaklık takın. Açık hoparlörlerde aracı kendini duyar, bunu bir barge-in olarak sayar ve kendi cümlesini keser; bu da bir hoparlör telefonuyla arayanın size yapacağının ön izlemesidir.
Grok Voice Think Fast 2.0 Sınırlamaları ve Dağıtım Hususları
Şunlar için plan yapın: bir turun ortasında başarısız olan araç çağrıları, eylemin başarı düzeyinden daha kendinden emin bir onay konuşan bir model, sessiz bir ofis için ayarlanmış VAD'nin bir telefon hattında dağılması ve cümlenin ortasında fikrini değiştiren bir arayan.
Ödemeler, hesap erişimi veya kafası karışmış ya da üzgün gelen bir arayan için, bir insana yönlendirin. Model için bunun bir aracı olarak transfer_to_human verin: onsuz, yükseltmek yerine doğaçlama bir özür üretecektir.
Modüler bir konuşmadan metne, dil modeli, metinden konuşmaya yığını hâlâ yerini korur: her bileşen üzerinde ayrı kontrol ve herhangi bir mantık yürütmeden önce deterministik bir metin dökümü; bunun karşılığında daha fazla entegrasyon işi gerekir. Ve iş yükünüz hiç canlı karşılıklı konuşma gerektirmiyorsa, bir metin sohbet botu veya bir toplu döküm işi, kimsenin konuşmadığı gerçek zamanlı bir boru hattından daha basit ve ucuzdur.
Sonuç
Bu yazıdaki testler boyunca grok-voice-think-fast-2.0 çoğunlukla belgelerin söylediğini yaptı. Olay yaşam döngüsü ayakta kaldı, düşen bir bağlantı önceki turlarıyla geri geldi ve model açılış cümlesini hâlâ söylerken bir aracı çağırdı.
conversation.item.added üzerindeki adlandırma uyumsuzluğunun ötesinde, bayrağı değecek nokta, geriye kalan işin ne kadarının soketin sizin tarafınızda kaldığıdır: oynatma kuyrukları, ne zaman sessiz kalınacağı, ne zaman henüz bir sonraki sorunun sorulmayacağı.
Bugün bir projeye başlasam, varsayılanlarım alias yerine sürümlenmiş model dizesi, server_vad ile silence_duration_ms'in diğer iki ayardan önce ayarlanması, ölçülebilir bir gerekçe olmadıkça JSON taşıma, ilk session.update'de resumption.enabled ve başlangıçta session.model'in günlüğe kaydedilmesi olurdu.
Her türlü ses aracısına taşıyacağım alışkanlıklar: konuşulan onay yerine kayda göre yazmaları kontrol etmek, reddetmeleri istem yerine araca koymak, bir sonraki response.create'ten önce oynatmanın boşalmasına izin vermek ve gerçek aksanlar, gerçek gürültü ve araçların gerçekten başarısız oldukları şekilde başarısız olmalarına karşı test yapmak.
Açık uzantılar; telefon (SpaceXAI SIP desteğini doğrudan belgeliyor), kısa ömürlü belirteçlerle bir tarayıcı istemcisi, gerçek bir CRM'e MCP bağlantısı ve düzgün çok dilli bir sürüm. Ve oturum sınırlarına karşılaştırdığım Voice Agent API ihtiyaçlarınıza daha yakınsa, Grok Voice Agent API eğitimimiz bu yolu kapsar.
Veri hatları, bulut ve YZ araçları üzerinde çalışan; aynı zamanda DataCamp ve gelişmekte olan geliştiriciler için pratik, yüksek etkili eğiticiler yazan bir veri mühendisi ve topluluk inşacısıyım.
SSS
grok-voice-latest üretimde kullanmak için güvenli mi?
Yukarıdaki sürümleme bölümünde belirttiğim gibi pek sayılmaz. SpaceXAI'nin seçtiği bir tarihte geçiş yapar, sizin seçtiğinizde değil ve faturanız da onunla birlikte hareket eder. grok-voice-think-fast-2.0'ı sabitleyin ve alias'ı, beklenmedik bir geçişin canlı bir müşteri çağrısına denk gelmeyeceği yerel denemelere saklayın.
Grok Voice Think Fast 2.0 İngilizce dışındaki dilleri destekliyor mu?
Evet, yirmiden fazla dil otomatik algılama ile belgelenmiştir ve language_hint ile belirli bir dile doğru transkripsiyonu yönlendirebilirsiniz. İspanyolca ve Portekizce'nin es-MX veya pt-BR gibi bölgesel bir koda ihtiyaç duyduğunu unutmayın. Tek başına es veya pt kabul edilmez ve tanınmayan kodlar sessizce yok sayılır, otomatik algılamaya geri döner; dolayısıyla burada bir yazım hatası size bir şeye mal olmaz ama aynı zamanda hiçbir şey yapmaz.
Sesi değiştirebilir miyim, kaç tane var?
eve belgelere geçen ve benim de kullandığım sestir; ayrıca ara, rex, sal ve leo mevcuttur; özel ses kimlikleri de mümkündür. GET /v1/tts/voices mevcut listeyi döndürür. Hız sizi rahatsız ediyorsa, audio.output.speed 0.7 ile 1.5 arasında değer alır.
Aracının olduğundan daha hızlı yanıt vermesini sağlayabilir miyim?
Yürütmede atladığım reasoning.effort'ı deneyin; çünkü varsayılan genellikle doğrudur. Varsayılan olarak "high" gelir ve bir de "none" alır; bu da modelin tur başına yaptığı planlamayı azaltır. Basit sorgulama akışlarında uygundur. Araçlar arasında seçim yapması gereken herhangi bir şeye dokunmazdım.
Bunu oluşturmak için resmi SpaceXAI SDK'sına ihtiyacım var mı?
Hayır, önkoşullar bölümünde söylendiği gibi. Düz websockets paketi veya api.x.ai temel URL'sine yönlendirilmiş OpenAI uyumlu bir istemci, her ikisi de çalışır. Bilmeniz gereken bir şey: resmi xai-sdk, bu WebSocket ile konuşmayan ayrı bir gRPC istemcisidir; bu yüzden onda gerçek zamanlı yöntemler aramayın. Benimkinden başka bir başlangıç noktası için, xai-cookbook iOS, web, WebRTC ve telefon örneklerine sahiptir.
