# AWS Plugin for LiveKit Agents Complete AWS AI integration for LiveKit Agents, including Bedrock, Polly, Transcribe, and realtime speech-to-speech support for Amazon Nova Sonic **What's included:** - **RealtimeModel** - Amazon Nova 2 Sonic and Nova Sonic 1.0 for speech-to-speech - **LLM** - Powered by Amazon Bedrock, defaults to Nova 2 Lite - **STT** - Powered by Amazon Transcribe - **TTS** - Powered by Amazon Polly See [https://docs.livekit.io/agents/integrations/aws/](https://docs.livekit.io/agents/integrations/aws/) for more information. ## ⚠️ Breaking Change **Default model changed to Nova 2 Sonic**: `RealtimeModel()` now defaults to `amazon.nova-2-sonic-v1:0` with `modalities="mixed"` (was `amazon.nova-sonic-v1:0` with `modalities="audio"`). If you need the previous behavior, explicitly specify Nova Sonic 1.0: ```python model = aws.realtime.RealtimeModel.with_nova_sonic_1() # or model = aws.realtime.RealtimeModel( model="amazon.nova-sonic-v1:0", modalities="audio" ) ``` ## Installation ```bash pip install livekit-plugins-aws # For Nova Sonic realtime models pip install livekit-plugins-aws[realtime] ``` ## Prerequisites ### AWS Credentials You'll need AWS credentials with access to Amazon Bedrock. Set them as environment variables: ```bash export AWS_ACCESS_KEY_ID= export AWS_SECRET_ACCESS_KEY= export AWS_DEFAULT_REGION=us-east-1 # or your preferred region ``` ### Getting Temporary Credentials from SSO (Local Testing) If you use AWS SSO for authentication, get temporary credentials for local testing: ```bash # Login to your SSO profile aws sso login --profile your-profile-name # Export credentials from your SSO session eval $(aws configure export-credentials --profile your-profile-name --format env) # Verify credentials are set aws sts get-caller-identity ``` Alternatively, add this to your shell profile for automatic credential export: ```bash # Add to ~/.bashrc or ~/.zshrc function aws-creds() { eval $(aws configure export-credentials --profile $1 --format env) } # Usage: aws-creds your-profile-name ``` ## Quick Start Example The `realtime_joke_teller.py` example demonstrates both realtime and pipeline modes: ### Demonstrates Both Modes - **Realtime mode**: Nova 2 Sonic for end-to-end speech-to-speech - **Pipeline mode**: Amazon Transcribe + Nova 2 Lite + Amazon Polly ### Demonstrates Nova 2 Sonic Capabilities - **Text prompting**: Agent greets users first using `generate_reply()` - **Multilingual support**: Automatic language detection and response in 7 languages - **Multiple voices**: 18 expressive voices across languages - **Function calling**: Weather lookup, web search, and joke telling ### Setup 1. **Install dependencies:** ```bash pip install livekit-plugins-aws[realtime] \ jokeapi \ duckduckgo-search \ python-weather \ python-dotenv ``` 2. **Copy the example locally:** ```bash curl -O https://raw.githubusercontent.com/livekit/agents/main/examples/voice_agents/realtime_joke_teller.py ``` 3. **Set up environment variables:** ```bash # Create .env file echo "AWS_DEFAULT_REGION=us-east-1" > .env # Add your AWS credentials (see Prerequisites above) ``` 4. **(Optional) Run local LiveKit server:** For testing without LiveKit Cloud, run a local server: ```bash # Install LiveKit server brew install livekit # macOS # or download from https://github.com/livekit/livekit/releases # Run in dev mode livekit-server --dev ``` Add to your `.env` file: ```bash LIVEKIT_URL=wss://127.0.0.1:7880 LIVEKIT_API_KEY=devkey LIVEKIT_API_SECRET=secret ``` See [self-hosting documentation](https://docs.livekit.io/home/self-hosting/local/) for more details. ### Running the Example **Realtime Mode (Nova 2 Sonic)** - Recommended for testing: ```bash python realtime_joke_teller.py console ``` This runs locally using your computer's speakers and microphone. **Use a headset to prevent echo.** **Multilingual Support:** Nova 2 Sonic automatically detects and responds in your language. Just start speaking in your preferred language (English, French, Italian, German, Spanish, Portuguese, or Hindi) and Nova 2 Sonic will respond in the same language! **Pipeline Mode (Transcribe + Nova Lite + Polly)**: ```bash python realtime_joke_teller.py console --mode pipeline ``` **Dev Mode** (connect to LiveKit room for remote testing): ```bash python realtime_joke_teller.py dev # or python realtime_joke_teller.py dev --mode pipeline ``` Try asking: - "What's the weather in Seattle?" - "Tell me a programming joke" - "Search for information about my favorite movie, Short Circuit" ## Features ### Nova 2 Sonic Capabilities Amazon Nova 2 Sonic is a unified speech-to-speech foundation model that delivers: - **Realtime bidirectional streaming** - Low-latency, natural conversations - **Multilingual support** - English, French, Italian, German, Spanish, Portuguese, and Hindi - **Automatic language mirroring** - Responds in the user's spoken language - **Polyglot voices** - Matthew and Tiffany can seamlessly switch between languages within a single conversation, ideal for multilingual applications - **18 expressive voices** - Multiple voices per language with natural prosody - **Function calling** - Built-in tool use and agentic workflows - **Interruption handling** - Graceful handling without losing context - **Noise robustness** - Works in real-world environments - **Text input support** - Programmatic text prompting ### Model Selection ```python from livekit.plugins import aws # Nova 2 Sonic (audio + text input, latest) model = aws.realtime.RealtimeModel.with_nova_sonic_2() # Nova Sonic 1.0 (audio-only, original model) model = aws.realtime.RealtimeModel.with_nova_sonic_1() ``` ### Voice Selection Voices are specified as lowercase strings. Import `SONIC1_VOICES` or `SONIC2_VOICES` type hints for IDE autocomplete. ```python from livekit.plugins.aws.experimental.realtime import SONIC2_VOICES model = aws.realtime.RealtimeModel.with_nova_sonic_2( voice="carolina" # Portuguese, feminine ) ``` #### Nova 2 Sonic Voice IDs (18 voices) See [official documentation](https://docs.aws.amazon.com/nova/latest/nova2-userguide/sonic-language-support.html) for most up-to-date list and IDs. - **English (US)**: `tiffany` (polyglot), `matthew` (polyglot) - **English (UK)**: `amy` - **English (Australia)**: `olivia` - **English (India)**: `kiara`, `arjun` - **French**: `ambre`, `florian` - **Italian**: `beatrice`, `lorenzo` - **German**: `tina`, `lennart` - **Spanish (US)**: `lupe`, `carlos` - **Portuguese (Brazil)**: `carolina`, `leo` - **Hindi**: `kiara`, `arjun` **Note**: Tiffany abd Matthew in Nova 2 Sonic support polyglot mode, seamlessly switching between languages within a single conversation. #### Nova Sonic 1.0 Voice IDs (11 voices) See [official documentation](https://docs.aws.amazon.com/nova/latest/userguide/available-voices.html) for most up-to-date list and IDs. - **English (US)**: `tiffany`, `matthew` - **English (UK)**: `amy` - **French**: `ambre`, `florian` - **Italian**: `beatrice`, `lorenzo` - **German**: `greta`, `lennart` - **Spanish**: `lupe`, `carlos` ### Text Prompting with `generate_reply()` Nova 2 Sonic supports programmatic text input. This can be used to trigger agent responses or to mix speech and text input within a UI in the same conversation: ```python class Assistant(Agent): async def on_enter(self): # Make the agent speak first with a greeting await self.session.generate_reply( instructions="Greet the user and introduce your capabilities" ) ``` #### `instructions` vs `user_input` The `generate_reply()` method accepts two parameters with different behaviors: **`instructions`** - System-level commands (recommended): ```python await session.generate_reply( instructions="Greet the user warmly and ask how you can help" ) ``` - Sent as a system prompt/command to the model - Triggers immediate generation - Does not appear in conversation history as user message - Use for: Agent-initiated speech, prompting specific behaviors **`user_input`** - Simulated user messages: ```python await session.generate_reply( user_input="Hello, I need help with my account" ) ``` - Sent as interactive USER role content - Added to Nova's conversation context - Triggers generation as if user spoke - Use for: Testing, simulating user input, programmatic conversations **When to use each:** - **Agent greetings**: Use `instructions` - agent should speak without user input - **Guided responses**: Use `instructions` - direct the agent's next action - **Simulated conversations**: Use `user_input` - test multi-turn dialogs - **Programmatic user input**: Use `user_input` - inject text as if user spoke ### Turn-Taking Sensitivity Control how quickly the agent responds to pauses: ```python model = aws.realtime.RealtimeModel.with_nova_sonic_2( turn_detection="MEDIUM" # HIGH, MEDIUM (default), LOW ) ``` - **HIGH**: Fastest response time, optimized for latency. May interrupt slower speakers - **MEDIUM**: Balanced approach with moderate response time. Reduces false positives while maintaining responsiveness (recommended) - **LOW**: Slowest response time with maximum patience, better for hesitant speakers ### Complete Example ```python from livekit import agents from livekit.agents import Agent, AgentSession from livekit.plugins import aws from dotenv import load_dotenv load_dotenv() class Assistant(Agent): def __init__(self): super().__init__( instructions="You are a helpful voice assistant powered by Amazon Nova 2 Sonic." ) async def on_enter(self): await self.session.generate_reply( instructions="Greet the user and offer assistance" ) server = agents.AgentServer() @server.rtc_session() async def entrypoint(ctx: agents.JobContext): await ctx.connect() session = AgentSession( llm=aws.realtime.RealtimeModel.with_nova_sonic_2( voice="matthew", turn_detection="MEDIUM", tool_choice="auto" ) ) await session.start(room=ctx.room, agent=Assistant()) if __name__ == "__main__": agents.cli.run_app(server) ``` ## Pipeline Mode (STT + LLM + TTS) For more control over individual components, use pipeline mode: ```python from livekit.agents import inference from livekit.plugins import aws session = AgentSession( stt=aws.STT(), # Amazon Transcribe llm=aws.LLM(), # Nova 2 Lite (default) tts=aws.TTS(), # Amazon Polly vad=inference.VAD(), ) ``` ### Nova 2 Lite Amazon Nova 2 Lite is a fast, cost-effective reasoning model optimized for everyday AI workloads: - **Lightning-fast processing** - Very low latency for real-time conversations - **Cost-effective** - Industry-leading price-performance - **Multimodal inputs** - Text, image, and video ([documentation](https://docs.aws.amazon.com/nova/latest/nova2-userguide/using-multimodal-models.html)) - **1 million token context window** - Handle long conversations and complex context ([source](https://aws.amazon.com/blogs/aws/introducing-amazon-nova-2-lite-a-fast-cost-effective-reasoning-model/)) - **Agentic workflows** - RAG systems, function calling, tool use - **Fine-tuning support** - Customize for your specific use case Ideal for pipeline mode where you need fast, accurate LLM responses in voice applications. ## Resources - [LiveKit Agents Documentation](https://docs.livekit.io/agents/) - [Amazon Nova Documentation](https://docs.aws.amazon.com/nova/latest/nova2-userguide/using-conversational-speech.html) - [Example: realtime_joke_teller.py](https://github.com/livekit/agents/blob/main/examples/voice_agents/realtime_joke_teller.py)