はじめに
2026年4月、xAI は Grok の音声認識(STT)と音声合成(TTS)をスタンドアロン API として一般公開しました。Tesla 車内インフォテインメントや Starlink カスタマーサポートで実績を積んだ音声スタックを、開発者が直接 API 経由で利用できるようになりました。
この記事では、以下について解説します。
この記事で学べること
- Grok STT API(音声認識)の基本的な使い方
- WebSocket を使ったリアルタイムストリーミング文字起こしの実装
- 話者分離(Speaker Diarization)機能の活用法
- Grok TTS API(音声合成)と音声タグによる表現制御
- 料金体系と他サービスとの使い分け
対象読者
- Python を使って音声 AI アプリを開発したい方
- 既存の STT/TTS サービスからの移行を検討している方
- コールセンター・議事録自動化・音声ナビなどを構築したい方
前提条件
- Python 3.10 以上
- xAI API キー(xAI コンソール から取得)
-
requests/websocketsライブラリ
TL;DR
-
STT API:
POST/WSS https://api.x.ai/v1/stt— バッチ $0.10/hr・ストリーミング $0.20/hr -
TTS API:
POST https://api.x.ai/v1/tts— $4.20/1M 文字、5つの音声オプション - 25 言語対応・話者分離・単語レベルタイムスタンプ付き
- Tesla / Starlink と同じ音声スタックを API 経由で利用可能
- SOC 2 Type II / HIPAA / GDPR 準拠のエンタープライズグレード
Grok 音声 API の全体像
xAI の音声 API には、用途別に 3 つのエンドポイントが用意されています。
| API | エンドポイント | 用途 |
|---|---|---|
| Speech to Text(STT) | POST/WSS https://api.x.ai/v1/stt |
音声ファイル・リアルタイム音声 → テキスト |
| Text to Speech(TTS) | POST https://api.x.ai/v1/tts |
テキスト → 音声ファイル |
| Voice Agent | WSS https://api.x.ai/v1/voice |
リアルタイム双方向音声会話エージェント |
本記事では STT API と TTS API に焦点を当てます。Voice Agent API は会話型 AI エージェントを構築する際に使用する、より高度なエンドポイントです。
STT API の実装
REST API で音声ファイルを文字起こし
バッチ処理(既存の音声ファイルを文字起こしするケース)では REST エンドポイントを使います。
import os
import requests
XAI_API_KEY = os.environ["XAI_API_KEY"]
def transcribe_file(audio_path: str) -> dict:
"""音声ファイルをテキストに変換する"""
with open(audio_path, "rb") as f:
response = requests.post(
"https://api.x.ai/v1/stt",
headers={"Authorization": f"Bearer {XAI_API_KEY}"},
files={"file": (audio_path, f, "audio/mpeg")},
data={"model": "grok-stt"},
)
response.raise_for_status()
return response.json()
result = transcribe_file("meeting.mp3")
print(result["text"])
対応フォーマット: MP3、WAV、MP4、WebM など主要な 12 形式に対応しています。上限サイズ等の最新制限は公式ドキュメントを参照してください。
単語レベルタイムスタンプの取得
議事録作成や字幕生成では、各単語の開始・終了時刻が必要になります。word_timestamps=true を渡すことで取得できます。
def transcribe_with_timestamps(audio_path: str) -> dict:
with open(audio_path, "rb") as f:
response = requests.post(
"https://api.x.ai/v1/stt",
headers={"Authorization": f"Bearer {XAI_API_KEY}"},
files={"file": (audio_path, f, "audio/mpeg")},
data={
"model": "grok-stt",
"word_timestamps": "true",
"language": "ja", # 言語を明示指定(省略時は自動検出)
},
)
response.raise_for_status()
return response.json()
result = transcribe_with_timestamps("interview.mp3")
for word in result.get("words", []):
print(f"[{word['start']:.2f}s - {word['end']:.2f}s] {word['word']}")
話者分離(Speaker Diarization)の活用
複数人の対話を含む録音では、「誰がいつ何を言ったか」を把握することが重要です。speaker_diarization=true で話者ごとにラベルを付与できます。
def transcribe_with_diarization(audio_path: str) -> dict:
with open(audio_path, "rb") as f:
response = requests.post(
"https://api.x.ai/v1/stt",
headers={"Authorization": f"Bearer {XAI_API_KEY}"},
files={"file": (audio_path, f, "audio/mpeg")},
data={
"model": "grok-stt",
"speaker_diarization": "true",
"word_timestamps": "true",
},
)
response.raise_for_status()
return response.json()
result = transcribe_with_diarization("panel_discussion.mp3")
for segment in result.get("segments", []):
speaker = segment.get("speaker", "unknown")
text = segment.get("text", "")
start = segment.get("start", 0)
print(f"[Speaker {speaker} @ {start:.1f}s] {text}")
Inverse Text Normalization(ITN) も利用可能です。ITN は音声認識の出力をより読みやすい形に変換する処理で、「one hundred twenty three」を「123」のように変換します。
WebSocket でリアルタイムストリーミング
ライブ字幕や通話リアルタイム文字起こしなど、低レイテンシが求められる用途には WebSocket エンドポイントを使います。
import asyncio
import websockets
import json
async def stream_transcription(audio_generator):
"""リアルタイム音声をストリーミング文字起こし"""
uri = "wss://api.x.ai/v1/stt"
headers = {"Authorization": f"Bearer {XAI_API_KEY}"}
async with websockets.connect(uri, extra_headers=headers) as ws:
# 設定を最初に送信
await ws.send(json.dumps({
"model": "grok-stt",
"language": "ja",
"word_timestamps": True,
}))
# 音声フレームを送信しながらトランスクリプトを受信
async def send_audio():
async for chunk in audio_generator:
await ws.send(chunk) # バイナリフレームとして送信
await ws.send(json.dumps({"type": "end_of_stream"}))
async def receive_transcripts():
async for message in ws:
data = json.loads(message)
if data.get("type") == "transcript":
print(f"[{data.get('is_final', False)}] {data['text']}")
await asyncio.gather(send_audio(), receive_transcripts())
レート制限: WebSocket は 1 チーム最大 100 セッションまで同時接続できます。REST は 600 リクエスト/分が上限です。
TTS API の実装
テキストから音声を生成
import os
import requests
def synthesize_speech(text: str, voice_id: str = "ara", output_path: str = "output.mp3"):
"""テキストを音声ファイルに変換する"""
response = requests.post(
"https://api.x.ai/v1/tts",
headers={
"Authorization": f"Bearer {os.environ['XAI_API_KEY']}",
"Content-Type": "application/json",
},
json={
"model": "grok-tts",
"text": text,
"voice_id": voice_id,
"output_format": {"codec": "mp3", "sample_rate": 24000, "bit_rate": 128000},
},
)
response.raise_for_status()
with open(output_path, "wb") as f:
f.write(response.content)
print(f"音声ファイルを保存しました: {output_path}")
synthesize_speech("Grok TTS API の音声合成テストです。", voice_id="ara")
5 つのボイスオプション
xAI TTS API には、用途に応じて選択できる 5 つの音声があります。
| ボイス名 | 特徴 | 推奨用途 |
|---|---|---|
| Eve | エネルギッシュ・活気あり | プロモーション動画、ナレーション |
| Ara | 温かみ・親しみやすい | カスタマーサポート、教育コンテンツ |
| Rex | プロフェッショナル・落ち着き | ビジネスプレゼン、企業向けアプリ |
| Sal | スムーズ・流暢 | ポッドキャスト、音声ニュース |
| Leo | 権威ある・力強い | ニュース読み上げ、公式アナウンス |
音声タグで表現力を高める
TTS API は音声タグに対応しており、より自然で表現豊かな音声を生成できます。
インライン タグ(タグを直接テキスト内に記述):
text_with_tags = """
今日の発表について、とても嬉しいです [laugh]
実は、この機能は [breath] 半年かけて開発しました。
"""
synthesize_speech(text_with_tags, voice_id="ara", output_path="expressive.mp3")
ラッピング タグ(範囲を指定して効果を適用):
text_with_wrapping = """
<whisper>これは内緒の話ですが</whisper>、
新しい機能が来週リリースされる予定です。
"""
synthesize_speech(text_with_wrapping, voice_id="leo", output_path="dramatic.mp3")
主な音声タグ一覧:
| タグ | 種別 | 効果 |
|---|---|---|
[laugh] |
インライン | 笑い声を挿入 |
[breath] |
インライン | 呼吸音を挿入 |
[sigh] |
インライン | ため息を挿入 |
<whisper>テキスト</whisper> |
ラッピング | 囁き声で読み上げ |
<soft>テキスト</soft> |
ラッピング | 柔らかいトーンで読み上げ |
<loud>テキスト</loud> |
ラッピング | 大きな声で読み上げ |
ストリーミング TTS
長いテキストをリアルタイムに再生したい場合は、ストリーミングモードを使用します。
def stream_synthesis(text: str, voice_id: str = "ara", output_path: str = "stream.mp3"):
"""TTS をストリーミングで生成・保存"""
with requests.post(
"https://api.x.ai/v1/tts",
headers={
"Authorization": f"Bearer {os.environ['XAI_API_KEY']}",
"Content-Type": "application/json",
},
json={
"model": "grok-tts",
"text": text,
"voice_id": voice_id,
"output_format": {"codec": "mp3", "sample_rate": 24000, "bit_rate": 128000},
"stream": True,
},
stream=True,
) as response:
response.raise_for_status()
with open(output_path, "wb") as f:
for chunk in response.iter_content(chunk_size=4096):
f.write(chunk)
# 実際のアプリではここで音声を再生バッファに追加する
料金体系
| API | モード | 料金 |
|---|---|---|
| STT | バッチ(REST) | $0.10 / 時間 |
| STT | ストリーミング(WebSocket) | $0.20 / 時間 |
| TTS | — | $4.20 / 100 万文字 |
主要サービスとの比較
| サービス | STT(バッチ) | TTS |
|---|---|---|
| Grok | $0.10/hr | $4.20/1M chars |
| OpenAI Whisper | $0.006/min(= $0.36/hr) | $15.00/1M chars |
| ElevenLabs | $0.40/hr(PAYG標準料金) | $60〜$120/1M chars(モデルにより変動) |
Grok STT は主要な競合と比較して約 3〜4 倍の価格優位性があります。TTS も ElevenLabs と比較して大幅に安価です。
TTS の料金は入力文字数に対して課金されます。日本語は 1 文字 = 1 キャラクターとしてカウントされます。
エンタープライズ対応
xAI の音声 API はエンタープライズグレードのコンプライアンスに対応しています。
- SOC 2 Type II 認証: セキュリティ・可用性・処理の整合性を第三者機関が監査
- HIPAA 準拠: 医療系アプリへの組み込みが可能
- GDPR 準拠: EU 圏でのデータ処理に対応
- 専用スループット: エンタープライズ顧客向けに Provisioned Throughput を提供
- マルチリージョン: カスタム SLA 付きのマルチリージョンインフラ
ユースケース別の使い分け
| ユースケース | 推奨 API | 理由 |
|---|---|---|
| 会議録音の後処理 | STT REST | バッチ処理でコスト最小 |
| ライブ字幕 | STT WebSocket | リアルタイム性が必要 |
| コールセンター録音解析 | STT REST + 話者分離 | 複数話者の識別が必要 |
| IVR(自動音声応答) | TTS ストリーミング | 低レイテンシで音声生成 |
| 音声ナレーション生成 | TTS バッチ | 高品質な一括生成 |
| リアルタイム会話エージェント | Voice Agent API | 双方向音声対話が必要 |
まとめ
xAI の Grok STT/TTS API は、Tesla・Starlink で実証済みの音声スタックを手頃な料金で提供しています。
主なポイントをまとめます:
- STT: 25 言語対応・話者分離・単語タイムスタンプを $0.10/hr〜で利用可能
- TTS: 5 ボイス・音声タグによる表現制御を $4.20/1M 文字で利用可能
- 主要競合比で STT は約 3〜4 倍安価
- SOC 2 / HIPAA / GDPR 準拠でエンタープライズ用途に対応
- 同じ API キーで STT・TTS・Voice Agent を横断利用可能
音声 AI アプリの開発コストを下げながら、高精度な音声処理を実現したい場合に有力な選択肢です。
参考リンク
- xAI Voice APIs ドキュメント — 公式 API リファレンス
- xAI Grok STT・TTS API 発表ブログ — 2026-04-18 公式発表
- xAI モデル料金一覧 — 最新の料金・スペック
- xAI Python SDK — 公式 Python SDK