Esta publicación fue escrita en coautoría con Neevash Ramdial, líder de marketing técnico de Stream.
Crear agentes de voz con calidad de producción que se sientan naturales y receptivos es un desafío de ingeniería complejo. Debe orquestar modelos de voz a voz, administrar la transmisión de audio de baja latencia y manejar el ciclo de vida de la conexión. También debe ofrecer experiencias consistentes en aplicaciones web, móviles y de escritorio.
En esta publicación, aprenderá cómo combinar el marco de código abierto Vision Agents de Stream con Amazon Bedrock y Amazon Nova 2 Sonic para crear agentes de voz en tiempo real que pueden estar listos para producción en minutos. Aprenderá cómo funciona la integración internamente, recorrerá ejemplos de código y explorará capacidades avanzadas como llamadas de funciones, reconexión automática y soporte de voz multilingüe.
El desafío
La creación de aplicaciones de IA habilitadas por voz requiere orquestar múltiples sistemas complejos que deben funcionar juntos de manera confiable. Usted enfrenta el desafío de administrar la infraestructura de transmisión de audio en tiempo real y al mismo tiempo integrar reconocimiento de voz, modelos de lenguaje y servicios de texto a voz. Cada uno de ellos tiene sus propias características de latencia y modos de falla. Una interacción de voz típica implica capturar audio del micrófono del usuario, transmitirlo a un servicio de voz a texto, procesar la transcripción a través de un modelo de lenguaje, generar una respuesta, convertir esa respuesta nuevamente en voz y entregársela al usuario. Todo esto debe suceder en un lapso de unos pocos cientos de milisegundos para que parezca natural. Los retrasos en este proceso pueden interrumpir el flujo de conversación y frustrar a los usuarios. Más allá del proceso central de IA, las aplicaciones de voz de producción deben manejar las realidades confusas de la implementación del mundo real: conexiones de red poco confiables, problemas de compatibilidad del navegador, tiempos de espera de sesión y degradación gradual cuando los servicios dejan de estar disponibles. A menudo se dedica más tiempo a crear lógica de reconexión, administrar conexiones WebRTC y manejar casos extremos que a las capacidades reales de IA. Esta carga de infraestructura significa que los equipos invierten meses en crear soluciones personalizadas o se conforman con productos limitados que no satisfacen sus necesidades específicas. Vision Agents abstrae la complejidad de la infraestructura y al mismo tiempo proporciona la flexibilidad para personalizar la experiencia de IA.
Descripción general de la solución
La solución reúne tres componentes clave:
Amazon Nova 2 Sonic, un modelo básico de voz a voz disponible a través de Amazon Bedrock que proporciona transmisión de audio bidireccional en tiempo real, detección de giro nativa y capacidades de llamada de funciones. Nova 2 Sonic maneja todo el proceso de voz a voz, aceptando entradas de audio y produciendo salida de audio. Esto evita la necesidad de servicios STT y TTS separados. Vision Agents de Stream, un marco Python de código abierto para crear agentes de inteligencia artificial de voz y video en tiempo real. Proporciona una arquitectura basada en complementos con más de 25 integraciones, herramientas de implementación de producción y SDK de cliente para React, iOS, Android, Flutter y React Native. El sistema está diseñado teniendo en cuenta la flexibilidad. Puede utilizar la red perimetral global de Stream para obtener un rendimiento eficiente o integrar su proveedor de comunicación en tiempo real (RTC) preferido. Vision Agents maneja especificaciones específicas del proveedor a través de una interfaz limpia basada en decoradores, lo que permite casos de uso como agentes de atención al cliente, automatización del flujo de trabajo y acciones impulsadas por API con un código repetitivo mínimo. Con Vision Agents, puede crear aplicaciones de inteligencia artificial utilizando un marco de código abierto, proveedores de modelos externos y servicios de telefonía. Stream's Edge Network es una red perimetral distribuida globalmente que normalmente ofrece tiempos de conexión inferiores a 500 ms y una latencia de audio inferior a 30 ms, lo que proporciona la capa de transporte en tiempo real entre los clientes y el backend de su agente.
Juntos, estos componentes crean una pila completa: Stream maneja el transporte de medios en tiempo real y la experiencia del lado del cliente, Amazon Nova 2 Sonic proporciona la inteligencia artificial y Vision Agents proporciona el código que los une.
Descripción general de la arquitectura
El sistema está diseñado en torno a una clara separación de preocupaciones: la infraestructura de Stream maneja el transporte de medios en tiempo real y la conectividad del cliente, mientras que Amazon Nova Sonic se ejecuta en la propia cuenta de AWS del cliente y proporciona inteligencia de IA. Esta separación ayuda a mantener los datos confidenciales y la lógica empresarial bajo el control del cliente, mientras que la red perimetral distribuida globalmente de Stream ofrece la experiencia multimedia de baja latencia que esperan los usuarios. La red perimetral de Stream actúa como intermediario de medios entre los dispositivos del usuario final y los procesos de trabajo del Agente de Vision. Cuando un usuario habla, el audio se captura, cifra y transmite como RTP a través de UDP a la Stream SFU (Unidad de reenvío selectivo) más cercana. La SFU finaliza la conexión WebRTC, maneja el recorrido NAT y la estimación del ancho de banda, y reenvía pistas de audio al trabajador de Vision Agent como si fuera otro participante de la llamada. Esto significa que el agente se integra naturalmente en el modelo de llamada. El agente es otro par, que recibe y envía audio a través de la misma infraestructura utilizada por los participantes humanos.
Los datos de audio fluyen bidireccionalmente a través del sistema: el trabajador de Vision Agent decodifica la voz entrante del usuario a PCM sin procesar, la transmite a Amazon Nova Sonic a través de la API en tiempo real de Bedrock, y los fotogramas de audio de respuesta de Nova Sonic se recodifican, se empaquetan como RTP y se devuelven a través de la SFU al dispositivo cliente. La latencia de un extremo a otro suele ser inferior a 500 milisegundos. La detección de actividad de voz (VAD) se ejecuta en el trabajador para detectar límites de voz y eventos de irrupción, mientras que la cancelación de eco en el navegador ayuda a evitar que la propia salida del agente vuelva a activar el bucle VAD.
Límites de la cuenta
Cuenta de AWS del cliente Lógica empresarial y orquestación (políticas de agentes, herramientas, acceso a datos). Integración de Amazon Bedrock para acceder a los modelos de Amazon Nova. Transmita el plano de medios Global WebRTC/SFU de la cuenta de AWS, TURN/STUN y señalización. Tiempo de ejecución de Vision Agent (procesos de trabajo) que finaliza WebRTC como pares de robots y une la integración de Amazon Bedrock del cliente.
Flujo de medios de extremo a extremo
El usuario se une desde la web o el móvil. La aplicación incorpora el SDK del cliente de audio de Stream, solicita un micrófono (y opcionalmente una cámara) y se une a un tipo de llamada configurado para la participación de IA. Los medios se envían como RTP a través de UDP para una baja latencia predecible y una entrega sin cabecera de línea. 2. Terminación de SFU regional Terminación de SFU regional Un nodo Stream SFU en la región más cercana termina la conexión WebRTC del usuario, manejando la estimación del ancho de banda, la transmisión simultánea y el recorrido NAT. La SFU reenvía las pistas de audio relevantes al trabajador del Agente de Visión como si fuera un participante más. Trabajador de Vision Agent Un proceso de trabajo de Vision Agent dedicado mantiene el estado de PeerConnection para esa sesión. Decodifica audio a PCM sin formato y el trabajador transmite fotogramas PCM al servicio Amazon Bedrock y los reenvía a Amazon Nova 2 Sonic como una sesión en tiempo real en la cuenta de AWS del cliente. Integración de Amazon Nova 2 Sonic con agentes de Vision a través de Amazon Bedrock Amazon Nova 2 Sonic detecta límites de voz y realiza modelado de voz a voz (comprensión, razonamiento y TTS) con llamadas de herramientas opcionales a los sistemas del cliente (RDS, API, bases de conocimiento). Maneja con elegancia las irrupciones y mantiene un contexto conversacional completo para que la conversación siga siendo natural y coherente. Transmisión de respuesta al usuario A medida que Amazon Nova Sonic produce fotogramas de audio de respuesta, el trabajador de Vision Agent: Los corta y envuelve en RTP con marcas de tiempo que aumentan monótonamente para evitar espacios o desviaciones. Envía paquetes RTP a través de la misma sesión WebRTC a través de SFU. La pila WebRTC del navegador decodifica y reproduce audio con una latencia inferior a 500 ms. Intrusiones, transcripciones y datos secundarios La cancelación de eco en el navegador ayuda a evitar que la propia salida del agente vuelva a activar el VAD. Cuando el usuario interrumpe, una nueva voz activa una señal de interrupción a través de un RTCDataChannel, lo que hace que el trabajador deje de reenviar la salida de Amazon Nova Sonic y restablezca su búfer local.
Esta arquitectura puede parecer compleja, pero Vision Agents abstrae gran parte de esta complejidad. Veamos cómo se ve el código real:
Requisitos previos
Antes de comenzar, asegúrese de tener lo siguiente:
Credenciales de AWS configuradas a través de variables de entorno, función de IAM o perfil de interfaz de línea de comandos de AWS (AWS CLI). Para entornos de producción, utilice funciones de IAM adjuntas a sus recursos informáticos en lugar de credenciales a largo plazo. Para el desarrollo local, utilice perfiles de AWS CLI (aws configure) o AWS SSO. No envíe archivos .env que contengan credenciales al control de versiones. Cuenta de transmisión con una clave y un secreto de Audio API (se espera que reciba 333 000 minutos de participante por mes sin costo adicional). Python 3.12 o posterior instalado. Administrador de paquetes uv instalado (pip install uv). Agentes de visión instalados (uv agregar agentes de visión)
Empezando
Paso 1: cree un nuevo directorio de proyecto e instale Vision Agents con el complemento de AWS
mkdir voice-agent cd voice-agentuv inituv agregar "vision-agents[getstream,aws]" python-dotenv
El complemento vision-agents[aws] instala el complemento Amazon Bedrock junto con sus dependencias, incluidos boto3, aws-sdk-bedrock-runtime y Silero VAD para la detección de actividad de voz.
Paso 2: configurar las variables de entorno
Cree un archivo ".env" en la raíz de su proyecto para administrar su configuración. Para las credenciales de AWS, recomendamos señalar su AWS_PROFILE en este archivo para que la aplicación pueda acceder a sus credenciales al interactuar con los recursos de AWS. No recomendamos almacenar sus claves de acceso de AWS directamente en este archivo.
Para las credenciales de Stream API, puede utilizar una biblioteca de terceros como HashiCorp Vault o AWS Secrets Manager, pero las consideraciones de seguridad no están dentro del alcance de esta publicación.
# Credenciales de API de transmisión STREAM_API_KEY=test/geststream/api_key STREAM_API_SECRET=test/getstream/api_secret # Credenciales de AWS AWS_PROFILE=your_aws_profile_name AWS_REGION=us-east-1
Vision Agents descubre automáticamente estas variables de entorno al inicio, por lo que no es necesario pasarlas explícitamente a cada cliente.
Paso 3: cree su primer agente de voz
Cree un archivo main.py con el siguiente código:
importar asyncio desde dotenv importar load_dotenv desde vision_agents.core importar Agente, Usuario, Corredor desde vision_agents.core.agents importar AgentLauncher desde vision_agents.plugins importar aws, getstream load_dotenv() async def create_agent(**kwargs) -> Agente: agente = Agente( edge=getstream.Edge(), agente_usuario=Usuario(nombre="Asistente útil", id="agent"), instrucciones="Eres un asistente de voz útil. Sea conciso y amigable.", llm=aws.Realtime( model="amazon.nova-2-sonic-v1:0", region_name="us-east-1", voice_id="matthew", ), ) return agent async def join_call(agent: Agent, call_type: str, call_id: str, **kwargs) -> Ninguno: call = await agent.create_call(call_type, call_id) async con agent.join(call): await asyncio.sleep(2) await agent.llm.simple_response( text="Saluda cordialmente al usuario y pregúntale cómo puedes ayudar." ) await agent.finish() # Ejecuta hasta que finalice la llamada if __name__ == "__main__": Runner(AgentLauncher(create_agent=create_agent, join_call=join_call)).cli()
Paso 4: ejecuta el agente de voz
Ejecute el agente:
uv ejecutar main.py ejecutar
En menos de 30 líneas de código, tiene un agente de voz en tiempo real completamente funcional con tecnología de Amazon Nova Sonic, al que se puede acceder desde un SDK del cliente Stream.
Comprender la integración de Amazon Bedrock
Echemos un vistazo más de cerca a cómo funciona internamente el complemento aws.Realtime.
Transmisión bidireccional con Amazon Nova 2 Sonic
Amazon Nova 2 Sonic utiliza una API de transmisión bidireccional basada en eventos. En lugar de utilizar un patrón de solicitud-respuesta, este enfoque permite que el audio casi continuo fluya en ambas direcciones simultáneamente. El complemento Vision Agents AWS gestiona esta complejidad a través de una secuencia de eventos estructurada:
Inicialización de sesión: se envía un evento sessionStart con configuración de inferencia (temperatura, tokens máximos, top-p). Configuración rápida: un evento de inicio rápido configura el formato de salida de audio (PCM de 24 kHz), la selección de voz y las definiciones de herramientas. Instrucciones del sistema: las instrucciones del sistema se envían como un bloque de contenido de texto con la función SISTEMA. Transmisión de audio: los fotogramas de audio del micrófono (~32 ms cada uno) se transmiten como eventos de entrada de audio. Transmisión de respuesta: Nova Sonic transmite eventos de salida de audio con el habla generada. Desmontaje de sesión: los eventos PromptEnd y SessionEnd cierran limpiamente la conexión.
Cada bloque de contenido sigue un patrón de tres partes: contentStart → content payload → contentEnd. Esta estructura jerárquica permite que el modelo mantenga el contexto adecuado durante toda la interacción.
Así es como se ve el evento de inicio de sesión en el complemento:
def _create_session_start_event(self) -> Dict[str, Any]: return { "event": { "sessionStart": { "inferenceConfiguration": { "maxTokens": 1024, "topP": 0.9, "temperature": 0.7, } }, "turnDetectionConfiguration": { "endpointingSensitivity": "MEDIUM" }, } }
Agregar llamadas a funciones
Una de las capacidades clave de Amazon Nova 2 Sonic es la llamada a funciones nativas durante conversaciones en tiempo real. Esto permite que su agente de voz realice acciones como consultar bases de datos, llamar a API y activar flujos de trabajo mientras mantiene una conversación hablada natural. Utilice el decorador @llm.register_function para definir funciones que el modelo puede llamar:
importar asyncio desde dotenv importar load_dotenv desde escribir importar Dict, Cualquiera desde vision_agents.core importar Agente, Usuario, Corredor desde vision_agents.core.agents importar AgentLauncher desde vision_agents.plugins importar aws, getstream load_dotenv() async def create_agent(**kwargs) -> Agente: agente = Agente( edge=getstream.Edge(), agent_user=User(name="Weather Assistant", id="agent"), instrucciones="""Usted es un útil asistente meteorológico. Cuando los usuarios pregunten sobre el clima, use la función get_weather para obtener las condiciones actuales. También puede ayudar con cálculos simples.""", llm=aws.Realtime( model="amazon.nova-2-sonic-v1:0", region_name="us-east-1", ), ) @agent.llm.register_function( name="get_weather", descripción="Obtener el clima actual para una ciudad determinada" ) async def get_weather(ubicación: str) -> Dict[str, Any]: # En producción, llame a una API de clima real return { "ciudad": ubicación, "temperatura": 72, "condición": "Soleado", "humedad": "45%" } @agent.llm.register_function( nombre="calcular", descripción="Realizar un cálculo matemático" ) def calcular(operación: str, a: float, b: float) -> dict: operaciones = { "agregar": lambda x, y: x + y, "restar": lambda x, y: x – y, "multiplicar": lambda x, y: x * y, "dividir": lambda x, y: x / y si y != 0 más Ninguno, } resultado = operaciones.get(operación, lambda x, y: Ninguno)(a, b) return {"operación": operación, "a": a, "b": b, "resultado": resultado} devolver agente async def join_call(agente: Agente, call_type: str, call_id: str, **kwargs) -> Ninguno: esperar agente.create_user() llamada = esperar agente.create_call(call_type, call_id) async con agente.join(llamar): esperar asyncio.sleep(2) esperar agent.llm.simple_response( text="Saluda al usuario y hazle saber que puedes consultar el clima." ) await agent.finish() if __name__ == "__main__": Runner(AgentLauncher(create_agent=create_agent, join_call=join_call)).cli()
Cómo funcionan las llamadas a funciones con Amazon Nova 2 Sonic
Cuando el modelo decide invocar una función, ocurre la siguiente secuencia:
Nova 2 Sonic emite un evento toolUse que contiene el nombre de la función y los argumentos. El complemento Vision Agents intercepta este evento, deserializa los argumentos y ejecuta la función Python registrada. El resultado se envía de vuelta a Nova a través de un evento toolResult, envuelto en el patrón estándar contentStart → toolResult → contentEnd. Nova 2 Sonic incorpora el resultado de la función en su respuesta y continúa la conversación hablada de forma natural.
Puede crear flujos de trabajo complejos de varios pasos con este enfoque. Por ejemplo, un agente de voz podría buscar el registro de un cliente, comprobar el inventario y realizar un pedido, todo ello dentro de una única conversación natural.
Usando el LLM estándar con Amazon Bedrock
Más allá de la conversión de voz a voz en tiempo real, el complemento de AWS también proporciona una integración LLM estándar a través de aws.LLM. Esto es útil para arquitecturas de canalización personalizadas en las que desea emparejar un modelo de Amazon Bedrock con proveedores STT y TTS independientes:
de vision_agents.core importar Agente, Usuario de vision_agents.plugins importar aws, getstream, cartesia, deepgram, smart_turn agente = Agente( edge=getstream.Edge(), agente_usuario=Usuario(nombre="Agente de canalización personalizado"), instrucciones="Sea útil y conciso.", llm=aws.LLM( model="anthropic.claude-3-haiku-20240307-v1:0", region_name="us-east-1" ), tts=cartesia.TTS(), stt=deepgram.STT(), turn_detection=smart_turn.TurnDetection( buffer_duration=2.0, trust_threshold=0.5 ), )
El LLM estándar admite la transmisión de respuestas a través de converse_stream(), gestión completa del historial de conversaciones, entradas de visión para modelos como Claude y llamadas de herramientas de múltiples rondas con hasta 3 rondas de ejecución de funciones por solicitud.
Conversión de texto a voz con Amazon Polly
Para arquitecturas de canalización personalizadas, el complemento de AWS también incluye una integración de Amazon Polly TTS. Esto es útil cuando utiliza un LLM que no es en tiempo real (como Claude en Amazon Bedrock u otro proveedor) y necesita síntesis de voz de alta calidad:
desde vision_agents.plugins importe aws tts = aws.TTS( region_name="us-east-1", voice_id="Joanna", motor="neural", # 'estándar' o 'neural' language_code="en-US" )
Amazon Polly TTS admite motores estándar y neuronales, entrada SSML para un control de voz detallado y múltiples idiomas y voces. El motor neuronal produce un habla con un sonido más natural, lo que lo convierte en una buena opción cuando se crea una canalización STT → LLM → TTS personalizada en la infraestructura de AWS.
Limpiar recursos
Para eliminar la llamada Stream y finalizar la ejecución de los procesos de Vision Agent:
uv ejecutar main.py detener
Importante: Se aplican cargos de Amazon Bedrock para todas las llamadas API a Amazon Nova 2 Sonic. Puede ejecutar el comando de limpieza para finalizar sesiones y evitar cargos continuos. Las sesiones activas pueden seguir generando costos hasta que se finalicen explícitamente.
Casos de uso
Una vez establecida la base técnica, vale la pena explorar dónde estas capacidades se traducen en un impacto significativo en el mundo real. La combinación de voz de baja latencia, gestión de conversaciones e integración de herramientas abre una amplia gama de aplicaciones en todas las industrias donde la interacción hablada natural puede reemplazar o mejorar las interfaces tradicionales.
Caso de uso 1: interfaces de voz para entornos sin pantalla y con poca atención
Vision Agents combinado con Amazon Nova 2 Sonic es muy adecuado para entornos donde los usuarios no pueden interactuar de manera confiable con una pantalla, como conducción, servicio de campo, logística, atención médica u operaciones en el sitio. En estos contextos, la voz se convierte en la interfaz principal, no en una característica de conveniencia.
Con Amazon Nova 2 Sonic, obtiene interacciones de voz a voz en tiempo real con baja latencia y turnos naturales, lo que permite a los usuarios hablar libremente, interrumpir respuestas y corregirse sin interrumpir el flujo. Vision Agents gestiona el estado de la conversación y la lógica de las tareas en cada turno, traduciendo la entrada hablada en acciones estructuradas como recuperar la siguiente asignación de trabajo, actualizar el estado de la tarea, registrar notas o solicitar asistencia humana.
Debido a que el agente mantiene el contexto durante toda la interacción, los usuarios pueden emitir comandos de seguimiento o aclaraciones sin repetir información. Por ejemplo, un conductor de reparto puede preguntar: "¿Cuál es mi próxima parada?" reciba instrucciones habladas, diga "Marcar la última entrega como completa" y luego siga con "Despacho de llamadas", todo sin tocar una pantalla, mientras el agente actualiza los sistemas backend en tiempo real.
Caso de uso 2: soporte telefónico entrante de gran volumen a escala
Vision Agents combinado con Amazon Nova 2 Sonic está diseñado para manejar grandes volúmenes de llamadas de soporte entrantes donde los agentes humanos se convierten en un cuello de botella. Este caso de uso tiene que ver fundamentalmente con la escala: reducir los tiempos de espera, desviar solicitudes repetitivas y reservar agentes humanos para casos que requieran su participación.
Con Amazon Nova 2 Sonic, las personas que llaman pueden tener conversaciones de voz a voz en tiempo real y de baja latencia que les permiten explicar los problemas de forma natural en lugar de navegar por árboles IVR programados. Vision Agents organiza la detección de intenciones, el estado de la conversación y las integraciones de backend, como sistemas de pedidos, registros de cuentas o servicios de emisión de boletos, para que las solicitudes comunes se puedan resolver automáticamente dentro de la llamada.
Cuando un problema excede los umbrales de confianza predefinidos o requiere intervención manual, el agente deriva a un humano con un contexto estructurado adjunto, aliviando la necesidad de que las personas que llaman repitan lo que dicen. Durante las horas pico, cientos de clientes pueden llamar preguntando sobre retrasos en las entregas. En lugar de esperar en una cola, las personas que llaman son respondidas inmediatamente por un agente de voz que verifica el estado del pedido, explica el retraso, ofrece los siguientes pasos y solo se dirige a un agente en vivo si se detecta una excepción. Esto convierte al sistema telefónico de un centro de costos basado en colas en una capa de resolución continua de primera línea.
Conclusión
Esta publicación explicó cómo crear agentes de voz en tiempo real utilizando el marco Vision Agents de Stream y Amazon Bedrock con Amazon Nova 2 Sonic. Cubrimos la arquitectura, el protocolo de transmisión bidireccional, el manejo de reconexión automática, la llamada de funciones, el soporte multilingüe y la implementación de producción. La combinación de la red perimetral de baja latencia de Stream y las capacidades nativas de voz a voz de Amazon Nova Sonic proporciona una base sólida para crear aplicaciones de inteligencia artificial de voz. El marco de Vision Agents abstrae la compleja orquestación de la gestión del ciclo de vida de la conexión, la codificación de audio, la reconexión compatible con VAD y la ejecución de herramientas, para que pueda centrarse en la lógica de su agente y la experiencia del usuario.
Si está listo para explorar más, le recomendamos que intente ampliar su agente con funciones personalizadas para su caso de uso específico o explorar las capacidades multilingües para aplicaciones globales. El repositorio de Vision Agents en https://github.com/GetStream/Vision-Agents es un buen lugar para comenzar. Encontrará ejemplos adicionales, documentación de complementos y debates de la comunidad. Para obtener detalles de integración más profundos, la documentación del complemento de AWS está disponible en https://visionagents.ai/integrations/aws-bedrock, y la documentación de Amazon Nova 2 Sonic en la Guía del usuario de AWS Nova proporciona una referencia completa para la API de transmisión bidireccional. Puede registrarse para obtener una cuenta de desarrollador de Stream en https://getstream.io/ y comenzar a crear hoy sin costo adicional.