Skip to content

Bedrock Nova Sonic

Amazon Nova Sonic provides real-time, conversational interactions through bidirectional audio streaming. Amazon Nova Sonic processes and responds to real-time speech as it occurs, enabling natural, human-like conversational experiences. Key capabilities and features include:

  • Adaptive speech response that dynamically adjusts delivery based on the prosody of the input speech.
  • Graceful handling of user interruptions without dropping conversational context.
  • Function calling and agentic workflow support for building complex AI applications.
  • Robustness to background noise for real-world deployment scenarios.
  • Multilingual support with expressive voices and speaking styles. Expressive voices are offered, including both masculine-sounding and feminine sounding, in seven languages: English (US, UK, AU, IN), French, Italian, German, Spanish (US), Portuguese (BR), and Hindi.
  • Recognition of varied speaking styles across all supported languages.

Bedrock Nova Sonic is configured as an optional dependency in Strands Agents.

To install it, run:

Terminal window
pip install 'strands-agents[bidi,bidi-io,bidi-pyaudio]'

Or to install all bidirectional streaming providers at once:

Terminal window
pip install 'strands-agents[bidi-all,bidi-pyaudio]'

After installing the Bedrock Nova Sonic and local audio extras, create a voice agent:

import asyncio
from strands.experimental.bidi.agent import BidiAgent
from strands.experimental.bidi.io import BidiAudioIO
from strands.experimental.bidi.models import BedrockNovaSonicModel
from strands_tools import calculator, stop
async def main() -> None:
model = BedrockNovaSonicModel(
model_id="amazon.nova-2-sonic-v1:0",
region="us-east-1",
voice="tiffany",
)
agent = BidiAgent(model=model, tools=[calculator, stop])
audio_io = BidiAudioIO()
await agent.run(inputs=[audio_io.input()], outputs=[audio_io.output()])
if __name__ == "__main__":
asyncio.run(main())

Nova Sonic accepts text input at any point during an active voice session, without interrupting or waiting on the audio stream. Send a text content block the same way you would outside of a live conversation:

await agent.send({"text": "What's the weather in Seattle?"})

Text and audio input can be interleaved freely. Sending text does not require pausing the microphone or waiting for the model to finish speaking.

Nova Sonic requires AWS credentials for access. Under the hook, BedrockNovaSonicModel uses an experimental Bedrock client, which allows for credentials to be configured in the following ways:

Option 1: Environment Variables

Terminal window
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
export AWS_SESSION_TOKEN=your_session_token # If using temporary credentials
export AWS_REGION=your_region_name

Option 2: Boto3 Session

import boto3
from strands.experimental.bidi.models import BedrockNovaSonicModel
boto_session = boto3.Session(
aws_access_key_id="your_access_key",
aws_secret_access_key="your_secret_key",
aws_session_token="your_session_token", # If using temporary credentials
region_name="your_region_name",
profile_name="your_profile" # Optional: Use a specific profile
)
model = BedrockNovaSonicModel(boto_session=boto_session)

For more details on this approach, please refer to the boto3 session docs.

ParameterDescriptionDefault
boto_sessionA boto3.Session instance under which AWS credentials are configured.None
regionRegion under which credentials are configured. Cannot use if providing boto_session.us-east-1
ParameterDescriptionExampleOptions
model_idNova Sonic model identifier."amazon.nova-2-sonic-v1:0"Nova Sonic model IDs
audioInput and output stream options.{"output": {"sample_rate": 24000}}reference
voiceOutput voice identifier. Defaults to "matthew"."tiffany"Nova Sonic voices
paramsProvider-specific session parameters, such as inference and turn detection configuration.{"inferenceConfiguration": {"temperature": 0.7}}sessionStart fields
connectionReconnect timing overrides.{"auto_reconnect": false}reference

If you encounter the error ModuleNotFoundError: No module named 'aws_sdk_bedrock_runtime', this means the experimental Bedrock runtime dependency hasn’t been properly installed in your environment. To fix this, run pip install 'strands-agents[bidi]'.

When credentials are misconfigured, the model provider does not throw an exception (a quirk of the underlying experimental Bedrock client). As a result, the provider allows the user to proceed forward with a call to receive, which emits no events and thus presents an indefinite hanging behavior.

As a reminder, Nova Sonic is only available in us-east-1, us-west-2, eu-north-1, and ap-northeast-1.