GROK VOICE TRANSCRIBE 2.0 / SPEECH TO TEXT
Grok Voice Transcribe 2.0は、音声をテキストに変換するAPIです。保存済みの録音はREST、会話中の字幕はストリーミング。用途を決めると、料金と必要な設定も整理できます。
1.0は2026年10月2日に提供終了。旧モデル名へのリクエストは、同料金の2.0へ転送されます。日本語の数字・金額などを整形する場合は、REST・ストリーミングともに format=true と language=ja を指定します。
根拠:公式リリースノート(10月2日の1.0終了) / 公式STTガイド(確認:2026年10月18日)
この記事で確認できること
料金、日本語の設定、録音ファイルの文字起こし、ストリーミングの接続例、1.0を使っていた連携の確認手順をまとめています。Grokアプリの音声会話や、Speech to Speechのモデルとは対象が異なります。
Grok Voice Transcribe 2.0は何に使う?
録音ファイルを文字にしたいならREST APIが出発点です。音声を送りながら字幕を出す必要がある場合に、WebSocketのストリーミングを選びます。
| やりたいこと | 選ぶ方法 | 判断のポイント |
|---|---|---|
| 会議・取材の録音を後から文字にする | STTのREST API | 保存済みファイルを送信。まず短い録音1本で出力を確認する。 |
| 話している途中から字幕を出す | STTのWebSocket | 音声を小分けで送信。暫定表示と確定結果を分けて扱う。 |
| Grokと声で会話する | GrokアプリのVoice | この記事の文字起こしAPIとは別。アプリの利用条件を確認する。 |
| コードを書かず、ときどき録音を文字にする | まず操作画面のあるサービスを比較 | API連携の準備・保守が負担なら、APIの安さだけで選ばない。 |
APIの利用にはキーの管理と従量課金の設定が必要です。録音内の重要な固有名詞や金額を、人が原音で確かめる工程も残します。
STTは「Speech to Text」の略です。音声の内容を文字にする機能で、議事録の要約・決定事項の抽出・担当者の確定までを自動で保証するものではありません。まず原文を保存し、その後で要約します。
アプリで声を使いたい方は、Grok Voice Modeの使い方と利用条件から確認してください。
Googleの音声認識モデルと比べて選びたい場合は、録音用とリアルタイム用のモデルの違いや料金をGemini 3.5 Transcribeの使い方|日本語精度と料金で整理しています。
料金は?RESTとストリーミングの違い
公表単価は、RESTが音声1時間あたり$0.10、ストリーミングが$0.20です。Grokアプリの月額契約とは別のAPI課金です。
| 音声時間 | REST | ストリーミング |
|---|---|---|
| 10分 | $0.0167 | $0.0333 |
| 30分 | $0.05 | $0.10 |
| 1時間 | $0.10 | $0.20 |
| 10時間 | $1.00 | $2.00 |
| 100時間 | $10.00 | $20.00 |
単価×音声時間の単純計算。10分の値は小数第5位を四捨五入しています。税、通貨換算、保存・通信・要約用APIなどの費用は含みません。請求の最終確認はAPI Consoleで行います。
根拠:公式STTモデル・料金・制限 / 公式アカウントFAQ(確認:2026年10月18日)
話者区別、単語ごとのタイムスタンプ、キーワード指定は、2.0の発表時点で追加料金なしと案内されています。導入時には、単価だけでなく音声を送信し直す回数と、人の確認にかかる時間も見積もっておきます。
根拠:公式2.0発表記事(確認:2026年10月18日)
API Consoleで支払いと上限を確認する
APIはクレジットを購入して使う方式が基本です。自動チャージを使う場合は、補充条件と月間の上限を確認します。アプリの契約やデモ画面が使えることを、APIの無料利用枠がある根拠にはしません。
モデル資料の標準値はREST・ストリーミングともに毎秒10リクエスト、ストリーミングはチームあたり同時100接続です。自分のチームに適用される値はConsoleで確認してください。毎秒のリクエスト数と同時接続数は、別々の制限です。
根拠:公式API課金ガイド / 公式STTモデル・料金・制限(確認:2026年10月18日)
日本語の設定と、精度を判断するポイント
日本語は対応言語です。自動言語検出もできますが、日本語の音声と分かっている場合は language=ja を指定できます。これは曖昧な音を日本語として認識しやすくする指定で、誤認識をなくす保証ではありません。
数字・金額・単位などの書き方を整えたい場合は、format=true も付けます。この2つはREST・ストリーミング共通です。「日本語に対応していること」と「出力表記を整形すること」は、分けて考えると設定を迷いません。
| 目的 | 設定 | 確認すること |
|---|---|---|
| 日本語と分かっている音声 | language=ja |
自動検出に任せる場合は省略可能。途中で別の言語に変わる音声も評価する。 |
| 数字・金額などを読みやすくする | format=truelanguage=ja |
値そのものが正しいかは、金額・日時・単位を原音と照合する。 |
| 1本の音声内で話者を区別する | diarize=true |
words 内の speaker を確認。番号は人名の自動特定ではない。 |
| 人名・製品名などの候補を伝える | keyterm を必要な語だけ指定 |
複数回指定でき、最大100語・各50文字。辞書による強制置換とは異なる。 |
| 「えー」なども残す | filler_words=true |
既定では除かれる。逐語性が必要な記録では原音と照合する。 |
根拠:公式STTガイド / 公式APIリファレンス(確認:2026年10月18日)
話者区別と、チャンネル別の文字起こしは別の機能
diarize=true は、音声内の話者を推定して区別する設定です。multichannel=true は、録音ファイルや入力信号のチャンネルをそれぞれ処理する設定です。1本に混ざった声が、後者を付けるだけで別の録音チャンネルになるわけではありません。
現行ガイドでは最大8チャンネルに対応しています。生の音声データではチャンネル数などの指定が必要です。ストリーミングのOpusはモノラルのみなので、マルチチャンネルと組み合わせないでください。
製品紹介ページとAPI資料で言語数やチャンネル数の記載が異なる場合があります。実装では、利用するエンドポイントの現行仕様を優先して確認します。
根拠:公式STTガイド(確認:2026年10月18日)
「高精度」という評価を日本語の保証にしない
公開ベンチマークのWERは、正解の文字起こしに対する単語の置換・削除・挿入を測る指標です。Artificial Analysisの評価は英語のデータセットに基づくため、その値を日本語の会議の誤り率として扱うことはできません。発話終了後の遅延も、長い録音ファイル全体を処理する時間とは異なります。
日本語での採用判断では、実際に使う分野の人名・製品名、数字、聞き取りにくい箇所、話者の切り替わりを確認します。本記事では精度の実測値を掲載せず、比較時に使える確認票を後半に用意しています。
根拠:Artificial Analysisの評価方法 / 公式2.0発表記事(確認:2026年10月18日)
発表当時のX投稿を確認する
以下は元記事に掲載されていた2026年9月19日の投稿です。投稿内容の確認日は元記事の9月23日を引き継いでいます。今回の更新で投稿本文を再取得できていないため、現在の仕様・順位の根拠には使用していません。
公式の発表投稿
Introducing Grok Voice Transcribe 2.0. It’s the world’s most accurate speech transcription model.
要旨:Grok Voice Transcribe 2.0の公開と精度を訴求した投稿。
Artificial Analysisの当時の投稿
Final Transcript: Grok Voice Transcribe 2.0 achieves 2.7% WER at 0.49s after end of speech.
要旨:当時の評価でWER 2.7%、発話終了後0.49秒と報告した投稿。日本語の実測値ではありません。
埋め込みが表示されない場合も、上の引用文とリンクから内容を確認できます。
音声を送信する前に確認すること
最初は、送信してよいと判断できる短い音声で確認します。機密の会議録や他人の音声を、そのまま動作確認に使う必要はありません。録音・外部送信の許可、組織のルール、サービスの契約条件を確認してください。
- APIキーは手元の環境変数やサーバー側で管理する。記事、公開リポジトリ、ブラウザーに配るJavaScriptへ貼らない。
- 元の音声と出力JSONを安全な場所に保存する。担当者・金額・期限など、誤りの影響が大きい箇所は原音で確認する。
- 学習利用の有無と、保存期間・保存先を別々に確認する。
公式FAQは、明示的な許可なくAPIの入出力を学習に使わないこと、監査目的のデータを暗号化して30日間保存することを案内しています。学習に使わないことは、データを一切保持しないことと同じではありません。モデル資料の提供リージョンは us-east-1 です。日本国内での保存を前提にせず、必要な条件を確認します。
根拠:公式データ・セキュリティFAQ / 公式STTモデル・料金・制限 / Enterprise利用規約(確認:2026年10月18日)
Zero Data Retention(ZDR)を検討する場合
ZDRはチーム単位の設定として案内されています。APIキー単位での切り替えではありません。利用可能なConsoleの設定と条件を確認し、Files/Collectionsなどの既存データや、使えなくなる状態保持機能への影響を調べてから有効にします。
なお、音声ファイルをまとめて送るSTTの「バッチ文字起こし」と、非同期処理の「Batch API」は別の機能です。ZDRの制限を読むときも混同しないでください。
根拠:公式データ・セキュリティFAQ(確認:2026年10月18日)
APIの使い方:録音からテキストを保存する
初めてなら、RESTで短い録音を1本送信し、JSONを保存するところまで確認しましょう。以下は手元のターミナルで実行する例です。記事のボタンはコードをコピーするだけで、音声の送信やAPIの実行はしません。
1.APIキーと音声ファイルを用意する
API Consoleでキーと支払い設定を確認します。Macではターミナルを開き、音声を置いたフォルダーへ cd で移動してください。以下のシェル例はBash用です。Mac標準のzshを使っている場合は、先に bash と入力して切り替えます。
例では meeting.mp3 を送信します。自分のファイル名に置き換えてください。curl 7.76以降と、出力をテキスト化するためのPython 3が必要です。ファイルの最大サイズは500MBで、MP3・WAV・M4A・FLACなどに対応しています。
キーの発行・管理が初めてなら、APIキーの発行方法と漏洩・料金の注意点を先に確認できます。
2.日本語の設定を付け、JSONを保存する
最初の入力待ちでAPIキーを貼り付けてEnterを押します。入力したキーは画面に表示されません。multipartのオプションはファイルより先に置き、file を最後のフォーム項目にします。
read -r -s -p "xAI API key: " XAI_API_KEY
printf '\n'
export XAI_API_KEY
curl --fail-with-body --show-error --silent \
https://api.x.ai/v1/stt \
-H "Authorization: Bearer $XAI_API_KEY" \
-F model=grok-voice-transcribe-2.0 \
-F language=ja \
-F format=true \
-F diarize=true \
-F filler_words=false \
-F '[email protected]' \
--output transcript.json
処理結果は同じフォルダーの transcript.json に保存されます。同名のファイルは上書きされるため、比較結果を残す場合は実行前に名前を変えてください。curlがエラーを返した場合は、次の処理へ進む前にJSON内のエラーと支払い・キー・入力ファイルを確認します。
固有名詞の候補を伝えたい場合は、-F 'keyterm=学べるブログ' のような項目を file より前に追加します。候補語は実際の音声に合わせて設定してください。
3.本文テキストを取り出し、原音と照合する
python3 - <<'PY'
import json
from pathlib import Path
result = json.loads(Path("transcript.json").read_text(encoding="utf-8"))
if "text" not in result:
raise SystemExit("textがありません。transcript.jsonのエラー内容を確認してください。")
Path("transcript.txt").write_text(result["text"] + "\n", encoding="utf-8")
print(result["text"])
print("音声の長さ(秒):", result.get("duration"))
print("単語と話者情報の件数:", len(result.get("words", [])))
PY
transcript.txt は読みやすい本文、transcript.json はタイムスタンプ・話者情報も確認するための記録です。duration は音声の長さを秒で表す値で、APIの処理時間ではありません。話者区別を有効にした場合、words 内の speaker を確認できます。
根拠:公式STTガイド / 公式APIリファレンス(確認:2026年10月18日)
会話中の字幕が必要な方へ:ストリーミングのPython例
以下は、保存済みの短いPCM音声を実時間相当の間隔で送り、接続手順を確認する例です。マイク録音アプリではありません。Python 3.11以降・FFmpegを用意し、先ほどと同じターミナルで実行してください。FFmpegが未導入の場合は、先にFFmpeg公式の配布案内を確認します。
最初に仮想環境を作り、音声をモノラル・16kHz・符号付き16-bit little-endianのPCMへ変換します。既存の meeting.pcm がある場合はFFmpegの上書き確認を読み、必要なら別名にします。
python3 -m venv .venv
source .venv/bin/activate
python -m pip install 'websockets==17.1'
ffmpeg -i meeting.mp3 -vn -ac 1 -ar 16000 \
-c:a pcm_s16le -f s16le meeting.pcm
次をテキストファイル stream_stt.py として保存します。Macのテキストエディットを使う場合は「標準テキスト」にし、拡張子が .py.txt になっていないことを確認してください。
import asyncio
import contextlib
import json
import os
from pathlib import Path
from urllib.parse import urlencode
from websockets.asyncio.client import connect
PARAMS = {
"model": "grok-voice-transcribe-2.0",
"encoding": "pcm",
"sample_rate": "16000",
"language": "ja",
"format": "true",
"diarize": "true",
"interim_results": "true",
"filler_words": "false",
}
async def main():
key = os.environ.get("XAI_API_KEY")
if not key:
raise SystemExit("XAI_API_KEYを同じターミナルで設定してください。")
audio = Path("meeting.pcm").read_bytes()
if not audio or len(audio) % 2:
raise SystemExit("空ではない16-bit PCM音声を用意してください。")
url = "wss://api.x.ai/v1/stt?" + urlencode(PARAMS)
headers = {"Authorization": f"Bearer {key}"}
async with connect(url, additional_headers=headers, max_size=16 * 1024 * 1024) as ws:
# 準備完了のイベントを受け取るまで音声を送らない。
async with asyncio.timeout(30):
while True:
event = json.loads(await ws.recv())
if event.get("type") == "error":
raise RuntimeError(event.get("message", "STT error"))
if event.get("type") == "transcript.created":
break
async def receive():
async for message in ws:
event = json.loads(message)
kind = event.get("type")
if kind == "error":
raise RuntimeError(event.get("message", "STT error"))
if kind == "transcript.partial":
# 暫定結果と確定結果は連結せず、状態付きで表示する。
print(event.get("is_final"), event.get("speech_final"),
event.get("text", ""), flush=True)
if kind == "transcript.done":
Path("stream-transcript.json").write_text(
json.dumps(event, ensure_ascii=False, indent=2),
encoding="utf-8",
)
print("最終イベントをstream-transcript.jsonに保存しました。")
return
raise RuntimeError("transcript.doneを受信する前に接続が閉じました。")
receiver = asyncio.create_task(receive())
try:
# モノラル・16kHz・16-bit:100msは3200バイト。
for start in range(0, len(audio), 3200):
if receiver.done():
await receiver
raise RuntimeError("音声の送信完了前に受信処理が終了しました。")
chunk = audio[start:start + 3200]
await ws.send(chunk)
await asyncio.sleep(len(chunk) / 32000)
await ws.send(json.dumps({"type": "audio.done"}))
await asyncio.wait_for(receiver, timeout=60)
finally:
if not receiver.done():
receiver.cancel()
with contextlib.suppress(asyncio.CancelledError):
await receiver
if __name__ == "__main__":
asyncio.run(main())
python stream_stt.py
サーバーの transcript.created を受信してから音声を送信し、最後に audio.done を送ります。この例はモノラル専用です。transcript.done の受信後に最終イベントを保存します。実行後は、保存されたJSONのテキストを原音と照合してください。
| is_final | speech_final | 表示・保存の考え方 |
|---|---|---|
| false | false | 暫定表示。後から修正されるので最終原稿に足し込まない。 |
| true | false | チャンクが確定。後の発話全体の確定イベントと重複させない。 |
| true | true | 発話全体が確定。結合済みの内容として扱う。 |
ストリーミングでは、MP3やWAVをそのままバイナリ送信するのではなく、指定したエンコーディングの音声を送ります。Opusを使う場合は、コンテナではなく1フレームにつき1つの生Opusパケットです。ブラウザーで動く製品に組み込む場合は、APIキーを公開せず、バックエンドを介して接続します。
このコードは接続と保存の最小例です。再接続・音声の再送・多チャンネルの完了待ち・UIへの字幕反映は用途に合わせて設計します。例の30秒/60秒はクライアント側の待機上限で、サービスの処理時間を保証する数値ではありません。
根拠:公式STTガイド / 公式APIリファレンス / websockets公式クライアント資料(確認:2026年10月18日)
1.0から2.0へ、どの連携を見直す?
grok-voice-transcribe-1.0 は2026年10月2日に提供終了となり、この名前へのリクエストは同料金の grok-voice-transcribe-2.0 へ転送されます。1.0という名前を指定していても、旧モデルの処理結果を維持する方法にはなりません。
現在は、モデル名を省略した場合の既定値も2.0です。連携では2.0を明示し、同じ評価用音声で文字起こし・話者区別・後処理への影響を確認します。旧名の指定だけで必ず停止エラーになる、とは説明できません。
比較に使うのは終了前に保存した1.0の出力です。今から1.0と2.0の名前を呼び分けても、新旧モデルの比較にはなりません。過去の出力がなければ、人が確認した正解原稿と比べます。
根拠:公式リリースノート(10月2日の1.0終了) / 公式STTガイド(確認:2026年10月18日)
モデル名を変えた後は、文章以外も確認する
確認対象は、文字の正しさだけではありません。話者番号、単語の区切り、時刻、数字の表記、フィラーの有無が変わると、字幕や議事録を作る後処理にも影響します。既存の処理が「特定の語がある」「特定の話者番号が出る」といった前提に依存していないか確認します。
次の確認票は、音声と期待結果をセットで保存して使います。合格条件は用途に合わせて先に決めてください。例えば請求に関わる音声なら、金額・単位・期日を重点確認項目にします。
Grok Voice Transcribe 2.0 移行確認票
対象:STT APIを使う既存連携
仕様確認日:2026-10-18
[ ] modelをgrok-voice-transcribe-2.0と明示した
[ ] 1.0指定も2.0へ転送されると関係者に共有した
[ ] 比較用の音声と、期待する文字起こしを用意した
[ ] 1.0比較には終了前に保存した出力を使った
(過去出力がなければ人が確認した正解原稿を使う)
[ ] language / format / diarize / filler_wordsを記録した
[ ] 人名・製品名・金額・日時・否定表現を原音で照合した
[ ] speaker番号と実際の発言者の対応を確認した
[ ] タイムスタンプと字幕・議事録の後処理を確認した
[ ] ストリーミングの暫定/確定表示に重複がない
[ ] 料金・利用上限・エラー時の扱いを確認した
連携名:
評価用音声と録音条件:
比較元(過去の1.0出力/正解原稿):
合格条件:
問題があった箇所・時刻:
修正内容/再確認日:
この確認票は本記事の判断手順です。公式の移行認定や品質保証ではありません。対象はSTT APIであり、GrokアプリのVoiceやSpeech to Speechのモデル終了とは別です。
うまく動かないときの確認順
設定を一度にいくつも変えず、短い音声で原因を切り分けます。同じファイル・同じ設定を記録しておくと、連携の変更による差も追いやすくなります。
| 症状 | 最初に見るところ | 次の対応 |
|---|---|---|
| 日本語の数字・金額が整形されない | format=true と language=ja の両方 |
RESTなら file の前に設定があるか確認。 |
| 固有名詞や小さな声を誤認識する | 原音の聞き取りやすさ、候補語の指定 | keyterm を試し、原音と比較。VADなどの変更は1項目ずつ評価する。 |
| 話者が区別されない/番号が違う | diarize=true、words の内容 |
話者番号を人名と固定対応させず、実際の発言と照合する。 |
| RESTで送信・認証に失敗する | エラー応答、キー、残高、ファイル名・形式・サイズ | エラー本文に沿って修正。秘密のキーや音声を公開して相談しない。 |
| ストリーミングが始まらない | 準備完了イベント、音声形式、サンプルレート | transcript.created を待ち、PCMの条件と送信間隔を確認する。 |
| ストリーミングの文章が重複する | is_final と speech_final |
暫定・チャンク確定・発話全体の確定を無条件に連結しない。 |
| 1.0の名前なのに結果が変わった | 2026年10月2日以降の自動転送 | 現行2.0として評価。過去の1.0出力が必要なら保存済み記録を参照する。 |
根拠:公式STTガイド / 公式リリースノート(10月2日の1.0終了)(確認:2026年10月18日)
大量の再試行をする前に、Consoleの利用状況と 公式ステータスページを確認してください。再送は料金や重複処理にも影響するため、自動再試行は回数と対象を決めて設計します。
よくある質問
Grokの有料プランに入っていれば、文字起こしAPIも使い放題ですか?
いいえ。GrokアプリとAPIの課金は別です。APIの支払い方法、残高、自動チャージの条件をConsoleで確認してください。
日本語の文字起こしにlanguage=jaは必須ですか?
言語は自動検出されるため、文字起こし自体では省略できます。ただし、日本語の数字・金額・単位などを整形するには、format=true と language=ja の両方を指定します。
1.0のモデル名を指定すると、以前の出力を再現できますか?
できません。2026年10月2日以降、旧名へのリクエストは2.0へ転送されます。旧モデルとの比較は、提供終了前に保存した出力を使います。
このAPIだけで議事録や字幕ファイルまで完成しますか?
レスポンスの文字列・単語情報を、その用途に合わせて加工する工程が必要です。議事録は原文と要約を分け、字幕では時刻と表示の区切りを確認します。この例はJSONと本文テキストの保存までを扱います。
「えー」「あの」なども含めた逐語録にできますか?
filler_words=true でフィラーを残す設定にできます。ただし、発言を漏れなく正確に記録する保証ではありません。逐語性が必要なら、元音声と照合して訂正します。
録音を送らず、まず動作を試せますか?
記事内のコピーや確認票は音声を送信せずに使えます。APIの認識結果を確かめる段階では、送信してよい短い音声を用意します。サービスのデモを使う場合も、送信先と利用条件を確認してください。
最初の1本で、使えるか判断する
Grok Voice Transcribe 2.0を使うときは、まず「録音済みファイルを処理するか、会話中に文字を出すか」を決めます。日本語の表記整形は format=true と language=ja。既存連携では、1.0の旧名を使い続けても処理先は2.0になります。
まずは、送信してよい30〜60秒ほどの音声を1本用意してください。RESTでJSONを保存し、人名・数字・話者を原音と照合します。使えると判断できてから、長い録音や既存の自動処理へ広げましょう。
再確認するタイミング:公式のモデル終了告知、料金・既定モデルの変更、言語・入力形式・パラメーターの変更、保存条件の改定、または自分の評価用音声で出力差が見つかったとき。
コメント