1.はじめに
OpenAIとAzure OpenAIのRealtime APIには、2025年1月11日(土)現在、gpt-4o-audio系とgpt-4o-realtime系の2種類があります。これらはREST API、WebRTC、WebSocketの異なるインターフェースをサポートしており、やや複雑な構成となっています。
各APIは異なるサポート条件とコスト体系を持っており、全ての機能が全てのインターフェースで利用できるわけではありません。
本記事では、現時点でのRealtime APIの状況を詳しく調査し、企業内でのセキュリティを考慮したAzure OpenAI Realtime APIの活用方針をまとめます。OpenAIの先行事例から学ぶことで、効率的な開発の道筋を示すことを目指します。
2.目的
まず、プログラミング言語の特性(JavascriptとPythonが動作するプラットフォーム)や最終的なゴールを考慮して、実装方法の違いを正しく理解する必要があります。
参考として、Microsoftの「AI - Azure AI services Blog」の「VoiceRAG: An App Pattern for RAG + Voice Using Azure AI Search and the GPT-4o Realtime API for Audio」ページに分かりやすい説明がありますので、紹介します。
重要なポイントを以下に列挙します:
①UX(ユーザー体験)
UXが最も重要な要素です。サービス提供の形態を検討した結果、ソフトウェアの配布管理の観点からWebサービスとして提供するのが理想的です。
②最終目標
Realtime APIの主な用途は、音声による問い合わせ対応や議事録作成業務です。単なる会話相手を作ることが目的ではありません。そのため、RAG(Retrieval Augmented Generation)やFunction callを通じた社内リソースへのアクセスについても考慮が必要です。
この事からUXとRAG・Function callなどは分離して考える必要があります。
このことは「VoiceRAG: An App Pattern for RAG + Voice Using Azure AI Search and the GPT-4o Realtime API for Audio」にも記載があり、こちらの記事ではFrontendとBackendとAzure AIに分離したアーキテクチャが良いと言っています。
Frontendではマイクやスピーカーを利用し、BackendでRetrieval やFunction call、Azure AIではLLMの提供といったイメージです。
私も全く同感です。
実際の開発ではPythonやJavascriptを使用することになりますが、動作するプラットフォームが異なりますので、この点は考慮しておく必要があります。
No | ブラウザで動作 | アプリケーションとして動作 | 備考 | |
---|---|---|---|---|
1 | Python | △ | ○ | Pythonもブラウザで動作しますが、ブラウザのマイクやスピーカーとの連携部分には疑問があります。 |
2 | JavaScript | ○ | ○ | Javascriptはブラウザでもアプリケーションとしても動作しますが、RAGなどのコードはPythonの方が使い勝手が良さそうです。 |
以上のことから、FrontendはJavascript、BackendはPythonが良さそうです。
3.gpt-4o-realtime-preview
OpenAIとAzure OpenAIが提供するRealtimeおよびAudio関連のモデルは、機能と価格の面で重要な違いがあります。
まず、OpenAIのAudioモデル(gpt-4o-audio-previewシリーズ)は、128,000トークンまでの入力と16,384トークンまでの出力を処理できます。このモデルはREST APIのみをサポートしており、2024年12月の価格改定により、入力は1Mトークンあたり$40、出力は$80となっています。
OpenAIのRealtimeモデルには、標準版(gpt-4o-realtime-preview)とmini版の2種類があります。両者とも入力上限は128,000トークン、出力上限は4,096トークンです。これらのモデルはWebRTCとWebSocketの両方をサポートしている点が特徴です。価格面では、標準版が入力1Mトークンあたり$40(出力$80)、より手頃なmini版が入力$10(出力$20)となっています。
一方、Azure OpenAIは現在Realtimeモデル(gpt-4o-realtime-preview)のみを提供しています。このモデルも同様に128,000トークンの入力上限と4,096トークンの出力上限を持ちますが、**接続方式はWebSocketに限定されています。**料金体系はOpenAIより高めで、入力が1Mトークンあたり$100、出力が$200に設定されています。
総じて、OpenAIの方がAzure OpenAIと比較して、より柔軟な接続オプションと競争力のある価格設定を提供していると言えます。特に、mini版の提供により、コスト効率を重視するユースケースにも対応できる選択肢を用意しています。
No | Vendor | Classification | OpenAI | Input(tokens) | Input Cost(1M) | Output(tokens) | Output Cost(1M) | RestAPI | WebRTC | Web Socket |
---|---|---|---|---|---|---|---|---|---|---|
1 | OpenAI | audio | gpt-4o-audio-preview(*1) ┗gpt-4o-audio-preview-2024-12-17 |
128,000 | $40(*2) | 16,384 | $80 | ○ | ー | ー |
2 | gpt-4o-audio-preview-2024-12-17 | ↓ | ↓ | ↓ | ↓ | ↓ | ー | ー | ||
3 | gpt-4o-audio-preview-2024-10-01 | ↓ | $100 | ↓ | $200 | ↓ | ー | ー | ||
4 | realtime | gpt-4o-realtime-preview(*3) ┗gpt-4o-realtime-preview-2024-12-17 |
128,000 | $40 | 4,096 | $80 | ー | ○ | ○ | |
5 | gpt-4o-realtime-preview-2024-12-17 | ↓ | ↓ | ↓ | ↓ | ー | ↓ | ↓ | ||
6 | gpt-4o-realtime-preview-2024-10-01 | ↓ | $100 | ↓ | $200 | ー | ↓ | ↓ | ||
7 | gpt-4o-mini-realtime-preview ┗gpt-4o-mini-realtime-preview-2024-12-17 |
↓ | $10 | ↓ | $20 | ー | ↓ | ↓ | ||
8 | gpt-4o-mini-realtime-preview-2024-12-17 | ↓ | ↓ | ↓ | ↓ | ー | ↓ | ↓ | ||
9 | Azure OpenAI | realtime | gpt-4o-realtime-preview(*4) ┗gpt-4o-realtime-preview-2024-10-01 |
128,000 | $100(*5) | 4,096 | $200 | ー | ー | ○ |
※2025年1月11日(土)時点でのモデル、コスト、サポートインターフェース
(*1) GPT-4o Audio(OpenAI)
(*2) 料金(OpenAI)
(*3) Introducing the Realtime API(OpenAI)
(*4) GPT-4o Realtime API for speech and audio(Preview) (Azure OpenAI)
GPT-4o-Realtime-Preview(Azure OpenAI)
(*5) Azure OpenAI Serviceの価格(Azure OpenAI)
4.aoai-realtime-audio-sdkとは
Realtime APIを理解するうえで最もシンプルなサンプルコードで学習したくなります。しかし、2章で述べた言語の特性がある関係で、サンプルコードを動かして理解するだけでは最終的なゴールに到達できないことが分かりました。
aoai-realtime-audio-sdkは、Azure OpenAIのリアルタイム音声機能を実装する.NET、Java、JavaScript、Python向けSDKです。音声入力のストリーミング処理、テキスト生成、音声合成を一連のフローとして実現し、低レイテンシーでのリアルタイム音声処理を特徴としています。このSDKは、Microsoftが2024年10月1日(火)に公開したAzure OpenAI ServiceのGPT-4 Realtime APIを活用するためのサンプルコードとライブラリ群です。リアルタイムの音声入出力に対応しており、カスタマーサポート、音声アシスタント、リアルタイム翻訳などに最適です。MITライセンスで提供されています。
実際にSDK内のPython用のサンプルと、Javascriptのサンプルを動かしてみましたが、Python用のサンプルは音が途切れる問題が発生します。
このSDK内部のコードは動作を理解する目的やInstruction(Systemプロンプト)の指定によりどのような動きをするのかを検証するために使用した方が良さそうです。
※AOAI: Microsoft社内でAzure OpenAIを略す際に一般的に使用される略称
4.1. aoai-realtime-audio-sdkの構造
aoai-realtime-audio-sdkには.NET、javascript、PythonのサンプルプログラムとSDKが含まれます。
SDKではPython用のrtclient-0.5.1とJavascript用のrt-client-0.5.0の2種類が提供されています。
どちらもリポジトリにはないため、ダウンロード手順が提供されています。
4.2. Python、Javascriptを分離したコード
aoai-realtime-audio-sdkには複数のサンプルが入っているため、PythonとJavascriptのサンプルコードを分離して、それぞれの動きを理解するためのサンプルリポジトリを作成しました。
実際に動かしてみるとJavascript版の方が音途切れなどが無く安定して動作することが分かりました。
※詳細は「PythonでAzure OpenAI Realtime APIを試す」記事を参照
※Javascriptの記事はありません。githubに手順などをまとめています。
動作内容はYouTubeの動画を参照してください。
5.Azure-Samples/aisearch-openai-rag-audio
「VoiceRAG: An App Pattern for RAG + Voice Using Azure AI Search and the GPT-4o Realtime API for Audio」で紹介されているサンプルコードです。RAG部分はPythonコードで、Azure AIサービスで動作します。
UXはJavascriptでできているため、ブラウザでの音声入出力、Websocket通信には最適です。このサンプルも、まだWebRTCには対応していないようです。
今後、動かしてみて記事にまとめたいと思います。
6.課題
No | 課題 | 説明 | 備考 |
---|---|---|---|
1 | エコーキャンセル問題 | PythonでAudioを扱うにはpyaudioライブラリを使用しますが、pyaudioがエコーキャンセルに対応していません。 エコーキャンセルができるマイク&スピーカーをコンピュータに接続するか、Edgeブラウザなどエコーキャンセル機能を使用する必要があります。 |
|
2 | 黙っていられない問題 | OpenAIの「OpenAI o1 and new tools for developers」の「More control over responses」に記載がある、「Controlled response timing」機能の実装が必要です。2024-10-01のモデルは無音となるとAI側から呼びかける仕様とのことです。 | Instructionで縛れるかは実験してみますが、OpenAI 12 Daysでわざわざ「Controlled response timing」機能を発表したくらいなのでたぶんAzure OpenAIで2024-12-17のモデルがサポートされるまで対応待ちになりそうです |
3 | 話者識別できない問題 | 実験では識別できていそうですが、少し怪しいので追加検証が必要です。 | |
4 | 業務固有知識問題 | 入力トークン数は128,000tokenあるので、毎回業務固有情報を渡せば実現できそうですが、API利用料のコストも跳ね上がるため、もう少し効率良い方法を考える必要がありそうです。 | |
5 | 音が途切れる | OpenAIのgpt-4o-realtime-preview-2024-12-17、gpt-4o-mini-realtime-preview-2024-12-17からサポートされたWebRTかブラウザのJavascriptからweb socketで接続しないと安定しないようです。 | |
6 | セッション長の問題 | 2024-10-01のモデルは最大15分、2024-12-17のモデルでも最大30分までのため、セッションを30分単位で区切る必要があります。 | |
7 | 会話履歴の学習 | セッション中の会話記録を記録するには記録場所としてDBなどの外部媒体が必要と思われます。 |
7.参考URL