OpenAI Realtime APIを使って音声会話できるAIエージェントを構築したいけど、どこから始めたらいいか分からない。そんなエンジニアのための完全実装ガイドです。
結論:音声AIエージェントを最速で実装するならOpenAI Realtime API+WebSocketが最もコスパが良い
OpenAI Realtime APIは2024年11月に正式リリースされた最新の音声処理API。低遅延(150ms以下)の双方向通信に対応し、従来のREST APIより3〜5倍高速です。実装コストは初期セットアップで2〜3時間、月額コストは使用量に応じて数千〜数万円。WebSocketベースのストリーミング処理により、リアルタイム対話型のAIエージェント構築が可能になりました。
| 項目 | OpenAI Realtime API | 従来のWhisper API | Google Speech-to-Text |
|---|---|---|---|
| レイテンシ | 150ms以下 | 1~3秒 | 2~5秒 |
| 初期費用 | 無料(API key取得のみ) | 無料 | 無料 |
| 月額コスト(100時間利用時) | 約15,000円 | 約20,000円 | 約10,000円 |
| 双方向通信 | ✓(WebSocket) | ✗(REST API) | ✗(REST API) |
| リアルタイム対話 | ✓ | ✗ | ✗ |
OpenAI Realtime APIの概要と料金体系
Realtime APIとは何か・従来のAPIとの違い
OpenAI Realtime APIは、音声入力をリアルタイムで処理して音声出力を返すWebSocketベースのAPI。従来のWhisper APIは音声をテキストに変換するだけでしたが、Realtime APIはGPT-4の推論を含めた完全なエンドツーエンド処理が特徴です。
最大のメリットは低遅延。ユーザーの音声入力から0.15秒以内にAIの応答音声が生成されるため、人間らしい自然な会話が実現します。チャットボット、カスタマーサービス、AI講師、ゲームキャラクターなど、用途の幅が大きく広がりました。
料金体系と コスト試算
Realtime APIの価格は入出力で異なります。2026年1月時点での公式価格は以下の通り。入力(ユーザーの音声)は1分あたり0.10ドル、出力(AIの音声応答)は1分あたり0.20ドル。テキスト処理はGPT-4と同じレート(入力0.005ドル/1K tokens、出力0.015ドル/1K tokens)です。
実際の導入シナリオで試算すると、月間100時間の音声エージェント運用は音声処理費用が約15,000円。これに推論費用を加えると月15,000〜30,000円程度で済みます。大規模カスタマーサービス向けなら専用プランも相談可能です。
初心者向け:環境構築から初めての音声会話まで5ステップ
ステップ1:OpenAI APIキーの取得と認証設定
まずOpenAIのダッシュボード(https://platform.openai.com)でAPIキーを取得します。新規ユーザーは初回登録から3ヶ月間は無料トライアルとして5ドル分のクレジットが付与されます。
import os
from openai import OpenAI
# APIキーを環境変数から読み込み
api_key = os.getenv("OPENAI_API_KEY")
client = OpenAI(api_key=api_key)
# 認証確認
print("✓ OpenAI APIキーが正常に読み込まれました")
環境変数の設定は、ターミナルでexport OPENAI_API_KEY="sk-..."を実行するか、.envファイルに記載してpython-dotenvで読み込みます。
ステップ2:WebSocket接続の確立
Realtime APIはWebSocket上で動作します。以下のコードでSession作成から接続確立まで行います。
import json
import asyncio
import websockets
async def connect_realtime_api():
url = "wss://api.openai.com/v1/realtime?model=gpt-4-realtime-preview"
headers = {
"Authorization": f"Bearer {api_key}",
"OpenAI-Beta": "realtime=v1"
}
async with websockets.connect(url, extra_headers=headers) as ws:
print("✓ WebSocket接続成功")
# ここで音声データを送受信
return ws
# 実行
asyncio.run(connect_realtime_api())
ステップ3:マイク入力から音声ストリーミング処理
PyAudioライブラリを使ってマイクから音声をリアルタイムキャプチャします。
import pyaudio
import base64
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 24000
def stream_audio_from_microphone():
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE,
input=True, frames_per_buffer=CHUNK)
print("🎤 マイク入力を開始します...")
while True:
data = stream.read(CHUNK)
# Base64エンコードしてAPIに送信
encoded = base64.b64encode(data).decode('utf-8')
yield encoded
# 使用例
for audio_chunk in stream_audio_from_microphone():
print(f"送信: {len(audio_chunk)} bytes")
ステップ4:AIエージェントのシステムプロンプト設定
AIの性格や行動を定義するシステムプロンプトが重要です。以下は技術サポートボット用の例。
system_prompt = """
あなたはエンジニア向けの技術サポートアシスタントです。
以下の特性を持ってください:
1. 回答は常に日本語で、正確かつ簡潔に
2. コード例が必要な場合はPythonで提示
3. 不明な点は推測せず、確認を取る
4. 技術的な深さと初心者向けの説明のバランスを取る
5. 回答は80字以内の短い文を心がける
"""
# セッション初期化メッセージ
session_msg = {
"type": "session.update",
"session": {
"modalities": ["text", "audio"],
"instructions": system_prompt,
"voice": "alloy",
"input_audio_format": "pcm16",
"output_audio_format": "pcm16",
"temperature": 0.7
}
}
ステップ5:音声応答の再生と会話ループ
AIからの音声応答をリアルタイムで再生し、継続的な会話を実現します。
import pyaudio
import io
def play_audio_response(audio_data):
"""AIの音声応答を再生"""
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=24000,
output=True)
stream.write(audio_data)
stream.stop_stream()
stream.close()
p.terminate()
async def run_conversation():
"""エンドツーエンドの会話ループ"""
async with websockets.connect(ws_url, extra_headers=headers) as ws:
# セッション初期化
await ws.send(json.dumps(session_msg))
while True:
# マイク入力を送信
audio_chunk = get_microphone_chunk()
await ws.send(json.dumps({
"type": "input_audio_buffer.append",
"audio": audio_chunk
}))
# AIの応答を受信して再生
response = await ws.recv()
data = json.loads(response)
if data.get("type") == "response.audio.delta":
audio = base64.b64decode(data.get("delta", ""))
play_audio_response(audio)
実装パターン別ガイド:ユースケース別のコード実装
パターン1:カスタマーサービスボット(自動応答+オペレータへのエスカレーション)
顧客からの音声問い合わせを自動応答し、複雑な問題は人間のオペレータに自動エスカレーションするシステム。
async def customer_service_agent():
"""カスタマーサービス用AIエージェント"""
system_prompt = """
あなたはECサイトのカスタマーサービスです。
対応範囲:
- 商品の配送状況確認
- 返品・交換の手続き
- 注文履歴の照会
対応不可の場合は以下の合言葉で終了:
「申し訳ございませんが、この問題はオペレータにお繋ぎします」
"""
intent_map = {
"配送状況": "check_shipping_status",
"返品": "initiate_return",
"キャンセル": "cancel_order",
"その他": "escalate_to_human"
}
# 会話実行
response = await get_ai_response(user_input, system_prompt)
# インテント判定
for keyword, intent in intent_map.items():
if keyword in response:
return handle_intent(intent)
return response
パターン2:AI講師(個別学習支援・進捗追跡)
ユーザーの学習進度に応じて難易度を調整し、詳細なフ