---
title: "音声のリアルタイム翻訳を実装する｜gpt-realtime-translateの落とし穴と本番構成"
excerpt: "speech-to-speech翻訳専用モデルでWebSocket実装を行い、翻訳音声・字幕・会話ログの保存まで確認しました。通常のRealtime APIとはイベント名もライフサイクルも異なり、Betaヘッダーがエラーの原因になります。$0.034/分のコスト感と、WebRTC + client secret方式への移行方針までまとめています。"
author: "AI活編集部"
author_username: ai-katsu-editorial
published_at: 2026-05-08T00:00:00+00:00
verified_at: 2026-05-08T00:00:00+00:00
models: ["OpenAI API", "Claude Code"]
tasks: ["音声・翻訳・文字起こし", "ツール検証"]
canonical_url: https://ai-katsu.jp/articles/openai-gpt-realtime-translate-api
---
# 音声のリアルタイム翻訳を実装する｜gpt-realtime-translateの落とし穴と本番構成

音声のリアルタイム翻訳は、これまで**STT（文字起こし）→ 翻訳 → TTS（音声合成）**を自前で組み合わせて実現していました。各段階の遅延が積み上がるため、レイテンシが課題になります。

この検証では、音声翻訳専用モデル `gpt-realtime-translate` を使い、**speech-to-speechの翻訳アプリを実装して疎通まで確認**しました。**従量課金は $0.034/分**です。

## この検証の概要

| 項目 | 内容 |
| --- | --- |
| 検証日 | 2026年5月8日 |
| 対象 | OpenAI Realtime API（`gpt-realtime-translate`）／2026年5月7日GA |
| 検証内容 | speech-to-speechリアルタイム翻訳のWebSocket実装、言語切替、字幕/会話ログ保存 |
| 技術スタック | Next.js 16 + React 19 + Zustand / Custom Server / AudioWorklet |
| 結果 | **実API接続・マイク入力・翻訳音声/字幕・会話ログ保存まで確認済み** |
| コスト | **$0.034/分**（30分連続利用で約$1.02） |
| 判定 | **条件付きで導入可**（★4/5） |

## 結論：通常のRealtime APIとは別物として扱う

この検証で最も重要な学びです。

**Realtime Translationは、通常のRealtime APIとイベント名・ライフサイクルが違います。**通常のRealtime APIの知識だけで実装すると、誤った実装になります。

実際、初期実装は「WebSocket接続もボタン操作もマイク入力も動くが、**出力言語を変えてもスペイン語が返る**」という状態でした。

| 項目 | Realtime Translation |
| --- | --- |
| 接続先 | `/v1/realtime/translations?model=gpt-realtime-translate` |
| **Betaヘッダー** | **GA APIなので `OpenAI-Beta: realtime=v1` を付けるとエラー** |
| 出力言語の指定 | `session.audio.output.language` |
| 音声入力イベント | `session.input_audio_buffer.append` |
| 出力イベント | `session.output_audio.delta` / `session.output_transcript.delta` |
| 入力書き起こし | デフォルト無効。`gpt-realtime-whisper` の設定が必要 |
| `response.create` | **使わない**（モデルは「通訳」として動く） |

**会話応答をしないという点が、通常のRealtime APIとの根本的な違いです。**連続ストリームを受け取り、翻訳して返し続けるだけの動作になります。

## Betaヘッダーが原因だった

「出力言語が反映されない」問題の原因はこれでした。

**`OpenAI-Beta: realtime=v1` を付けたことで、GA Translation APIがベータRealtime APIとして扱われ、`session.audio` がunknown parameterになっていました。**

| エラー | 原因 | 対処 |
| --- | --- | --- |
| `Translation sessions are only available on the GA API.` | Betaヘッダーを付けている | Translation endpointではBetaヘッダーを外す |
| `Unknown parameter: 'session.audio'.` | ベータ互換モードで処理されている | Betaヘッダー削除、endpoint確認 |

**「以前のバージョンで必要だったヘッダーが、GA後は逆にエラーの原因になる」**——APIの世代が変わるときによくある落とし穴です。

## 「スペイン語が返る」の正しい確認方法

デバッグ時の観測知見として、これは押さえておく価値があります。

```
session.created ... audio.output.language: "es"
session.updated ... audio.output.language: "en"
```

**`session.created` の時点では初期値として `"es"` が返りますが、直後の `session.updated` でUI選択値に変わります。**

つまり**「最初にcreatedでSpanishが見える」こと自体は問題ではありません。**確認すべきは `session.updated` の言語です。

**最初のログだけを見て原因を判断すると、正常な挙動をバグとして追いかけることになります。**

## 会話ログが残らない問題

もう1つの実装上の落とし穴です。

**会話ログが `*.done` イベント依存だったため、ライブ表示には出るがログに残らないケースがありました。**

対処は、**`*.done` だけでなく、停止/close時にlive transcriptをflushする設計**にすることです。

**ストリーミング処理では「完了イベントが必ず来るとは限らない」前提で保存設計を組む必要があります。**

## アーキテクチャ：なぜサーバproxyを挟むのか

```
ブラウザ/PC
  ↕ WebSocket
Next.js custom server / Node.js
  ↕ WebSocket
OpenAI Realtime Translation API
```

理由は明確です。**ブラウザのWebSocketは任意のAuthorizationヘッダを付けられないため、サーバ側proxyを使う**必要があります。APIキーをブラウザに出さずに済みます。

この構成は**仕組みの理解とデバッグには向いています。**サーバログで `session.created` / `session.updated` / `error` を追えます。

ただし公開運用では課題があります。**自前サーバがクライアント接続とOpenAI接続の両方を長時間保持するため、WebSocketを保持できる実行環境が必要**になります。

## 公開時のホスティング選定

| 候補 | 判定 | 理由 |
| --- | --- | --- |
| **Render Web Service** | **有力** | WebSocket対応。Node.js構成をそのまま載せやすい |
| **Google Cloud Run** | **有力** | WebSocket対応。Docker化しやすい（timeoutと再接続設計は必要） |
| Railway | 次点 | WebSocket対応。接続時間制限を前提に設計する |
| VPS / Fly.io / EC2 | 可能 | 常駐プロセスを持てるため相性はよい |
| **Serverless Functions** | **不向き** | **WebSocket常時接続を保持できない**（Streaming/SSEとWebSocketは別物） |
| 共用レンタルサーバ | 不向き | 常駐Node.jsプロセス・リバースプロキシ管理が難しい |

**Serverless FunctionsでWebSocketは保持できません。**StreamingやSSEに対応していることと、WebSocketを保持できることは別問題です。

使う場合は**フロントエンドだけをServerless環境に、Realtime中継は常駐可能な環境に分ける**構成になります。

## 本番構成はWebRTC + client secret

スマホ/ブラウザ向けの本番では、構成を変えるのが自然という判断です。

```
スマホ/ブラウザ
  ↕ WebRTC
OpenAI Realtime API

自前バックエンド
  → 短命client secretを発行するHTTP endpointのみ
```

**自前バックエンドが長時間WebSocketを中継しなくなる**のが最大の利点です。サーバはAPIキーを保持し、短命のclient secretを渡すだけになります。

| メリット | 注意点 |
| --- | --- |
| モバイルブラウザの音声通信に向いている | WebRTC実装へ作り替える必要がある |
| 自前サーバの接続数/帯域負荷を抑えられる | セッション発行APIに認証・レート制限が必要 |
| Serverless環境でも実装しやすい | モバイルのマイク許可・自動再生制限の検証が必要 |
| レイテンシ面でも有利になりやすい | 翻訳ログの保存設計が別途必要 |

## コスト感

$0.034/分を1ドル150円で換算すると**約5.1円/分**です。

| 利用量 | API原価の目安 | 用途イメージ |
| --- | --- | --- |
| 10分/日 × 20営業日 | 約1,020円/月/人 | 旅行・軽い接客補助 |
| 60分/日 × 20営業日 | 約6,120円/月/人 | 社内会議・営業同行レベル |
| 4時間/日 × 20営業日 | 約24,480円/月/人 | 通訳端末/SaaSの法人価格帯と比較対象 |
| 8時間/日 × 20営業日 | 約48,960円/月/人 | 常時通訳用途 |

**使用時間によって、既存サービスとの損得が逆転します。**「APIのほうが安い」と一括りにはできません。

開発コストの見積もりも整理しています。

| 構成 | 初期開発 | 月額運用 |
| --- | --- | --- |
| 個人用PWA / 社内PoC | 数日〜2週間 | API費用 + 数千円のホスティング |
| 社内向けスマホWebアプリ | 2〜6週間 | API費用 + 認証/ログ基盤 |
| アプリストア配布 | 1〜3か月 | API費用 + 保守 |
| 法人向けSaaS | 3〜6か月以上 | API費用 + 管理画面/監査/サポート |

## 対応言語の制約

-   **入力は70以上の言語を自動検出**
-   **出力は13言語に限定**（Spanish, Portuguese, French, Japanese, Russian, Chinese, German, Korean, Hindi, Indonesian, Vietnamese, Italian, English）

この検証では初期実装のUIに非対応言語（Arabic, Turkish等）が含まれており、**UIは公式対応の13言語に絞る**という修正を行っています。

**選べるのに動かない選択肢をUIに残すと、原因の切り分けが難しくなります。**

## 実運用で必要になる設計項目

PoCから本番へ進むために必要な項目です。

-   HTTPS/WSS対応、APIキーのサーバ側管理、ユーザー認証
-   **セッション単位の時間制限、利用量/課金ログ**
-   切断時の再接続、ping/pong keepalive
-   **会話ログの保存/削除ポリシー**
-   **個人情報/機密情報を扱う場合の同意導線**
-   モバイルブラウザのバックグラウンド/画面ロック時の挙動確認

特にプライバシー面は重要です。**会議・通話・配信で利用する場合は、参加者に翻訳処理と外部API送信を明示する必要があります。**字幕/会話ログに個人情報が含まれる可能性もあります。

**医療・法律・金融など高リスク領域では、人間レビューや免責設計が必要です。**

## よくある質問

### 従来のSTT→翻訳→TTS構成と何が違いますか？

**3つのAPIを組み合わせる必要がなく、各段階の遅延が積み上がりません。**実装量が減り、低レイテンシなライブ翻訳体験を短時間で試せます。一方でカスタムプロンプトやvoice選択といった細かい制御は限定的です。

### 出力言語が反映されません

**まず `OpenAI-Beta: realtime=v1` を付けていないか確認してください。**GA APIのため、これを付けるとベータ互換モードで処理され `session.audio` が無効になります。また `session.created` ではなく `session.updated` の言語を見てください。

### Serverless環境にデプロイできますか？

**WebSocket proxy構成では不向きです。**Serverless FunctionsはWebSocketの常時接続を保持できません。RenderやCloud Runなど常駐可能な環境か、WebRTC + client secret方式への移行が必要です。

### コストはどのくらいですか？

**$0.034/分（1ドル150円換算で約5.1円/分）です。**1日1時間・月20営業日で約6,120円/人という計算になります。使用時間によって既存サービスとの損得が変わります。

## まとめ

-   **Realtime Translationは通常のRealtime APIと別物。**イベント名・ライフサイクルが異なり、通常APIの知識だけでは誤実装しやすい
-   **GA APIのため `OpenAI-Beta: realtime=v1` はエラーの原因になる**
-   出力言語の確認は `session.created` ではなく**`session.updated`** を見る
-   会話ログは**`*.done` 依存にせず、停止/close時にflushする**
-   **ブラウザのWebSocketはAuthorizationヘッダを付けられない**ためサーバproxyが必要。ただしServerless環境では保持できない
-   本番は**WebRTC + client secret方式**に寄せると、サーバが長時間接続を持たずに済む
-   **$0.034/分。**使用時間によって既存サービスとの損得が逆転する
-   入力70言語超・**出力は13言語に限定**

新しいAPIは、既存のAPIと似て見えても仕様が違うことがあります。公式のリファレンスでイベント名とライフサイクルを確認してから実装すると、原因不明の挙動に時間を取られずに済みます。

株式会社AI棒では、こうしたAI活用の検証を日々行い、企業の音声AI導入を支援しています。ご相談は[お問い合わせフォーム](/contact)から、継続的な伴走支援については[AI参謀](/ai-sanbo)をご覧ください。
