TL;DR:今天 xAI 发布了 Grok Voice Think Fast 2.0,登顶 Tau Voice 基准测试,首音频延迟 0.70s,定价 $0.08/min。本文带你用 3 段代码走通整个 xAI Voice API——TTS、语音克隆、WebSocket 实时语音助手,直接上手。
为什么值得关注
7 月 30 日,xAI 正式推出 Grok Voice Think Fast 2.0,这是目前 Speech-to-Speech 赛道最快的模型之一:
- Tau Voice 基准第一(56.5%),击败 OpenAI、Google、阿里千问
- 首音频延迟仅 0.70s,前五名中唯一低于 1 秒的模型
- 定价 $0.08/min,约为 OpenAI GPT-Realtime-2.1 的一半
- 支持 WebSocket 双向流式对话,兼容 OpenAI Realtime API 协议
- 提供 26 种旗舰语音 + 自定义语音克隆,覆盖 25+ 语言
这不是一个只看看的产品发布——xAI Voice API 已经完整开放,开发者拿到 API Key 就能调用。下面直接上代码。
核心能力拆解
xAI Voice API 提供三个层级的能力,从简单到复杂:
- TTS(Text-to-Speech)——一行 curl 把文字转语音,支持 26 种声音 + 语速/音调控制
- Custom Voice(语音克隆)——上传 120 秒参考音频即可创建专属声音
- Speech-to-Speech(实时对话)——WebSocket 双向流,支持 VAD 断句、工具调用、会话恢复
下面每层给一个可以直接跑的代码段。
第一步:TTS——一行 curl 出音频
最基础的调用,5 秒验证 API Key 是否可用:
# 生成中文语音,直接输出为 MP3 文件
curl -X POST https://api.x.ai/v1/tts \
-H "Authorization: Bearer $XAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "你好,欢迎体验 Grok Voice 语音合成。这是中文测试。",
"voice_id": "eve",
"language": "zh"
}' \
--output hello_zh.mp3Python 版同样简洁:
import os, requests
resp = requests.post(
"https://api.x.ai/v1/tts",
headers={
"Authorization": f"Bearer {os.environ['XAI_API_KEY']}",
"Content-Type": "application/json",
},
json={
"text": "你好,欢迎体验 Grok Voice 语音合成。",
"voice_id": "eve",
"language": "zh",
},
)
resp.raise_for_status()
with open("hello_zh.mp3", "wb") as f:
f.write(resp.content)
print(f"已保存 {len(resp.content):,} 字节 → hello_zh.mp3")可选参数速查:
speed:0.7~1.5,语速倍率output_format:指定采样率(8kHz~44.1kHz)和码率,支持 MP3/PCM/μ-lawwith_timestamps:返回字符级时间戳,适合字幕/口型同步text_normalization:自动将数字/符号转为口语化表达optimize_streaming_latency:0~2,流式首帧延迟优化优先级
第二步:Custom Voice——创建自己的声音
不需要微调,只需上传一段参考音频(WAV/MP3,最长 120 秒):
# 创建自定义声音
curl -X POST https://api.x.ai/v1/custom-voices \
-H "Authorization: Bearer $XAI_API_KEY" \
-F "name=My Voice" \
-F "language=zh" \
-F "file=@reference.wav;type=audio/wav"
# 返回: {"voice_id": "nlbqfwie", "name": "My Voice", "language": "zh", ...}拿到 voice_id 后,直接用于 TTS 调用:
curl -X POST https://api.x.ai/v1/tts \
-H "Authorization: Bearer $XAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "这是我的自定义语音,效果还不错吧?",
"voice_id": "nlbqfwie",
"language": "zh"
}' \
--output custom_voice_demo.mp3提示:参考音频建议用清晰的人声,背景噪音低,语速自然。同一个 voice_id 可以反复使用,不支持增量更新,不满意就重新创建。
第三步:Speech-to-Speech——搭建实时语音助手
这是最核心的能力——通过 WebSocket 建立双向语音流,支持 VAD 自动断句、工具调用(搜索/MCP)、会话恢复。
完整可跑的 Python 代码:
import asyncio, json, os, websockets
async def voice_agent():
"""通过 WebSocket 连接 Grok Voice,开启实时语音对话"""
url = "wss://api.x.ai/v1/realtime?model=grok-voice-latest"
headers = {"Authorization": f"Bearer {os.environ['XAI_API_KEY']}"}
async with websockets.connect(url, additional_headers=headers) as ws:
# 1. 配置会话——选择声音、系统提示语、开启 VAD
await ws.send(json.dumps({
"type": "session.update",
"session": {
"voice": "eve",
"instructions": "你是一个温暖贴心的语音助手,用中文简短回答。",
"turn_detection": {
"type": "server_vad", # 自动检测人声
"threshold": 0.85, # 激活阈值
"silence_duration_ms": 800, # 静音多久算说完
},
"tools": [{ # 挂载搜索能力
"type": "web_search",
"name": "web_search"
}],
}
}))
print("[会话已初始化] 声音: eve | 语言: 中文 | VAD: 开启")
# 2. 发送一条文本消息开始交互
await ws.send(json.dumps({
"type": "conversation.item.create",
"item": {
"type": "message",
"role": "user",
"content": [{
"type": "input_text",
"text": "帮我查一下今天AI行业有什么大新闻"
}]
}
}))
await ws.send(json.dumps({"type": "response.create"}))
# 3. 监听服务端事件流
async for raw in ws:
event = json.loads(raw)
t = event["type"]
if t == "response.audio.delta": # 收到音频块
pass # audio_data = event["delta"] → 播放
elif t == "response.text.delta": # 同步的文本(可用于字幕)
print(event["delta"], end="", flush=True)
elif t == "response.done": # 本轮回复结束
print("\n[回复完成]")
elif t == "error":
print(f"[错误] {event}")
break
asyncio.run(voice_agent())关键参数说明:
turn_detection.type: "server_vad"——服务端自动判断用户何时说完,无需手动控制silence_duration_ms——静音多长判定为"说完",值越大用户暂停越不会被截断prefix_padding_ms——VAD 触发前补录的音频(默认 333ms),防止句首被吞idle_timeout_ms——若设置,助手会在用户长时间不说话时主动追问resumption.enabled: true——开启会话恢复,断连重连后自动恢复上下文
实践建议
- 先用 TTS 搞清流程:curl 跑通 → Python 封装 → 理解参数含义,5 分钟就能做完
- 语音克隆可以玩但别太认真:120 秒参考音频做出的效果够 demo,但离生产级还有差距,多录几条对比
- Speech-to-Speech 的 VAD 参数是关键:中文和英文的语速差异大,
silence_duration_ms推荐中文设 800-1000ms,英文 600-800ms - 浏览器端用 Ephemeral Token:不要把 API Key 塞到前端,用服务端生成短期令牌(
xai-client-secret.前缀)传给 WebSocket - 参考 xAI Cookbook 的完整项目:GitHub 上有 iOS、Web(WebSocket/WebRTC)、Telephony(Twilio)四种示例应用,可以直接改
