Gemini Multimodal Live API, Daily.co, Pipecatを使ったAI音声会話アプリ作成方法
はじめに
近頃、生成AI技術によってコーディングアシスタント、AI検索ツール、AI文章作成支援など、多種多様なAIアプリケーションが世に出てきています。これらのツールに共通する特徴として、多くがキーボード入力やマウス操作を前提としている点が挙げられます。しかし、人間のコミュニケーションにおいて最も自然な形態は「会話」です。AIがこの領域で真価を発揮するには、人間とリアルタイムでスムーズに対話できることが求められます。
この課題に応えられるポテンシャルを持っているのが、Gemini の Multimodal Live APIです。このAPIは、リアルタイムでのマルチモーダルな対話を実現する可能性を秘めています。しかし、そのポテンシャルを最大限に引き出すためには、非同期処理や双方向ストリーミング(WebSocket)といった、専門性の高い技術知識が不可欠です。そこで注目したいのが、Daily.coおよびPipecatといった開発支援ツールです。これらは、Multimodal Live API利用時の非同期処理やWebSocket処理を抽象化し、開発者がより本質的な機能実装に注力できるよう設計されています。
本記事では、これらのツールを活用し、Multimodal Live APIを用いたシンプルなAI音声会話アプリケーションの作成事例をご紹介します。GitHubにコードも公開しており、READMEに実行手順も記載していますので是非ご参考にしてください。
作成したアプリ:音声会話によるブログ作成支援AI
アプリの動作イメージは以下の通りです。
動画のように、あたかもAIとビデオ会議しているような体験を得られます。今回は1対1でAIと会話するようなアプリにしましたが、複数人の会話をAIに聞かせたり、複数AIを参加させたりと他にも色々な応用方法が考えられると思います。さらに、今回はDaily.coがデフォルトで用意しているビデオ会議のようなUI(Daily Prebuilt UI)にとどめましたが、この通話画面をスマホアプリやWebアプリに埋め込むことも可能なので、より幅広いユーザー体験を目指せると思います。
アーキテクチャ
アーキテクチャは以下のようになっています。
ポイントは、ユーザーとAIがDaily.coサーバーに接続するような形をとることでリアルタイムな音声/ビデオ処理周りをDaily.coに任せているところです。このあたりを自前で作り切るのはなかなか骨が折れるのではないかと思います。AI側はPipecatを使うことで、音声の送信やアニメーションのアクションなど様々な処理を非同期かつリアルタイムに動作させることが可能です。
技術スタック
Multimodal Live API
Multimodal Live APIは、OpenAIのRealtime APIのGemini版です。特徴は、極めて低いレイテンシーと、AIの発話への割り込みを可能にするリアルタイムな応答性で、人間との自然な会話体験を実現します。しかし、WebSocketによる双方向ストリーミング通信の確立や、各種処理(AI発話・アニメーション制御・割り込み検知など)の非同期化が求められるため、利用には高度な技術が必要です。特に非同期処理は同期処理に慣れた開発者にとっては、大きなパラダイムシフトを伴うため、導入のハードルが高いと思います。
Multimodal Live APIの公式ドキュメントはこちらですが、こちらのSDKをそのまま使うのは私にはハードルが高いように感じます。
WebSocketについてはこちらの記事が参考になります。
Daily.coおよびPipecat
Daily.coは、カスタマイズ自在なビデオ会議を構築できるサービスです。Pipecatは、Daily.coのAPIを活用し、AIをビデオ会議に組み込むといった柔軟なプログラミングを可能にするPythonのフレームワークです。これらのツールを組み合わせることで、Multimodal Live APIが求める双方向ストリーミングや非同期処理を、より手軽に実現できます。
また、Pipecatの公式GitHubには多くの実装例が掲載されており、その一つである以下のSimple Chatbotには今回実装したDaily.coのデフォルトのビデオ会議画面であるDaily Prebuiltの他に、JavaScript、React、Android、iOSでの実装例も掲載されています。もちろん、GPT-4oモデルでの実装例もあります。
Pipecatによる非同期プログラミングのポイント
PipecatにはPipeline, FrameProcessor, Frameといった概念があり、これらをうまく設計することがプログラミングするうえでのポイントとなると思いました。
Pipelineは非同期処理の全体の流れを定義するようなもので、FrameProcessorはPipelineの中に定義された処理一つ一つを指します。Frameとは、Pipeline全体の変数のようなもので、FrameProcessorが受け取ったり出力したりします。FrameProcessorはPipecat側で事前に定義されたものが豊富にありますので、大抵はそれを使うだけで事足りると思いますが、自作したり継承したりすることでさらに柔軟な処理を実現することも可能です。
全体的な処理のイメージとしては、上から順番に実行されているというよりも常にPipelineの中に何かしらのFrameが流れていて各FrameProcessorが該当するFrameをキャッチしたら何かしらの処理をするといったイメージが近いです。
おわりに
音声会話AIの革新的なユーザー体験は、一度体験すれば明らかです。しかし、そのようなアプリがなかなか普及しない背景には、技術的な難易度の高さという無視できない要因があると思っています。
近年、Daily.coおよびPipecatといったツールが登場し、Multimodal Live APIを活用したアプリ開発のハードルは下がってきています。しかし、非同期処理については、抽象化されたとはいえ、従来の同期処理とは異なる概念理解や設計思想が求められます。
今後、この分野の情報がさらに充実することで、AIとの自然な会話を実現する画期的なアプリケーションが、より多く生まれることを期待しています。
Discussion