Gemini 2.0 Flash Live API (試験運用版)を使ってAIと日本語で会話してみた
AWS事業本部コンサルティング部の石川です。12/11にGoogle Gemini 2.0 という新しいモデルがリリースされました。現在、Gemini 2.0 Flashの試験運用版が、Google AI StudioおよびVertex AIのGemini APIを通じて開発者向けに提供されています。
単に精度が上がっただけではなく、かなり色々なことができるモデルのようだな、と思っていたところ Philipp Schmid さんがサンプルコードを上げてるじゃないですかぁー
ということで、検証の旅に行ってきました。
Gemini 2.0 とは
Gemini 2.0は、Googleが2024年12月11日に発表した次世代AIモデルです。現在、Gemini 2.0 Flashの試験運用版のみですが、2025年1月には一般提供を開始し、モデルサイズも拡大する予定です。
高速性能
Gemini 2.0 Flashは、Gemini 1.5 Proの2倍の速度で動作しながら、より高いパフォーマンスを達成しています。
マルチモーダル機能の強化
入力は、画像、動画、音声などのマルチモーダル入力に対応しました。出力はテキストを含む生成画像や、多言語対応のテキスト読み上げなど、マルチモーダル出力も可能です。
ツール連携
Google検索、コード実行、サードパーティのユーザー定義関数などのツールをネイティブに呼び出すことができます。
エージェント機能
より高度な推論や複雑なタスク処理が可能になり、「エージェント時代」に向けたAIモデルとして設計されています。
サンプルコード
解説
Philipp Schmid さんが、google-gemini / cookbookからインスピレーションを受けてシンプルしたコードらしいです。
start()
start メソッドは WebSocket 接続を初期化し、3つの非同期タスク(capture_audio()、stream_audio()、play_response())を開始します。処理の流れは以下になります。
capture_audio() >> stream_audio() >> (Gemini AI) >> play_response()
capture_audio()
音声キャプチャするメソッドです。マイクからの音声入力を継続的にキャプチャし、Base64エンコードしてWebSocketを通じてGemini AIに送信します。
stream_audio()
音声ストリーミングするメソッドです。Gemini AIからの応答を受信し、音声データをデコードして再生キューに追加します。
play_response()
応答再生するメソッドです。キューから音声データを取得し、スピーカーを通じて再生します。
Philipp Schmid さんのサンプルコード
GEMINI_API_KEYの入手方法
GEMINI_API_KEYを入手するには、以下の手順に従います:
Google AI Studioにアクセス
Google AI Studio にアクセスし、Googleアカウントでログインします。
APIキーの作成
ログイン後、APIキーを作成します。「Get API Key」→「APIキーを作成」→「新しいプロジェクトでAPIキーを作成」の順にクリックします。
利用規約の確認
利用規約が表示されたら、内容を確認して「OK」をクリックします。
APIキーの取得
APIキーが生成されたら、必ずコピーして安全な場所に保存してください[5][6]。一度画面を閉じると再表示できないため、再発行が必要になります。
実行環境
OSはWindows 11、Python 3.13.1でプログラムを実行しました。実は、MacBook(M1Max / macOS sonoma)、Python 3.11.10では、音切れが生じたため、Windowsパソコンで再検証しています。
パッケージのインストール
以下の2つのパッケージをインストールしました。
- pyaudio
- websockets
pip install pyaudio websockets
実行例:
PS C:\playground\live_test> python --version
Python 3.13.1
PS C:\playground\live_test> pip install pyaudio websockets
Defaulting to user installation because normal site-packages is not writeable
Collecting pyaudio
Downloading PyAudio-0.2.14-cp313-cp313-win_amd64.whl.metadata (2.7 kB)
Collecting websockets
Downloading websockets-14.1-cp313-cp313-win_amd64.whl.metadata (6.9 kB)
Downloading PyAudio-0.2.14-cp313-cp313-win_amd64.whl (173 kB)
Downloading websockets-14.1-cp313-cp313-win_amd64.whl (163 kB)
Installing collected packages: pyaudio, websockets
Successfully installed pyaudio-0.2.14 websockets-14.1
AIとの会話
Gemini 2.0 Flash Live API (試験運用版)は、本来は英語のみをサポートです。2024/12/12に検証したときは、日本語はサポートしていないと断られたのですが、本日2024/12/14時点では、「日本語話せます」と言われたので、検証も日本語で実施しました。
プログラムを実行して、以下の会話をしました。チャンクサイズが「1」の割には遅延もなく、スムーズに会話できました。入力(人間が話した音声)と出力(AIが生成した音声)が双方向(全2重)なので、例えば、AIが話している最中に人間が「やっぱり難しいからいいや」など話を遮ると、スムーズに会話を次の会話に切り替えてくれました。自然な対話が可能で驚きました。
AI: こんにちは
人間: こんにちは
AI: 何かを手伝えできることはありますか
人間: じゃあattention is all you need っていう論文について教えてもらえます
AI: はいもちろんです。attention is all you need という論文ですね。この論文ではトランスフォーマーというシーニューラルネットワークのアーキテクチャが提案され、自然言語処理の分野に大きな
人間: やっぱり難しいからいいや
AI: わかりました。何か他にご興味のあることはありますか
人間: ジミヘンドリックスって知ってます
AI: はい知っています。伝説的なギタリストですよね。彼の音楽について何か知りたいことがありますか
人間: 彼のようにギターが上手になりたいんですけどどうしたらいいです
AI: 練習と情熱が大切です。まずは基礎をしっかり身につけ、好きな曲をたくさん練習することが重要でしょう
人間: ありがとうございます。
AI: また何かあればお声掛けください
人間: 何かダジャレ言ってもらえます
AI: はい承知しました。では布団が吹っ飛んだってどうでしょう
人間: じゃあダジャレはもういいです
AI: 他に話題はありますか
人間: ボケとツッコミみたいなのしてもらえます
AI: 言ってみましょう。例えばパンはパンでも食べられないパンはなんだに対してフライパンと答えてみます。どうでしょうか
人間: それちょっと違うね
AI: そうでしたか失礼しました。どのようにすればボケとツッコミになるでしょうか
人間: いやいいです
AI: どっちしました
一方、AIが話している最中に人間が「もういいです」などと、話を遮るとプログラムが例外になり中断してしまうことが繰り返されました。
プログラムの異常終了の主な原因は、WebSocket接続が予期せずに閉じられたことです。エラーメッセージによると、WebSocketサーバーから1011(内部エラー)というステータスコードを受信しました。サーバー側で予期しない問題が発生したことを表します。エラーメッセージには "Could not read from recitation stream server" という記述があり、音声ストリーミングサーバーからデータを読み取れなかった考えられます。
プログラムの実行とスタックトレースです。
PS C:\playground\live_test> & C:/Users/ishik/AppData/Local/Microsoft/WindowsApps/python3.13.exe c:/playground/live_test/live_test_20241212.py
Connected to Gemini, You can start talking now
End of turn
End of turn
End of turn
+ Exception Group Traceback (most recent call last):
| File "c:\playground\live_test\live_test_20241212.py", line 96, in <module>
| asyncio.run(client.start())
| ~~~~~~~~~~~^^^^^^^^^^^^^^^^
| File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.13_3.13.496.0_x64__qbz5n2kfra8p0\Lib\asyncio\runners.py", line 194, in run
| return runner.run(main)
| ~~~~~~~~~~^^^^^^
| File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.13_3.13.496.0_x64__qbz5n2kfra8p0\Lib\asyncio\runners.py", line 118, in run
| return self._loop.run_until_complete(task)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
| File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.13_3.13.496.0_x64__qbz5n2kfra8p0\Lib\asyncio\base_events.py", line 720, in run_until_complete
| return future.result()
| ~~~~~~~~~~~~~^^
| File "c:\playground\live_test\live_test_20241212.py", line 31, in start
| async with asyncio.TaskGroup() as tg:
| ~~~~~~~~~~~~~~~~~^^
| File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.13_3.13.496.0_x64__qbz5n2kfra8p0\Lib\asyncio\taskgroups.py", line 71, in __aexit__
| return await self._aexit(et, exc)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.13_3.13.496.0_x64__qbz5n2kfra8p0\Lib\asyncio\taskgroups.py", line 173, in _aexit
| raise BaseExceptionGroup(
| ...<2 lines>...
| ) from None
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "c:\playground\live_test\live_test_20241212.py", line 64, in stream_audio
| async for msg in self.ws:
| ...<17 lines>...
| self.audio_queue.get_nowait()
| File "C:\Users\ishik\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\websockets\asyncio\connection.py", line 242, in __aiter__
| yield await self.recv()
| ^^^^^^^^^^^^^^^^^
| File "C:\Users\ishik\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\websockets\asyncio\connection.py", line 313, in recv
| raise self.protocol.close_exc from self.recv_exc
| websockets.exceptions.ConnectionClosedError: received 1011 (internal error) Request trace id: 1528df1206d203fd, [ORIGINAL ERROR] generic::unavailable: Could not read from recitation stream server. Fa; then sent 1011 (internal error) Request trace id: 1528df1206d203fd, [ORIGINAL ERROR] generic::unavailable: Could not read from recitation stream server. Fa
+------------------------------------
PS C:\playground\live_test>
最後に
Gemini 2.0 Flash Live APIの試験運用版は、高速性能とマルチモーダル機能の強化、ツール連携、エージェント機能など、多岐にわたる革新的な特徴を備えた次世代AIモデルであることがわかりました。一方、現段階では開発者向けの試験運用版であり、サンプルコードの実行時にエラーが発生するなど、まだ完全には安定していない様子が見受けられます。今後の一般提供に向けて、これらの課題が解決され、より安定した性能と使いやすさが実現されることが期待されます。
Gemini 2.0の本格的な展開により、AIの応用範囲がさらに拡大し、より高度で複雑なタスクの処理が可能になるでしょう。特にGemini 2.0 Flash は、コストが低くパフォーマンスが高いので、現状の課題がクリアできると、圧倒的なアドバンテージになると考えられます。