跳到文章正文
Grok 实用教程

Grok Voice 3.0怎么接入?版本迁移、WebSocket连接与首段语音验证

依据10月14日官方更新,将 Grok Voice 2.0 迁移至3.0,用最小服务端示例接收语…

已有Grok语音应用使用旧模型时,先确认它固定了哪个版本,比盲目重写音频链路更重要。xAI于2026年10月14日发布Voice 3.0,并弃用Voice 2.0。下面先检查迁移,再用一段服务端程序验证“文本输入、语音输出”,为后续接麦克风建立可定位的起点。

第一步:检查固定版本与latest别名

官方当前文档列明grok-voice-latest指向grok-voice-3.0。已经使用latest别名的会话会升级到3.0;固定grok-voice-2.0的代码应改为grok-voice-3.0。公告说明端点、会话参数和事件保持兼容,但应用自己的音频播放、轮次处理和工具调用仍需回归测试。

该接口是xAI开发者API,需要有效密钥与额度,不是给普通聊天窗口填写一个模型名。不要把语音对话模型与grok-voice-transcribe-2.0混用:前者用于双向实时会话,后者用于识别录音,任务与接口不同。

第二步:只验证最小语音输出

先安装支持additional_headers参数的新版websockets,例如14或更高版本,并设置本机环境变量XAI_API_KEY。下面代码发送一句文字,接收默认JSON路径下的音频增量,按指定采样率保存voice-test.wav。它不采集麦克风,也不是完整通话应用。示例只做语法核对,未执行付费调用。

import asyncio, base64, json, os, wave
import websockets

async def run():
    chunks = []
    url = "wss://api.x.ai/v1/realtime?model=grok-voice-3.0"
    headers = {"Authorization": "Bearer " + os.environ["XAI_API_KEY"]}
    async with websockets.connect(url, additional_headers=headers) as ws:
        await ws.send(json.dumps({"type": "session.update", "session": {
            "voice": "eve", "turn_detection": None,
            "instructions": "用两句话回答,解释清楚,不使用外部工具。",
            "audio": {"output": {"format": {"type": "audio/pcm", "rate": 24000}}}
        }}))
        async for message in ws:
            event = json.loads(message)
            kind = event.get("type")
            if kind == "session.updated":
                await ws.send(json.dumps({"type": "conversation.item.create",
                    "item": {"type": "message", "role": "user", "content": [
                        {"type": "input_text", "text": "请解释浏览器缓存有什么用。"}]}}))
                await ws.send(json.dumps({"type": "response.create"}))
            elif kind in ("response.output_audio.delta", "response.audio.delta"):
                chunks.append(base64.b64decode(event["delta"]))
            elif kind == "error":
                raise RuntimeError(event.get("error", {}).get("message", "API error"))
            elif kind == "response.done":
                break
    if not chunks:
        raise RuntimeError("No audio received; inspect response events")
    with wave.open("voice-test.wav", "wb") as output:
        output.setnchannels(1)
        output.setsampwidth(2)
        output.setframerate(24000)
        output.writeframes(b"".join(chunks))

asyncio.run(asyncio.wait_for(run(), timeout=60))

第三步:分层核对结果

连接成功只证明WebSocket和鉴权通过;收到session.updated说明配置已应用;保存出非空音频才说明至少拿到了语音数据。最后用音频播放器打开WAV,确认能听清、语速正常、内容回应了提问。不能因为程序没报错就宣布实时会话完成。

尖锐噪声、倍速或时长明显不对,优先检查输出编码与播放采样率。本文固定PCM、单声道、16位和24000Hz,WAV头必须匹配实际返回音频。若切换为binary传输,不能继续把二进制消息当JSON解析;迁移测试时先保持原传输方式。

第四步:再接输入和轮次控制

有了可播放的输出,再按官方文档接音频输入。server_vad可检测用户停止说话,手动轮次则需要正确处理输入提交与响应创建。不要同时开启两套互相重复的轮次触发逻辑,否则可能出现多答一次或截断。用短句、长停顿和中途纠正分别测试。

第五步:检查客户端与迁移范围

服务端可以在Authorization中使用长期API密钥;浏览器和移动客户端应使用短期Ephemeral Token,不能把长期密钥打进网页包。本文样例在本机服务端环境运行。上线前还要验证断线、取消和播放停止,避免旧响应音频继续排队。

保留原配置与测试样本,逐项比较模型名、会话参数、接收到的事件和播放效果。此次迁移不要求凭空替换全部接口;真正的完成标准是新版本路径可运行,语音可播放,现有轮次与工具流程没有被破坏。

官方资料

资料核对日期:2026年10月19日。

本文地址:https://www.163264.com/17388