10 分钟上手 xAI Grok Voice API:语音合成 + 语音克隆 + 实时对话,三步搞定

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 提供三个层级的能力,从简单到复杂:

  1. TTS(Text-to-Speech)——一行 curl 把文字转语音,支持 26 种声音 + 语速/音调控制
  2. Custom Voice(语音克隆)——上传 120 秒参考音频即可创建专属声音
  3. 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.mp3

Python 版同样简洁:

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/μ-law
  • with_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——开启会话恢复,断连重连后自动恢复上下文

实践建议

  1. 先用 TTS 搞清流程:curl 跑通 → Python 封装 → 理解参数含义,5 分钟就能做完
  2. 语音克隆可以玩但别太认真:120 秒参考音频做出的效果够 demo,但离生产级还有差距,多录几条对比
  3. Speech-to-Speech 的 VAD 参数是关键:中文和英文的语速差异大,silence_duration_ms 推荐中文设 800-1000ms,英文 600-800ms
  4. 浏览器端用 Ephemeral Token:不要把 API Key 塞到前端,用服务端生成短期令牌(xai-client-secret. 前缀)传给 WebSocket
  5. 参考 xAI Cookbook 的完整项目:GitHub 上有 iOS、Web(WebSocket/WebRTC)、Telephony(Twilio)四种示例应用,可以直接改

资源链接

滚动至顶部