Strands Agent の BidiAgent と OpenAI Realtime API を利用して音声がインターフェイスのエージェントを作ってみた #AWSreInvent

Strands Agent の BidiAgent と OpenAI Realtime API を利用して音声がインターフェイスのエージェントを作ってみた #AWSreInvent

2025.12.04

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

Strands Agent で双方向ストリーミング (BidiAgent) をサポートし、音声会話ができるようになりました。

https://aws.amazon.com/jp/about-aws/whats-new/2025/12/typescript-strands-agents-preview/

今回は、このアップデートをもとに OpenAI 社の Realtime API を利用して、日本語で会話してみたいと思います。

BidiAgent

BidiAgent は双方向ストリーミング用のエージェントです。BidiAgent を利用することで、継続的な音声およびテキストストリーミングを行いつつ、ツールの同時実行を行えます。

普段は、以下のように from strands import Agent と定義すると思うのですが、

from strands import Agent
from strands_tools import calculator

agent = Agent(tools=[calculator])

# Single request-response cycle
result = agent("Calculate 25 * 48")
print(result.message)  # "The result is 1200"

BidiAgent は from strands.experimental.bidi import BidiAgent, BidiAudioIO から引っ張ってきます。

import asyncio
from strands.experimental.bidi import BidiAgent, BidiAudioIO
from strands.experimental.bidi.models import BidiNovaSonicModel

model = BidiNovaSonicModel()
agent = BidiAgent(model=model, tools=[calculator])
audio_io = BidiAudioIO()

async def main():
    # Persistent connection with continuous streaming
    await agent.run(
        inputs=[audio_io.input()],
        outputs=[audio_io.output()]
    )

asyncio.run(main())

現状、BidiAgent で扱える LLM は、次の 3 種類となっています。

  • Amazon Bedrock Nova Sonic
  • OpenAI Realtime API
  • Google Gemini Live

やってみた

BidiAgent について、さらっとおさらいしたところで、実際に日本語で会話してみたいと思います。

SDK のインストール

パッケージマネージャーは uv を利用します。ドキュメントに従い、パッケージのインストールを行います。

uv init
uv add "strands-agents-tools" "strands-agents[bidi,bidi-all,bidi-openai]"

https://strandsagents.com/latest/documentation/docs/user-guide/concepts/experimental/bidirectional-streaming/quickstart/

環境変数の登録

OpenAI の API Key を環境変数経由で登録します。

export OPENAI_API_KEY=your_api_key

コードの実装

BidiAgent を実装します。頑張ればもっと、少ない行数で実装できそうですが、これでも非常に少ない行数で実装できているのは嬉しいですね。

main.py
import asyncio

from strands.experimental.bidi import BidiAgent
from strands.experimental.bidi.io import BidiAudioIO, BidiTextIO
from strands.experimental.bidi.models.openai_realtime import BidiOpenAIRealtimeModel
from strands.experimental.bidi.tools import stop_conversation

from strands_tools import calculator

async def main() -> None:
    model = BidiOpenAIRealtimeModel(
        model_id="gpt-realtime",
        provider_config={
            "audio": {
                "voice": "coral",
            }
        },
    )
    # stop_conversation tool allows user to verbally stop agent execution.
    agent = BidiAgent(
        model=model,
        tools=[calculator, stop_conversation],
        system_prompt="You are a helpful assistant that can use the calculator tool to calculate numbers.",
    )

    audio_io = BidiAudioIO()
    text_io = BidiTextIO()
    await agent.run(inputs=[audio_io.input()], outputs=[audio_io.output(), text_io.output()])

if __name__ == "__main__":
    asyncio.run(main())

provider_config は、以下のドキュメントを見ると良いです。

https://strandsagents.com/latest/documentation/docs/user-guide/concepts/experimental/bidirectional-streaming/models/openai_realtime/

コードを実行してみました。うまく会話できていますね。

現状、PC の出力を入力で拾ってしまうため、イヤホンを使っての検証をオススメしています。

https://youtu.be/KwYzScpi3Hg

まとめ

以上、「Strands Agent の BidiAgent と OpenAI Realtime API を利用して音声がインターフェースのエージェントを作ってみた」でした。

非常に少ない行数で、音声インターフェイスのエージェントができ上がるのは嬉しいですね。

クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

この記事をシェアする

FacebookHatena blogX

関連記事