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.
Installation
Section titled “Installation”Nova Sonic is included in the base bidirectional streaming dependencies for Strands Agents.
To install it, run:
pip install 'strands-agents[bidi]'Or to install all bidirectional streaming providers at once:
pip install 'strands-agents[bidi-all]'After installing strands-agents[bidi], you can import and initialize the Strands Agents’ Nova Sonic provider as follows:
import asyncio
from strands.experimental.bidi import BidiAgentfrom strands.experimental.bidi.io import BidiAudioIO, BidiTextIOfrom strands.experimental.bidi.models import BidiNovaSonicModelfrom strands_tools import stop
from strands_tools import calculator
async def main() -> None: model = BidiNovaSonicModel( model_id="amazon.nova-2-sonic-v1:0", provider_config={ "audio": { "voice": "tiffany", }, }, client_config={"region": "us-east-1"}, # available in us-east-1, us-west-2, eu-north-1, and ap-northeast-1 ) # stop tool allows user to verbally stop agent execution. agent = BidiAgent(model=model, tools=[calculator, stop])
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())Cross-Modal Input
Section titled “Cross-Modal Input”Nova Sonic accepts text input at any point during an active voice session, without interrupting or waiting on the audio stream. Send a BidiTextInputEvent the same way you would outside of a live conversation:
from strands.experimental.bidi.types.events import BidiTextInputEvent
await agent.send(BidiTextInputEvent(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.
Credentials
Section titled “Credentials”Nova Sonic requires AWS credentials for access. Under the hook, BidiNovaSonicModel uses an experimental Bedrock client, which allows for credentials to be configured in the following ways:
Option 1: Environment Variables
export AWS_ACCESS_KEY_ID=your_access_keyexport AWS_SECRET_ACCESS_KEY=your_secret_keyexport AWS_SESSION_TOKEN=your_session_token # If using temporary credentialsexport AWS_REGION=your_region_nameOption 2: Boto3 Session
import boto3from strands.experimental.bidi.models import BidiNovaSonicModel
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 = BidiNovaSonicModel(client_config={"boto_session": boto_session})For more details on this approach, please refer to the boto3 session docs.
Configuration
Section titled “Configuration”Client Configs
Section titled “Client Configs”| Parameter | Description | Default |
|---|---|---|
boto_session | A boto3.Session instance under which AWS credentials are configured. | None |
region | Region under which credentials are configured. Cannot use if providing boto_session. | us-east-1 |
Provider Configs
Section titled “Provider Configs”| Parameter | Description | Example | Options |
|---|---|---|---|
audio | AudioConfig instance. | {"voice": "tiffany", "output_rate": 24000} | reference; see supported voices for valid voice values |
inference | Session start inferenceConfiguration’s (as snake_case). | {"top_p": 0.9, "max_tokens": 2048, "temperature": 0.7} | reference |
turn_detection | Turn detection sensitivity. Nova Sonic v2 only; raises ValueError on v1. | {"endpointingSensitivity": "MEDIUM"} | HIGH, MEDIUM, LOW |
Troubleshooting
Section titled “Troubleshooting”Module Not Found
Section titled “Module Not Found”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]'.
Hanging
Section titled “Hanging”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.