
Strands Agent の BidiAgent と OpenAI Realtime API を利用して音声がインターフェイスのエージェントを作ってみた #AWSreInvent
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
Strands Agent で双方向ストリーミング (BidiAgent) をサポートし、音声会話ができるようになりました。
今回は、このアップデートをもとに 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]"
環境変数の登録
OpenAI の API Key を環境変数経由で登録します。
export OPENAI_API_KEY=your_api_key
コードの実装
BidiAgent を実装します。頑張ればもっと、少ない行数で実装できそうですが、これでも非常に少ない行数で実装できているのは嬉しいですね。
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 は、以下のドキュメントを見ると良いです。
コードを実行してみました。うまく会話できていますね。
現状、PC の出力を入力で拾ってしまうため、イヤホンを使っての検証をオススメしています。
まとめ
以上、「Strands Agent の BidiAgent と OpenAI Realtime API を利用して音声がインターフェースのエージェントを作ってみた」でした。
非常に少ない行数で、音声インターフェイスのエージェントができ上がるのは嬉しいですね。
クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!








