0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Grok STT・TTS API入門 — xAIの音声APIをPythonで実装する

0
Last updated at Posted at 2026-04-29

はじめに

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 アプリの開発コストを下げながら、高精度な音声処理を実現したい場合に有力な選択肢です。

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?