PaPoo
cover
technews
Author
technews
世界の技術ニュースをリアルタイムでキャッチし、日本語でわかりやすく発信。AI・半導体・スタートアップから規制動向まで、グローバルテックシーンの「今」をお届けします。

OpenAIはどうやって“遅れない音声AI”を大規模に動かしているのか

記事のキーポイント

音声AIは「速さ」が命

OpenAIの記事のテーマは、かなりシンプルです。
音声AIは、人間の会話と同じスピードで返ってこないと不自然になる、という話です。

たしかにこれはその通りで、ちょっと返事が遅れただけでも、会話って一気にぎこちなくなります。
「え、今しゃべっていいのかな?」と迷うあの空気、あれです。

OpenAIが重視しているのは次の3つです。

ここでいう「揺れ」は jitter のことで、音声パケットが届くタイミングがバラつく現象です。
これが大きいと、音声が途切れたり、相手の話にかぶせる「barge-in」が変になったりします。
barge-in は、相手が話している途中でユーザーが割り込むように話すこと。音声UIではかなり大事です。

image_0001.svg

個人的には、音声AIの勝負は「賢さ」だけじゃなくて、​反射神経のよさだと思っています。
賢くてもワンテンポ遅いと、途端に“機械っぽい”からです。

まずWebRTCを使う理由

OpenAIは、リアルタイム音声の基盤として WebRTC を使っています。
WebRTCは、ブラウザやスマホ、サーバー間で音声や映像を低遅延でやり取りするための標準技術です。

難しそうに見えますが、ざっくり言うと:

という感じです。

WebRTCのいいところは、これらの面倒な部分を標準化してくれることです。
もしこれがなければ、ブラウザごと、モバイルごと、サーバーごとに接続方法を個別実装する羽目になります。
それは正直、地獄です。

image_0002.svg

OpenAIの記事では、WebRTCの土台作りに貢献してきたJustin Uberti氏やSean DuBois氏の名前も出てきます。
こういう「標準技術の上に積み上げる」話は、派手ではないけれど本当に重要です。AIの話なのに、実はかなり地味で、でも地味だからこそ効く。

問題は「WebRTCをどう大規模運用するか」

ここからが本題です。

OpenAIはWebRTCを使うことにしたものの、​そのままでは大規模運用しづらかったわけです。
特にKubernetesとの相性が問題になりました。

Kubernetesは、コンテナを増やしたり減らしたり、別のサーバーへ動かしたりするのが得意です。
でもWebRTCの典型的な運用は、​1セッションごとに大きなUDPポート範囲を公開する形になりがちで、これがKubernetesだと扱いにくい。

理由は主に2つです。

1. ポートが多すぎる

セッションごとにUDPポートを大量に開けると、ロードバランサーやファイアウォールの設定が大変になります。
セキュリティ監査もしづらくなるし、管理対象が一気に増えます。

image_0003.svg

2. セッションの“持ち主”を守らないといけない

WebRTCのICEやDTLSは状態を持つプロトコルです。
つまり、「この接続はこのプロセスが面倒を見る」と決めたら、その後も同じプロセスが追いかけ続ける必要があります。

途中で別プロセスにパケットが飛ぶと、接続の確立に失敗したり、音声が壊れたりします。
この“状態の引っ越しの難しさ”が、かなり厄介です。

いろいろ比較した結果、OpenAIが選んだのは「relay + transceiver」

OpenAIは複数の方式を比較したうえで、最終的に relay + transceiver という構成を採用しました。

relay

transceiver

つまり、
​「どこに送るか」はrelayが決める
​「WebRTCとしての責任」はtransceiverが持つ
という分担です。

image_0004.svg

この分け方、個人的にはかなりうまいと思います。
全部を1つに詰め込むと運用が苦しくなるし、かといって全部を分割しすぎると会話の遅延が増える。
その中間をきれいに取っている感じがあります。

どうやって最初のパケットの行き先を決めるのか

ここが記事の面白いところです。

OpenAIは、​ICE username fragment(ufrag)​ を使ってルーティングしています。
ufragは、WebRTCの接続確立で使う短い識別子です。

普通なら「このセッションのパケットは誰宛て?」を、外部の検索システムや追加の照会で調べたくなります。
でもそれだと遅い。

そこでOpenAIは、​プロトコルの中に最初からある情報をルーティングに使うわけです。
しかも、WebRTCのセッション設定時に、サーバー側がその情報をうまく仕込んでおく。

流れをかなりざっくり言うと:

image_0005.svg

  1. クライアントが接続を始める
  2. signalingでtransceiverがセッションを作る
  3. クライアントには、共通のrelay先が返される
  4. 最初のパケットがrelayに届く
  5. relayがufragを見て、どのtransceiver宛てかを判断する
  6. 正しいtransceiverに転送する

これなら、​最初の1発目から迷子になりにくい
リアルタイム音声では、この「最初の接続が速い」ことが地味に効きます。
ユーザーは最初の数百ミリ秒の違いを、ちゃんと“待たされた感”として感じるからです。

何がうれしいのか

この構成のメリットはかなりはっきりしています。

publicなUDPポートを小さくできる

クライアントから見える入口を絞れるので、セキュリティや運用が楽になります。

transceiverが状態管理を一手に持てる

ICEやDTLSの責任が分散しないので、挙動を追いやすいです。
これはトラブル対応のときに本当に大きいと思います。

Kubernetesで扱いやすい

Podの増減や再配置があっても、relayでさばけるので柔軟性が上がります。

image_0007.png

ユーザー体験が良くなる

音声AIは、多少賢いだけではダメで、​会話のテンポが重要です。
そのテンポを支えるインフラをちゃんと作っているのが、この話の核心です。

ただし、ただ楽になるわけではない

もちろん、いいことばかりではありません。
OpenAI自身も、relayを挟むことで転送ホップが1つ増えることは認めています。

つまり、ただ単に「中継を入れたら速くなった」という話ではなく、
運用のしやすさと低遅延のバランスをかなり真剣に詰めた結果なんだと思います。

ここはすごく現実的です。
理想だけなら直結がいちばん速い。でも現実の大規模システムでは、それがいちばん運用しづらい。
だから「ちょっとだけ中継する」ほうが、全体としてはうまくいくことがある。こういう判断は、いかにも大規模インフラの仕事だなと思います。

この記事から見えるOpenAIの狙い

このブログ記事は単なる技術自慢ではなく、OpenAIがVoice AIを“実用品”として成立させるための土台作りをかなり本気でやっていることを示しています。

image_0008.png

特に印象的なのは、
「モデルがすごい」だけではなく、
音声が会話として成立するための通信設計まで深く手を入れている点です。

AI業界って、ついモデルの性能ばかり注目されがちですが、実際のユーザー体験は通信や遅延で大きく変わります。
音声AIはその最たる例で、1秒の遅れは1秒のストレスになります。
だからこそ、こういうインフラ記事はかなり価値があると思います。

まとめ

OpenAIは、ChatGPT VoiceやRealtime APIのために、WebRTC基盤を大規模運用向けに再設計しました。
ポイントは、​WebRTCセッションの管理を担う transceiver と、​パケットをさばく relay を分けたこと。
さらに、ICEの ufrag を使って最初のパケットから行き先を決めることで、低遅延と大規模性の両立を狙っています。

要するに、これは
​「音声AIを、ちゃんと会話っぽく動かすためのインフラの工夫」​
の話です。

派手さはないけれど、めちゃくちゃ重要。
こういう下支えがあるからこそ、音声AIは“デモ”ではなく“使える機能”になるのだと思います。


参考: How OpenAI delivers low-latency voice AI at scale

同じ著者の記事