Kurs
SpaceXAI’nin Grok Voice Think Fast 2.0’ı bir konuşmadan konuşmaya modelidir. WebSocket üzerinden ona ses gönderirsiniz, o da size sesle yanıt verir; bu sırada model, karar verdiği bir fonksiyon çağrısı çoktan çalışırken gerekçelendirmeye devam edip konuşabilir. Ayrı bir konuşmadan metne, ayrı bir metinden konuşmaya adımı yok.
SpaceXAI Think Fast 2.0’ı 29 Temmuz 2026’da duyurdu: ilk sesin daha hızlı gelmesi, daha kararlı tam çift yönlü davranış (kesin dönüşler yerine konuşurken dinleme) ve turun erken safhasında tetiklenen araç çağrıları. Kıyas konuşmasını kısa tutacağım; bir eğitimde önemli olan, kodunuzda nelerin değiştiğidir.
Çevrimiçi bir mağaza için müşteri destek sesli aracısı kuracağız. Arayan bir sipariş hakkında sorabilir, teslimat talimatını değiştirebilir, iptal edebilir, temsilcinin cümlesini yarıda kesebilir ve bağlantı koptuktan sonra sohbeti kaldığı yerden sürdürebilir. Bu, Grok Voice Agent Builder eğitiminin anlattığı kodsuz Yapıcı değil, API yoludur. Konsol-öncelikli sürüm için önce oradan başlayın.
Grok Voice Think Fast 2.0 Nedir?
Grok Voice Think Fast 2.0, SpaceXAI’nin Speech to Speech API’si için en yeni modelidir; çoğu kişinin Grok Voice dediği ürünün resmi adıdır. Şirketi hâlâ xAI olarak hatırlıyorsanız, aynı ekip: 6 Temmuz 2026’da SpaceX’e katılıp SpaceXAI olarak yeniden markalandı. API yeniden markaya uymadı, 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 ve bağlamın kaybolabileceği bir nokta ekler. Think Fast 2.0, aynı bağlantı üzerinden ses veya metin alıp ses veya metin üreten tek bir modele bunu indirger.

Konuşmadan konuşmaya WebSocket ile üç hizmetli hat mimarisi karşılaştırması. Görsel: Yazar.
Yalnızca konuşan değil harekete geçen bir aracı için önemli olan, gerekçelendirme ile konuşmanın paralel yürümesidir. SpaceXAI, araç çağrılarının ajanın ilk cümlesini bitirmesinden “genellikle” önce çalışmaya başladığını söylüyor; bu kelime burada gerçekten kritik.
SpaceXAI’nin Artificial Analysis’ten aktardığı kıyaslarda Think Fast 2.0, Konuşmadan Konuşmaya Endeksi’nde 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çinin genel bir kıyastaki rakamları, çağrı akışınız hakkında bir hipotezdir; bir test planı değil.
Üç model dizesi göreceksiniz: grok-voice-latest, grok-voice-think-fast-2.0 ve grok-voice-think-fast-1.0. Prototipleme sırasında kısaltma kullanışlıdır ama başka hiçbir şey için yeterince stabil değildir.
4 Ağustos 2026’da test ettiğimde grok-voice-latest hâlâ grok-voice-think-fast-1.0’a çözülüyordu; SpaceXAI’nin sürüm notları ertesi gün Think Fast 2.0’a geçişi planlıyordu. Bu geçiş, model değişimi kadar fiyat değişimidir de: 1.0 için dakikada 0,05 $’a karşı 0,08 $; yani sabitlenmemiş bir kısaltma, kodunuzda tek satır değişmeden daha pahalıya gelir. Yayına aldığınız her yerde sürümlü dizeyi sabitleyin.
Ne İnşa Edeceğiz
Aracı, bir destek hattının aldığı talepleri karşılar: bir siparişi bulma, arayanın numarası yoksa e-postadan bulma, teslimat talimatını değiştirme, iptal, bir talep açma veya kontrol etme ve çağrıyı bir kişiye aktarma. Bu sırada kesintiler ve düşen bir bağlantı da karşımıza çıkar.
Tek bir betik yerine birkaç küçük dosyadan oluşur; çünkü her parçanın işi farklıdır ve onları ayrı ayrı test etmek isteyeceksiniz. Yapı şöyle:
-
config.pyAPI anahtarını yükler; model dizesi, örnekleme hızı ve uç nokta URL’lerini tutar -
voice_client.pyWebSocket’i sarmalar, faturalandırmayı izler ve gönderme/alma yardımcıları 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 birleştiren olay döngüsünü barındırır -
token_server.pykısa ömürlü jetonlar basan 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 döneceğim
Öğretim yolu terminalden ilerler. Demo mikrofona ekleme yapar.
Ön Koşullar
Bir SpaceXAI hesabına, bir API anahtarına, fonlanmış bir faturalandırma düzenine (kalıcı bir ücretsiz katman yoktur ve yeni hesap promosyon kredileri sizi taşımayacaktır) ve asyncio ile WebSocket’lere, await’in satır satır açıklaması olmadan da takip edebilecek kadar aşinalığa ihtiyacınız var.
SpaceXAI’nin hızlı başlangıç örnekleri, özel bir SDK yerine ham websockets paketini kullanır; biz de öyle yapacağız. Dokümanlarda zorunlu bir Python sürümü belirtilmiyor. Ben 3.11 üzerinde test ettim.
API anahtarını sunucuda tutun. Bir tarayıcı veya mobil uygulama Voice API ile doğrudan konuşacaksa, gerçek anahtarınız yerine aşağıda güvenlik bölümünde ele aldığım bir kısa ömürlü jeton alır.
Projeyi kurma
Aşağıdaki her dosya proje deposunda yer alıyor; bu yüzden 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; python-dotenv anahtarınızı okur. Kalanlar jeton uç noktası ve tarayıcı demosunu kapsar. Anahtarınızı .env içine koyun:
XAI_API_KEY=xai-your-key-here
Kurulumun çoğu bu kadar. İlginç olan bağlantının kendisi.
Grok Voice Gerçek Zamanlı API’yi Anlamak
Grok Voice ürün adıdır. Kod yazdığınız şey ise wss://api.x.ai/v1/realtime adresindeki bir WebSocket uç noktasıdır; tüm konuşma tek bir soket üzerinden akan JSON olayları akışı olarak gerçekleşir.
Olay yaşam döngüsü
Bir bağlantı sabit bir şekli takip eder: bağlanır bağlanmaz sunucu session.created ve conversation.created gönderir; siz ses ve araçları yapılandırmak için session.update gönderirsiniz; sunucu bunu session.updated ile teyit eder; buradan itibaren konuşma öğeleri oluşturur ve yanıt istersiniz. Bunu canlı bir anahtarla çalıştırdım; sıra dokümanlarla birebir örtüştü.
-
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ç sonucu ekler -
response.create(istemci) modelden konuşmasını ister; sunucu VAD bunu sizin yerinize otomatik gönderir -
response.output_audio.deltaveresponse.output_audio_transcript.delta(sunucu) yanıtı üretilirken akış halinde gönderir -
response.done(sunucu) turu kapatır
İki şey kafa karıştırır. Yukarıda bağladığım Konuşmadan Konuşmaya doküman sayfası, oturum devamında conversation.item.created olayından bahseder; ancak kanonik olay referansı yalnızca conversation.item.added’ı listeler ve yaptığım her testte gelen buydu; dolayısıyla ona göre kodlayın. Ayrıca çoğu bağlantının birkaç saniye içinde beliren, belgelenmemiş bir ping olayı göreceksiniz; bunu bir hata olarak okumamanız için anıyorum.
Ses biçimleri ve taşıma
Kodek ve taşıma ayrı tercihlerdir. audio.input.format ve audio.output.format altında ayarlanan kodek şunlardır: 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 hat üzerinden nasıl gittiğidir:
-
json(varsayılan) sesiinput_audio_buffer.appendveresponse.output_audio.deltaiçinde base64 metni olarak gönderir; günlüğe almak ve hata ayıklamak kolaydır -
binaryWebSocket ikili çerçeveleri olarak ham kodek baytları gönderir; base64 yükünü atlar ama mesaj tipine göre dallanması gereken bir alma döngüsü gerektirir
JSON ile başlayın. Dokümanlardaki her örnek onu kullanır; incelemesi çok kolaydır ve base64 yükü bir destek aracı inşasını tıkayan şey değildir. Ölçerek bir gerekçe bulursanız 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’si OpenAI Realtime API’sini o kadar yakından takip eder ki çoğu istemci kodu temel URL ve anahtarı değiştirerek taşınır; ancak birebir bırak-çalıştır değildir.
Transkriptler burada conversation.item.input_audio_transcription.updated olarak gelir; OpenAI’nin delta’sinden farklıdır. Birkaç OpenAI olayı desteklenmez ve SpaceXAI kendi uzantılarını ekler: betimlenmiş bir bilgilendirme satırı için force_message, yeniden bağlantılar için resumption ve metinden konuşma öncesi yanlış telaffuz edilen marka adlarını düzeltmek için replace.
Gerçek Zamanlı Sesli Aracıyı Kurmak
Protokol yeter. İşte onunla konuşan istemci.
Bağlanma ve oturumu yapılandırma
Bağlantı, bir yetkilendirme jetonu ve bir model sorgu parametresiyle açılır; gönderdiğiniz ilk mesaj, aracının davranışına ilişkin 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ı ister. SpaceXAI’nin geçiş notları, GPT dönemindeki eski sesli modeller için yazılan istemleri birebir aktarmak yerine basitleştirmenizi söylüyor. Benimki, yanıtları kısa tutmasını, bir seferde bir soru sormasını ve işlem yapmadan önce yazdığı her şeyi geri okumasını söylüyor. Sesli onay bir UX nezaketidir; güvenlik kontrolü değildir. Uygulamanız yine de yazma işleminin 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. Bir yazım hatası nedeniyle ücretli bir isteğin düşürülmesi ve bunun belirtilmemesi tuhaf bir varsayılandır. Başlangıçta bir kez session.created’ın session.model alanını günlüğe kaydedin ve istediğinizi aldığınızı kontrol edin.

Bağlandıktan sonra görünen session.created çıktısı. Görsel: Yazar.
Kullanıcı sesini akışla gönderme
turn_detection.type server_vad olarak ayarlandığında, tek yapmanız gereken sesi eklemeye devam etmektir. Arayanın konuşmayı ne zaman kestiğine sunucu karar verir ve yanıtı sizin için tetikler. Bunun yerine null ayarlarsanız bu karara siz sahip olursunuz; turun bittiğini düşündüğünüzde arabelleği açıkça işlersiniz.
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’inin üç ayarı vardır ve bunları yanlış almak, günlüklerde hata görünmezken bir sesli aracının bozuk hissettirmesinin en yaygın yoludur. Varsayılan olarak hiçbiri session.updated’ın yansımasında görünmez; bu yüzden varsaymak yerine belgelere göre kontrol edin.
-
threshold(0.1–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çıyorsa düşürün -
silence_duration_ms: Sunucunun arayan susunca turu bitirmesi için gereken süre; çok kısa olursa insanlar düşünürken yarıda keser, çok uzun olursa hantal hissi verir -
prefix_padding_ms(varsayılan 333): Konuşma algılanmadan hemen önceki sesten elde tutulan bir dilim; ilk hecenin kırpılmaması için
Arayanlar düşünmek için duraksarken sık kesiliyorsa önce silence_duration_ms ayarını yapın. Diğer ikisine dokunmadan önce benim ilk tercih ettiğim odur.
Yanıtı alma ve oynatma
Ses, response.output_audio.delta olarak küçük parçalar halinde gelir; akışın amacı, response.done’ı beklemek yerine her parça iner inmez ç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)
Transkripti üretimde de saklayın. “Ajan tuhaf bir şey söyledi” dendiğinde elinizdeki en ucuz hata ayıklama aracıdır.
Sesli Aracıya Araçlar Ekleme
Yalnızca konuşan bir sesli aracı, mikrofona sahip bir sohbet botudur.
Sipariş araçlarını oluşturma
Her araç, bizim tarafta bir JSON şeması ile düz bir Python fonksiyonundan oluşur. Model veritabanına hiç 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ı olursa güvenle yeniden denenebilir. Yazma işlemleri için durum farklıdır: Belirsiz bir zaman aşımından sonra update_delivery_instructions’ı yeniden denemek aynı değişikliği iki kez uygulayabilir. İstemdeki bir onay satırı bunu engellemez; bunun yerine yazmalara bir idempotency anahtarı veya çoğaltma kontrolü verin.
Reddedilmeleri de fonksiyona koyun. cancel_order, “gönderilmiş siparişler asla iptal edilmesin” diyen bir istem bir öneri olduğu ve reddeden bir fonksiyon öneri olmadığı için, gönderilmiş bir siparişi iptal etmek yerine bir neden ve alternatif döndürür.
Araç çağrısı döngüsünü yönetme
Dört adım; sırası göründüğünden daha ö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 fazla function_call_arguments.done olayı tetikler. Hepsini çözüp her sonucu tek bir response.create’dan önce gönderin. Çok erken gönderirseniz model, hâlâ uçuşta olan çağrılardaki bağlam olmadan yanıtlar.
SpaceXAI’nin belgelediği ve benim de ilk seferde takıldığım bir püf noktası var: araç sonucunuz çıkar çıkmaz response.create göndermek, hâlâ çalınmakta olan giriş cümlesiyle çakışabilir. Bir çalıştırmada “ORD-1042 siparişinin durumunu hemen kontrol edeceğim” diyerek açtı ve cümlenin ortasında aracı çağırdı; bu yüzden anında yanıt, kendi giriş cümlesinin üzerine konuşmasına yol açardı.
Geçerli turun sesinin bitmesini 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, ajanın yanıtının ortasında konuşur ve bir WebSocket düşer; yeniden bağlanmak gerekir.
Doğal kesintileri destekleme
server_vad açıkken barge-in sunucu tarafında otomatiktir: arayanın yeniden konuştuğunu algıladığı anda input_audio_buffer.speech_started sinyalini verir ve eski yanıtın üretimini durdurur. Sizin işiniz el sıkışmanın istemci kısmıdır; kuyrukta bekleyen sesi temizleyerek ajanın, kimsenin dinlemek istemediği cümleyi bitirmek yerine susmasını sağlamak.
if event["type"] == "input_audio_buffer.speech_started":
playback_queue.clear()
Manuel, VAD’siz oturumlar için, response.cancel aynı işi isteğe bağlı yapar. Ayrıca bir asistan öğesini gerçekten duyulana kadar budamak için conversation.item.truncate vardır. Dokümanlar var olduğunu teyit eder ama canlı bir barge-in sırasında ne zaman tetikleneceğini belirtmez; zamanlamayı kendiniz test edin.
Bunu, yanıt ortasında teslimat talimatı değişikliğiyle test ettim: isteği başlatın, ajanın onayının ortasında farklı bir adresle araya girin. Önemli olan, ajanın sesi kesilmesi değil; düzeltilmiş talimatı uygulayıp uygulamadığıdır. Sessizliği değil, sipariş kaydını doğrulayın. Sonda yer alan tarayıcı demosu bunu duymanızı sağlar.
Kopan bir oturumu sürdürme
Oturum devamı tercihe bağlıdır ve bellek 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 dahil olun.
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, transkriptler, araç çağrıları ve araç sonuçları bir sonraki sorunuzdan önce yeniden oynatılır; önbellek 30 dakikalık hareketsizlikten sonra kaybolur. Bunu bir sipariş hakkında soru sorup bağlantıyı düşürerek ve kendimi tekrar etmeden takip sorusu için yeniden bağlanarak test ettim; aracı ETA’yı doğru şekilde sürdürdü.
Belgesiz bir ayrıntı: Yeniden oynatma anında gelmez; soket açılır açılmaz fırlatılan bir soru onu geçebilir ve önceki turun hafızası olmadan dönebilir. Suçu devam özelliğine 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 biterse veya arayan yarın tekrar ararsa sıfır bağlamla başlarsınız ve bu tasarım gereğidir.
Aracıyı Güvenceye Alma ve İzleme
Kalıcı bir API anahtarını asla tarayıcı veya mobil koda koymayın. İstemci doğrudan bağlanacaksa kısa ömürlü bir jeton basın:
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ı, WebSocket el sıkışmasında özel bir Authorization başlığı ayarlayamaz; bu yüzden jetonu sec-websocket-protocol başlığı üzerinden, xai-client-secret. önekiyle iletir.

Sunucu jetonu basar, tarayıcı çağrıya katılır. Görsel: Yazar.
Faturalandırma iki sayaç üzerinden çalışır. Gönderilen veya alınan ses, az önce bahsettiğim dakikada 0,08 $ üzerinden, yani saatte 4,80 $; ve ses olmayan, function_call_output olmayan her conversation.item.create sabit 0,004 $ maliyetlidir. response.create hiç faturalandırılmaz. Her response.done, testimde output_audio_seconds ile ayrı bir billable_audio_seconds bildiren bir usage nesnesi taşır. Tahminlerden değil, bunlardan faturalandırın.
Konuşmadan Konuşmaya API için belgelenen sınırlar, takım başına 10 eşzamanlı oturum ve 120 dakikalık oturum sınırıdır; her ikisi de us-east-1’dedir. Kapasite planını, farklı olan Voice Agent API’sinin rakamlarından yapmayı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 boyunca şifreli saklandığını ve izin olmadan eğitim için kullanılmadığını; ekiplerin Sıfır Veri Saklama’yı açabileceğini, ancak ZDR’nin kalıcı sesli aracı konuşma geçmişini düşürdüğünü ve bu nedenle devamla çalışmadığını söylüyor.
Bir çağrının kaydedildiğini veya AI tarafından işlendiğini açıklıyorsanız, bunun için daha önce saydığım force_message uzantısı vardır. Satır, modelin serbestçe yeniden ifade ettiği bir cümle yerine yazıldığı gibi çalınır.
Sesli Aracıyı Test Etme
WebSocket el sıkışmasında 200 durumu, aracının doğru şeyi yaptığı hakkında hiçbir şey söylemez. Yalnızca bağlantıyı değil, sonucu test edin.
- Kayıttaki bilgiye karşı kontrol edilerek, yalnızca bir yanıt geldiğini değil, düzgün bir sipariş sorgusunu doğrulama
- Yarıda kesilen bir yanıt; oynatmanın durduğunu ve aracının yeni isteği ele aldığını doğrulama
- Onay gerektiren bir teslimat güncellemesi; sipariş kaydına göre kontrol
- Gönderilmiş bir siparişi iptal etmek gibi bir ret; ajanın kuralı açıklaması, özür dilemek yerine
- Bilinmeyen bir sipariş numarası; ajanın bir durum uydurmak yerine bunu söylediğinden emin olun
- Hata döndüren bir araç; ajanın oyalanmak yerine bunu sesli ifade ettiğini kontrol edin
- Yeniden bağlanma ve devam; daha önce bahsettiğim yeniden oynatma penceresi dahil
- Gürültülü ses, hızlı konuşma ve numaraları ile adresleri heceleyen bir arayan
Bunların çoğunu yazarken canlı bir anahtarla koştum. İlginç hatalar, hatadan ziyade davranışsaldı: yukarıdaki devam zamanlaması ve menzil dışı bir VAD eşiğinin reddedilmek yerine kabul edilmesi; sadece mutlu patikayı test ederseniz sessizce bozuk yayımlanabilecek türden. Çok dilli bir test de ekleyin ve dili nasıl adlandıracağınıza dair bir ayrıntı için SSS’lere bakın.
Bunlardan ikisini yazarak test edemezsiniz. app_streamlit.py tarayıcıda canlı bir çağrı koyan bir Streamlit sayfasıdır: mikrofon aynı WebSocket’e WebRTC üzerinden akış yapar, ajanın sesi geri akış yapar ve soket boyunca açık kalır.
streamlit run app_streamlit.pyAjanın üzerine konuşursanız durur; çünkü speech_started gelir ve sayfa kuyruktaki sesi boşaltır. Kesintiler bölümündeki el sıkışmasının gerçekte çalışmasıdır.
Transkriptten ziyade sipariş kaydını izleyin: aracı bir teslimat değişikliğini geri okur ve tamamlandığını söyler; kayıt ya değişmiştir ya da değişmemiştir. Kulaklık kullanın. Açık hoparlörlerde aracı kendini duyar, bunu barge-in sayar ve kendi cümlesini keser; bu da bir hoparlörlü telefon aramasında yaşayacağınızın ön izlemesidir.
Grok Voice Think Fast 2.0 Sınırlamaları ve Yayına Alma Hususları
Şunları planlayın: bir turun ortasında başarısız olan araç çağrıları, eylemin başarısından daha emin bir onayı seslendiren bir model, sessiz bir ofise göre ayarlanmış VAD’in telefon hattında dağılması ve cümlenin ortasında fikrini değiştiren bir arayan.
Ödemeler, hesap erişimi veya kafası karışık ya da üzgün gelen bir arayan için bir insana aktarın. Bunun için modele bir transfer_to_human aracı verin: olmadan, yükseltmek yerine doğaçlama bir özür üretir.
Modüler konuşmadan metne, dil modeli, metinden konuşmaya yığını hâlâ yerini korur: her bileşen üzerinde ayrı kontrol ve gerekçelendirme olmadan önce belirleyici bir transkript; daha fazla entegrasyon çalışması karşılığında. Ve iş yükünüz canlı karşılıklı konuşmayı hiç gerektirmiyorsa, kimsenin konuşmadığı gerçek zamanlı bir hattın yerine bir metin sohbet botu veya toplu transkripsiyon işi daha basit ve daha ucuzdur.
Sonuç
Bu yazıdaki testler boyunca grok-voice-think-fast-2.0 büyük ölçüde belgelerin söylediğini yaptı. Olay yaşam döngüsü korundu, düşen bir bağlantı önceki turlarıyla geri geldi ve model açılış satırını söylerken bir aracı çağırdı.
conversation.item.added üzerindeki adlandırma uyumsuzluğunun ötesinde, işaretlemeye değer olan şey, kalan işin ne kadarının soketin sizin tarafınızda olduğudur: oynatma kuyrukları, ne zaman sessiz kalınacağı, ne zaman henüz sonraki sorunun sorulmayacağı.
Bugün bir projeye başlasaydım varsayılanlarım; kısaltma yerine sürümlü model dizesi, diğer iki ayardan önce ayarlanan server_vad ile silence_duration_ms, ölçülebilir bir ihtiyaç olana kadar JSON taşıma, ilk session.update’da resumption.enabled ve başlangıçta session.model’in günlüğe yazılması olurdu.
Her sesli aracıya taşıyacağım alışkanlıklar: sesli onaya değil kayda göre yazmaları doğrulamak, 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 olduğu biçimde başarısız olmasına karşı test etmek.
Açık uzantılar; telefon (SpaceXAI doğrudan SIP desteğini belgeliyor), kısa ömürlü jetonlarla bir tarayıcı istemcisi, gerçek bir CRM’e bir MCP bağlantısı ve doğru düzgün çok dilli bir sürüm. Ve oturum sınırlarına karşılaştırma yaptığım Voice Agent API ihtiyaçlarınıza daha yakınsa, Grok Voice Agent API eğitimimiz o 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 hareket eder, sizin seçtiğinizde değil ve faturanız da onunla birlikte gelir. Üretimde grok-voice-think-fast-2.0’ı sabitleyin; kısaltmayı, sürpriz bir geçişin canlı müşteri çağrısına denk gelmeyeceği yerel deneyler için saklayın.
Grok Voice Think Fast 2.0 İngilizce dışındaki dilleri destekliyor mu?
Evet; otomatik algılama ile yirmiden fazla dil belgelenmiştir ve language_hint ile belirli bir dile eğilim verebilirsiniz. İspanyolca ve Portekizce’nin es-MX veya pt-BR gibi bölgesel bir koda ihtiyaç duyduğunu not edin. Salt es veya pt kabul edilmez; tanınmayan kodlar sessizce yok sayılır ve otomatik algılamaya geri döner; bu yüzden buradaki bir yazım hatası size bir şeye mal olmaz ama aynı zamanda hiçbir şey yapmaz.
Sesi değiştirebilir miyim, kaç tane ses var?
eve dokümanlarda yer alan ve benim de kullandığım sestir; ayrıca ara, rex, sal ve leo mevcuttur; özel ses kimlikleri de desteklenir. Geçerli listeyi GET /v1/tts/voices döndürür. Tempo 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?
Varsayılan genelde doğru olduğu için yürütmede atladığım reasoning.effort’ı deneyin. Varsayılan "high" olarak gelir; ayrıca tur başına yaptığı planlamayı azaltan "none" değerini alır. Basit sorgu akışlarında uygundur. Araçlar arasında seçim yapmak gereken hiçbir şeyde dokunmam.
Bunu kurmak için resmi SpaceXAI SDK’sına ihtiyacım var mı?
Hayır; ön koşullar bölümünde söylendiği gibi. Düz websockets paketi veya api.x.ai temel URL’sine yöneltilmiş 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; dolayısıyla üzerinde 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.

