音声エージェントを本番で動かしていて、「今朝から急に声の間が変わった」「割り込みの反応が違う」「でもエラーログは真っ白」という状態になっていませんか。原因はコードでもネットワークでもなく、接続先のモデルが入れ替わったことです。
結論:エラーではなく、エイリアスの中身が替わっただけ
2026年10月14日、xAI が grok-voice-3.0 の提供を開始し、同時に grok-voice-latest の指す先が grok-voice-2.0 から grok-voice-3.0 に切り替わりました。公式リリースノートは「grok-voice-latest now points to grok-voice-3.0, so sessions that use the alias are upgraded automatically. The API is unchanged.」と書いています。エンドポイント・session パラメータ・イベント・料金はすべて同じままなので、例外もステータスコードも出ません。
直し方は1箇所だけです。WebSocket の接続URLにあるクエリパラメータ model を、エイリアスではなくバージョン付きの名前にします。つまり model=grok-voice-latest を model=grok-voice-3.0 に書き換えるだけで、以後は勝手に世代が上がらなくなります。2.0 のまま据え置くこともできますが、同日付で非推奨(Deprecated)になったため、終了(EOL)が来れば今回と同じように黙って差し替えられます。
なぜ気づきにくいのか:ログに何も残らない
通常のモデル入れ替えなら、パラメータの非対応やレスポンス形式の差異で何かが落ちます。今回は API 仕様が無変更なので、監視やアラートに引っかかる材料がありません。気づくきっかけは機械ではなく人で、「声の印象が変わった」「オペレーターへの引き継ぎのタイミングがずれる」という報告の形で上がってきます。
中身は確かに変わっています。xAI が公開しているベンチマークの差は次のとおりです。
指標 | Grok Voice 2.0 | Grok Voice 3.0 |
|---|---|---|
AA Speech-to-Speech Index | 81.3 | 86.9 |
Speech Reasoning(Big Bench Audio) | 97.2% | 98.5% |
人の好み(Speech Agent Arena Elo) | 1011 | 1070 |
タスク完遂率 | 94.6% | 94.8% |
会話の自然さ(Full Duplex Bench) | 95.1% | 97.0% |
注目したいのは「会話の自然さ」と「人の好み」の伸びです。xAI は 3.0 のレイテンシを1秒未満(class-leading)と説明し、τ-Voice では 71.6% で GPT-Live-1(Astra)と同等ながらレイテンシは40%低いとしています。ターン取りのタイミング・割り込みの扱い・応答の長さ・間の取り方が変わるということで、応答を秒単位でチューニングしていた本番ほど差が出ます。
声の識別子(voice)そのものは変わっていません。ただ同じ voice でも世代が違えば読み方・速さ・間は変わりうるので、「声が変わった」と感じること自体はおかしくありません。3.0 と 2.0 の違いを腰を据えて比べたい場合は、Grok Voice 3.0 と 2.0 で何が変わったかを項目別に並べた記事のほうが早いです。
なお、文字起こし専用の grok-voice-transcribe-* は音声対話とは別のモデル系列なので、今回の切り替えとは無関係です。そちら側で起きた自動切替は文字起こしモデル 1.0 から 2.0 への自動移行の記事にまとめています。
モデルIDを固定する書き方
Grok Voice の接続は WebSocket で、model はクエリパラメータとして渡します。公式ドキュメントも「Pass model as a query parameter; use a versioned name to pin to a specific release.」と明記しています。固定する場所はこのURLの1箇所だけです。
wss://api.x.ai/v1/realtime?model=grok-voice-3.0
公式 Quick Start(Python / websockets)の形はこうなっています。websockets.connect("wss://api.x.ai/v1/realtime?model=grok-voice-latest", additional_headers={"Authorization": f"Bearer {os.environ['XAI_API_KEY']}"}) で接続し、その後 session.update イベントで {"voice": "eve", "instructions": "...", "turn_detection": {"type": "server_vad"}} を送ります。この1行目の grok-voice-latest を grok-voice-3.0 にするだけで固定は完了します。
実務では定数1箇所+環境変数に切り出す
公式の Model Selection のサンプルも、MODEL = "grok-voice-latest" と定数に置いて url = f"wss://api.x.ai/v1/realtime?model={MODEL}" と組み立てる形です。実装が iOS(Swift)・Web(WebSocket)・WebRTC・電話(Twilio)と複数あっても、直すのは同じ1箇所です。
実務では、この定数を環境変数から読むところまで用意しておくと安全です。検証環境だけ次の世代に上げて聞き比べ、問題がなければ本番の環境変数を切り替える手順が取れます。直書きだと世代を上げるたびにデプロイが必要になり、切り戻しも遅れます。
3つの選択肢の比べ方
model の値 | 何が起きるか | いつ壊れるか | どんな時に選ぶか |
|---|---|---|---|
grok-voice-latest | 新世代が出ると自動で上がる | 次の世代が出た日(予告なし・エラーなし) | 社内検証・デモなど、挙動が変わってもすぐ直せるもの |
grok-voice-3.0 | この世代に固定される | この世代が EOL を迎えた時(日付は未発表) | 本番。まずここに固定するのが基本 |
grok-voice-2.0 | 当面は従来の挙動のまま動く | 非推奨なので EOL が来れば後継へ差し替わる(日付は未発表) | 当日中に 3.0 の検証が終わらない時の時間稼ぎ |
認証は、サーバー側からの接続なら API キー、ブラウザやアプリから直接つなぐなら Ephemeral Tokens を使います。API キーをクライアントに置かないのは固定の話とは別に守るべき前提です。
2.0 に据え置く場合のリスクの見積り方
「とりあえず 2.0 に戻して様子を見る」は有効な一手ですが、解決ではなく延命です。grok-voice-2.0 の EOL 日は公式に発表されていません。ここは推測で日付を埋められないところで、「いつ来るか分からない」が今わかっている正確な情報です。
見積りの手がかりになるのが、同じ xAI の文字起こし側で実際に起きたことです。grok-voice-transcribe-1.0 は2026年10月2日に EOL を迎え、そのスラッグへのリクエストは同額で grok-voice-transcribe-2.0 にルーティングされました。別系列の話なので今回の挙動をそのまま予測する材料にはなりませんが、エイリアスではなく明示指定していても、EOL が来れば差し替えられるという事実の実例としては読めます。つまり 2.0 へのピン留めも、永久に挙動を凍結してくれるわけではありません。
現実的な段取りは、2.0 で一旦止血しつつ、同じ週のうちに 3.0 で挙動を合わせ込む作業に入ることです。料金は 2.0 と 3.0 で同額なので、コストを理由に据え置く必要はありません。月額の見積りはGrok Voice 3.0 の料金内訳と通話時間ごとの試算をまとめた記事で確認できます。
3.0 で挙動を合わせ込むためのつまみ
session パラメータには、感じている違和感をそのまま打ち返せる設定が揃っています。症状から引いてください。
症状 | 触るパラメータ | 設定の目安 |
|---|---|---|
応答が遅い/考えすぎる | reasoning.effort | 既定の "high" を "none" に落とす |
読み上げが速い・遅い | audio.output.speed | 0.7〜1.5(既定 1.0)で微調整 |
割り込み・ターン取りが変わった | turn_detection.type | "server_vad"(自動)か null(手動のテキストターン) |
黙られた時に会話が止まる | turn_detection.idle_timeout_ms | 既定 null。設定すると無音継続でアシスタントから話しかける(応答ごとに張り直し) |
社名・商品名を読み間違える | replace | TTS 前の発音置換。例 {"Acme Mobile": "Acme Mobull"} |
社名・固有名詞を聞き取れない | audio.input.transcription.keyterms | 優先認識させる語を登録(最大100語・各50文字) |
日本語以外に流れる | audio.input.transcription.language_hint | BCP-47 で "ja" を指定(セッション中の更新も可) |
再接続で文脈が飛ぶ | resumption.enabled | true にすると conversation_id をキーに会話ターンを再生(既定 false) |
replace はモデル出力を音声合成にかける直前の置換なので、読みだけを直して文字起こしのテキストは汚しません。社名が崩れて聞こえる問題は、プロンプトでねじ伏せるよりこちらが確実です。
システムプロンプト(instructions)は、公式の Prompting Guide が二人称で書き、節の順序を固定することを推奨しています。注意点は1つ、世代が変わると同じ指示の効き方が変わることです。モデルIDの固定とプロンプトの版はセットで管理してください。モデルだけ固定してプロンプトを触り続けると、次に挙動がぶれた時に原因の切り分けができません。
音声コーデックは PCM / PCMU / PCMA / Opus、サンプルレートは PCM で 8000〜48000 まで対応しているので、電話回線の 8kHz にもそのまま乗ります。電話応対に組み込む場合の全体像はAI音声ボットで電話応対を自動化する構成の記事が参考になります。
二度と黙って変わらないための運用
今回の件は、設定を1行直して終わりにできる一方で、同じことが次の世代でも起きます。実務で回すなら、次の6つを決めておくと再発しません。
- 本番はエイリアスを使わない。必ずバージョン付きの名前で固定する。latest は検証環境とデモだけに許す。
- モデルIDは定数1箇所+環境変数。コードに直書きせず、デプロイなしで切り替えられる状態にしておく。
- 固定した版・プロンプトの版・音声設定を1枚にまとめる。model・voice・speed・turn_detection・keyterms・replace を並べた表があれば、挙動が変わった時に何を戻せばいいかが即わかる。
- xAI のリリースノートを定点で見る。週1回でも十分で、非推奨の記載が増えた時に気づければ間に合う。
- 回帰テストを音で残す。固有名詞20語の読み上げと、代表シナリオ3本(受付・予約変更・クレーム一次対応など)を録音して保存し、版を上げる時は必ず聞き比べる。ベンチの数値では「お客様の印象」は測れません。
- 切り替えは検証環境 → 一部トラフィック → 全面の順。一気に替えると、戻すまでの時間がそのまま顧客体験の劣化になる。
Mihata ではこうした音声・チャットのエージェントを、お客様の業務に合わせて組む独自AI開発のお手伝いもしています。記事の途中で恐縮ですが、モデルの世代交代に振り回されない作り方まで含めてご相談いただける内容なので、よろしければ合わせてご覧いただけたら嬉しいです。
そもそも繋がらない場合の切り分け
挙動の変化ではなく、本当に接続できていないケースもあります。ここは今回の世代交代とは別の話で、確認する順番が決まっています。
- 同時セッションは10本/チーム。上限に張り付いていると新しい接続が取れません。
- 1セッションは最長120分。長時間の常駐用途では、切れる前提で再接続を実装します(resumption.enabled が効きます)。
- リージョンは us-east-1。国内からの接続では、この物理距離ぶんの往復が常に乗ります。
- 認証は Ephemeral Token(クライアント)かサーバー側の API キー。クライアントに API キーを置いた実装は、動いていても直すべき状態です。
課金は音声が1分あたり $0.08($4.80/時)、テキスト入力が conversation.item.create イベント1件あたり $0.004 です。server_vad ではセッションが開いている時間で課金されるため、押しボタン式(push-to-talk)に変えると送受信した音声ぶんだけになります。他のサービスと並べて検討したい場合は音声AIエージェントの月額コストを構成別に比較した記事をご覧ください。
まとめ
2026年10月14日に起きたのは障害ではなく、grok-voice-latest の中身が 3.0 に替わったことだけです。API は無変更・同額で自動アップグレードされるため、エラーは出ず、気づくのは人の耳からになります。
やることは、接続URLの model をバージョン付きの名前で固定し、reasoning.effort・audio.output.speed・turn_detection といったつまみで 3.0 の挙動を自社のシナリオに合わせ込むことです。2.0 への据え置きは時間稼ぎとして使えますが、EOL 日が未発表である以上、いつ同じことが起きるかはわかりません。日本語対応や無料枠、会話データの扱いはGrok Voice を業務で使う前に確認したい論点をまとめた記事に整理しています。
自社の構成で判断がつかない場合は、現状の実装を拝見したうえでご相談に乗ります。
よくある質問
grok-voice-latest が勝手に 3.0 になりました。エラーは出ていませんが何が起きたのですか?
2026年10月14日に xAI が grok-voice-3.0 を提供開始し、grok-voice-latest の指す先が 2.0 から 3.0 に切り替わりました。API は無変更・同額で自動アップグレードされる仕様なので、エラーもログも出ません。変わるのは応答の速さ・ターン取り・間の取り方など、聞いて分かる部分です。
モデルのバージョンを固定するにはどこを直せばいいですか?
WebSocket の接続URLのクエリパラメータ model を、エイリアスからバージョン付きの名前に変えるだけです。wss://api.x.ai/v1/realtime?model=grok-voice-3.0 のようにします。公式ドキュメントも、特定リリースにピン留めするにはバージョン付きの名前を使うよう案内しています。
grok-voice-2.0 に戻して使い続けても大丈夫ですか?
当面は動きますが、2.0 は2026年10月14日付で非推奨になりました。終了日は公式に未発表です。文字起こし側の grok-voice-transcribe-1.0 は2026年10月2日に終了し、明示指定していたリクエストも同額で後継へルーティングされました。据え置きは時間稼ぎと考え、3.0 で挙動を合わせ込むほうが安全です。
3.0 にしたら応答が速すぎる・遅すぎると感じます。どこを調整しますか?
読み上げの速さは audio.output.speed(0.7〜1.5、既定1.0)で直接調整できます。考えすぎて応答が遅いと感じる場合は reasoning.effort を既定の high から none に落とします。割り込みやターン取りの違和感は turn_detection.type と idle_timeout_ms で詰めます。
社名や商品名の読み間違い・聞き取り間違いは直せますか?
読み間違いは replace で、音声合成にかける前に発音を置き換えられます。文字起こしのテキストは汚れません。聞き取れない場合は audio.input.transcription.keyterms に語を登録して優先認識させます。最大100語・各50文字までで、セッション中の更新も可能です。