亚马逊AWS官方博客

基于 Amazon Nova 和 TEN 框架的实时音视频交互解决方案

需求背景

随着人工智能技术的飞速发展,实时音视频交互应用逐渐成为市场热点。从智能语音助手到多模态教育平台,企业对高效、低延时且可扩展的解决方案需求日益增加。借助 Amazon Nova 系列模型、Amazon Transcribe 和 Amazon Polly 等 AWS 服务,您可以轻松构建功能强大的实时音视频交互系统。本文将深入介绍这些服务如何协同工作,帮助开发者打造卓越的用户体验。

技术选型和现状

在客户需求调研中,我们发现许多企业希望构建一个基于 AI 的实时音视频助手,以实现多模态的交互体验。然而,传统方案往往存在延时高、耦合度高、扩展性差的问题。另外,目前已有的《Amazon Bedrock 的实时语音解决方案》是基于 Amazon 相关服务和开源 TEN-Agent 构建的。基于此,我们提出了一套《基于 Amazon Nova+TEN 的实时音视频交互解决方案》,其核心优势在于利用 Amazon Nova 的多模态能力支持实时视频理解。

逻辑架构

《基于 Amazon Nova +TEN 的实时音视频交互解决方案》采用模块化的逻辑架构设计,通过 TEN 框架编排各功能模块,实现高效的数据流处理和灵活的扩展能力。以下是逻辑架构的核心组成部分,见下图:

前端用户交互模块

  • 用户终端:支持 Web 和移动应用,收集用户的音视频信息并与后端建立实时通信。
  • Web Server:作为前端请求的入口,负责处理用户的连接请求用于创建通道与开启/停止对话。

TEN Agent

核心模块,用于编排和管理所有插件,基于有向循环图(DCG)实现数据流的灵活处理。

  • RTC 插件:处理实时音视频数据的收发,保证低延迟传输。
  • Amazon Transcribe 插件:调用 Amazon Transcribe 实现实时语音识别,将语音转化为文本。
  • Interrupt 插件:监测语音和文本输入,判断用户输入的中断状态,优化对话流程。
  • Amazon Bedrock 插件:使用 Amazon Nova 模型进行多模态推理,处理图像、文本和视频数据。
  • Amazon Polly 插件:调用 Amazon Polly 将文本生成自然语音输出,提供更具沉浸感的交互体验。

RTC 网络

通过 Agora 的 RTC 技术支持实时音视频通信,该网络利用 AWS 全球骨干网络确保低延迟和高稳定的实时通信。

通信通道建立流程如下图所示:

1. 通信建立初始化流程

1.1 用户客户端(UserClient)调用 HTTP 接口 /v1/api/generate 请求通道名(channel)和认证 token(用于在声网 RTC 网络中进行身份验证)。

1.2 WebServer 处理请求,并返回通道名和认证 token。

1.3 用户客户端使用 token 建立与 RTC Network 的通信通道。

2. 对话开启流程(建立用户与 Agent 的双向通信)

2.1 用户客户端调用 HTTP 接口 /v1/api/start 请求开启对话。

2.2 WebServer 获取客户端的 channel 并将相关参数传递给 Agent。

2.3 Agent 接收 channel 信号后,建立该 channel 与 RTC Network 的通信。

物理架构

《基于 Amazon Nova +TEN 的实时音视频交互解决方案》部署在 AWS 的云服务上,充分利用 AWS 的基础设施,该物理架构提供了高可用性、低延迟和扩展性。架构的关键组件和流程如下:

用户请求流转流程

  • 终端用户接入:用户通过 Web 或移动应用访问系统。
  • 内容分发:Amazon CloudFront 作为内容分发网络(CDN),负责加速边缘用户请求。
  • 流量路由:经过鉴权后,流量由 Application Load Balancer (ALB) 转发至后端服务,确保高效的流量分发。

服务处理层

  • 容器化服务部署:Amazon Elastic Kubernetes Service (EKS) 承载所有核心服务,使用容器编排以支持高可用性和弹性伸缩。
  • 实时数据处理:RTC 网络通过 Agora 的 Software-Defined Real-Time Network (SD-RTN) 实现低延迟的音视频数据传输。
  • 数据流插件:包括 Amazon Transcribe(语音识别)、Amazon Polly(文本转语音)和 Amazon Nova 模型(多模态推理),各模块通过 TEN 框架编排实现无缝衔接。

研发支持与管理

  • Docker 镜像管理:研发人员通过 Amazon ECR(Elastic Container Registry)上传和存储 Docker 镜像。
  • 服务部署与监控:研发人员使用 kubectl 部署服务,并监控运行状态。

核心服务

我们的解决方案围绕以下 AWS 服务构建,下面我们简单介绍下该方案用到的核心服务。

Amazon Nova – 强大的多模态 AI 引擎

Amazon Nova 是 AWS 提供的一款支持文本、图像和视频输入的多模态 AI 模型系列。无论是复杂的推理任务,还是需要快速响应的对话应用,Nova 系列都能提供高性价比和低延迟的解决方案。

  • Nova Micro:有不错的性能,低成本、速度快。
  • Nova Pro:在性能、速度和成本间实现最佳平衡,适用于广泛的任务。
  • Nova Lite:低成本的选择,可快速处理图像和视频输入。
  • Nova Premier:适合复杂推理任务的高性能模型,即将在 2025 年推出。

从上图我们可以看到,Amazon Nova Pro 的延迟与 GPT-4o min 和 Gemni2.0 Flash 对比,表现更快。

从上图我们可以看到 Amazon Nova Pro 的质量和速度都是中上水平,但价格却非常有竞争力,整体性价比非常高。

*注:上面 2 张图片的统计结果来源于第三方 AI 评测网站:https://artificialanalysis.ai,最新结果会根据时间有所变化。

Amazon Transcribe – 高效语音识别

Amazon Transcribe 是一项完全托管的自动语音识别(ASR)服务,支持流式和录制语音的实时转录。它支持 100 多种语言,并能快速生成精准的文本输出。

Amazon Polly – 高品质文本转语音

Amazon Polly 提供多种声音模型和 40 多种语言支持,将文本转换为自然流畅的语音。它支持流式返回,能够在不到 150 毫秒内完成语音生成,提升用户体验。

关键技术点与优化策略

降低延迟

  • 使用 Amazon Nova Pro 模型提供低延迟的多模态推理能力。
  • 借助开源的 TEN 框架支持异步处理,优化任务调度。
  • 流式调用 Amazon Transcribe 和 Amazon Polly,减少处理时间。

成本优化

  • 视频按时间间隔 VIDEO_FRAME_INTERVAL 抽帧以减少数据量。 可以根据业务需要自动调整。代码如下:
        async def _on_video(self, ten_env: AsyncTenEnv):
            """Process video frames from the queue."""
            while True:
                try:
                    [image_data, image_width, image_height] = await self.image_queue.get()
                    
                    frame_buffer = rgb2base64jpeg(image_data, image_width, image_height)
                    
                    self.image_buffers.append(frame_buffer)
                                   
                    while len(self.image_buffers) > MAX_IMAGE_COUNT:
                        self.image_buffers.pop(0)
                    
                    # Skip remaining frames for the interval
                    while not self.image_queue.empty():
                        await self.image_queue.get()
                        
                    await asyncio.sleep(VIDEO_FRAME_INTERVAL)
                    
                except Exception as e:
                    traceback.print_exc()
                    ten_env.log_error(f"Error processing video frame: {e}")
    
    PowerShell
  • 实施图片压缩与历史图片合并技术,优化带宽利用。
    def resize_image_keep_aspect(image: Image.Image, max_size: int = 512) -> Image.Image:
        """Resize an image while maintaining its aspect ratio."""
        width, height = image.size
    
        if width <= max_size and height <= max_size:
            return image
    
        aspect_ratio = width / height
    
        if width > height:
            new_width = max_size
            new_height = int(max_size / aspect_ratio)
        else:
            new_height = max_size
            new_width = int(max_size * aspect_ratio)
    
        return image.resize((new_width, new_height))
    
    PowerShell

中断与完成信号检测

  • 检测实时音频输入中断,并动态调整输出。
  • 利用 Amazon Transcribe 插件判断输入完成信号 is_partial,提高对话流畅度。
        async def handle_transcript_event(self, transcript_event: TranscriptEvent) -> None:
            results = transcript_event.transcript.results
            text_result = ""
    
            is_final = True
    
            for result in results:
                if result.is_partial:
                    is_final = False
                    # continue
    
                for alt in result.alternatives:
                    text_result += alt.transcript
    
            if not text_result:
                return
    
            self.ten.log_info(f"got transcript: [{text_result}], is_final: [{is_final}]")
    
            create_and_send_data(ten=self.ten, text_result=text_result, is_final=is_final, stream_id=self.stream_id)
    
    PowerShell

模块化架构

通过 TEN 框架实现模块化架构,各功能模块支持热拔插,开发者可以根据需求替换特定服务,进一步增强系统的灵活性。

详细部署流程

构建此解决方案需要以下部署步骤:

环境准备

  • 登录 AWS 账户,并为所需服务(Amazon EKS、Amazon ECR、Amazon Nova、Amazon CloudFront、Amazon Transcribe、Amazon Polly、Amazon EC2 等)分配访问权限。
  • 登陆声网控制台:https://console.agora.io/ 开通声网账户,创建 appid 和 App certificate 和 token,具体收费请参考官网:https://www.agora.io/en/pricing/
  • 使用 EKS 的编排文件 Deployment.yaml 和 Service.yaml 文件(或者手动编辑),用于工作负载和服务的编排。

镜像构建与服务部署

  • 下载代码并构建 Docker 镜像。
    • 删掉 ARG USE_AGENT=agents/examples/default
    • RUN 这一行修改成 RUN task clean && task use AGENT=agents/examples/demo
  • 将镜像上传至 Amazon Elastic Container Registry (ECR)。
    # 登陆docker
    aws ecr get-login-password --region region_id | docker login --username AWS --password-stdin your_accountid.dkr.ecr.us-east-1.amazonaws.com
    
    # 代码仓库
    https://github.com/zhuermu/TEN-Agent.git
    
    # 在本地构建镜像  在目录TEN-Agent/Dockerfile
    docker build -t dev/ten_agent_build .
    
    # 打tag
    docker tag dev/ten_agent_build:latest your_accountid.dkr.ecr.us-east-1.amazonaws.com/dev/ten_agent_build:latest
    # 推送镜像
    docker push your_accountid.dkr.ecr.us-east-1.amazonaws.com/dev/ten_agent_build:latest
    
    PowerShell
  • 创建 Amazon EKS 集群并部署服务与工作负载。
    # 部署集群
    eksctl create cluster -f cluster-config.yaml
    
    # 创建命名空间
    kubectl create namespace ten-framework --save-config
    
    # 创建部署deployment
    kubectl apply -n ten-framework -f deployment.k8s.yaml
    
    # 创建服务service 和 ingress
    kubectl apply -n ten-framework -f service.k8s.yaml
    
    PowerShell

    其中 cluster-config.yaml 文件内容如下:

    apiVersion: eksctl.io/v1alpha5
    kind: ClusterConfig
    
    metadata:
      name: ten-framework
      region: us-east-1
    
    autoModeConfig:
      enabled: true
    
    PowerShell

    deployment.k8s.yaml 配置如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ten-agent-demo
      namespace: ten-framework
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ten-agent-demo
      template:
        metadata:
          labels:
            app: ten-agent-demo
        spec:
          containers:
            - env:
                - name: AGENT_SERVER_URL
                  value: http://ten-agent-build-service:8080
              image: xxxxx.dkr.ecr.us-east-1.amazonaws.com/dev/ten_agent_demo:latest # 替换你的镜像地址,部署palyground
              name: ten-agent-demo
              ports:
                - containerPort: 3000
              resources:
                requests:            
                  cpu: "1"          
                  memory: "2Gi"     
                limits:            
                  cpu: "2"         
                  memory: "4Gi"   
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ten-agent-build
      namespace: ten-framework
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ten-agent-build
      template:
        metadata:
          labels:
            app: ten-agent-build
        spec:
          containers:  
            - env:
                - name: LOG_PATH
                  value: /tmp/ten_agent
                - name: LOG_STDOUT
                  value: "true"
                - name: GRAPH_DESIGNER_SERVER_PORT
                  value: "49483"
                - name: SERVER_PORT
                  value: "8080"
                - name: WORKERS_MAX
                  value: "100"
                - name: WORKER_QUIT_TIMEOUT_SECONDES
                  value: "60"
                - name: AGORA_APP_ID
                  value: {{AGORA_APP_ID}} # 替换你的 agora app id
                - name: AGORA_APP_CERTIFICATE
                  value: {{AGORA_APP_CERTIFICATE}} # 替换你的 agora app certificate
                - name: AWS_ACCESS_KEY_ID
                  value: {{AWS_ACCESS_KEY_ID}} # 替换你的 aws access key id
                - name: AWS_SECRET_ACCESS_KEY
                  value: {{AWS_SECRET_ACCESS_KEY}} # 替换你的 aws secret access key
                
              image: xxxx.dkr.ecr.us-east-1.amazonaws.com/dev/ten_agent_build:latest # 替换你的镜像地址,部署agent
              name: ten-agent-build
              ports:
                - containerPort: 8080
              resources:
                requests:            
                  cpu: "2"          
                  memory: "4Gi"
                limits:            
                  cpu: "3"         
                  memory: "6Gi"
    
    PowerShell

    Service.k8s.yaml 文件内容如下:

    apiVersion: v1
    kind: Service
    metadata:
      name: service-ten-agent-demo
      namespace: ten-framework
    spec:
      ports:
        - port: 3000
          targetPort: 3000
      selector:
        app: ten-agent-demo
      type: LoadBalancer
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: ten-agent-build-service  # 这个名称将用于服务发现
      namespace: ten-framework   # 你的命名空间名称
    spec:
      selector:
        app: ten-agent-build        # 要匹配 ten-agent-build 的标签
      ports:
        - protocol: TCP
          port: 8080               # Service 端口
          targetPort: 8080         # 容器端口
    
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      namespace: ten-framework
      name: ingress-ten-agent-demo
      annotations:
        alb.ingress.kubernetes.io/scheme: internet-facing
        alb.ingress.kubernetes.io/target-type: ip
    
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: service-ten-agent-demo
                  port:
                    number: 3000
    
    PowerShell

网络配置

  1. 创建 CloudFront ,配置 Orgin domain 为 k8s 创建的 ALB,注意这里的命名规则为“k8s-tenframe-ingress-***”,使用 Amazon CloudFront 提供 HTTPS WEB 服务。使用 Amazon CloudFront 提供 HTTPS WEB 服务。
  2. 创建完成之后到 CloudFront 的 console 复制 Domain name 对应的 endpoint  打开浏览器来体验服务。

Demo 演示

体验地址: https://agent.theten.ai/,选择 Voice Agent / STT + Nova Mutimodal + TTS 进行 Connect,如下图所示。

支持中英文对话的 Demo

方案的应用场景与优化

可拓展应用场景

智能音视频助手、视觉识别系统、交互教育平台、直播实时翻译等。

  • 智能音视频助手:例如下图的桌面智能助手,可以嵌入在智能 IoT 设备中为个人提供服务。
  • 视觉识别系统:可以用于集成摄像头用于工业安全监控、儿童看护监控场景。
  • 交互教育平台:系统支持共享用户桌面,可用课文和题目进行解答和讲解。
  • 直播实时翻译:使用该方案对直播内容实现实时翻译多语种,支持出海带货等业务。

方案优化

方案目前缺少实时信息的获取工具,例如当前时间、天气、新闻等,可以基于此拓展一些 function tool 来与现实世界实时信息对齐。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

参考文档

Ten 框架:https://doc.theten.ai/

Demo Git:https://github.com/zhuermu/TEN-Agent

Amazon EKS:https://docs.aws.amazon.com/eks/latest/userguide/quickstart.html

Amazon Nova API:https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-examples.html

Amazon Trancribe:https://docs.aws.amazon.com/transcribe/latest/dg/what-is.html

Amazon Polly:https://docs.aws.amazon.com/polly/latest/dg/what-is.html

声网(Agora)文档:https://docs.agora.io/en/

声网(Agora)注册地址:https://sso2.agora.io/en/v6/signup

声网计费:https://doc.shengwang.cn/doc/rtc/android/billing/billing-strategy

本篇作者

黎小为

亚马逊云科技解决方案架构师,负责亚马逊云科技解决方案构建,在加入亚马逊云科技之前,就职于腾讯、网易、京东等国内大型互联网企业,拥有丰富的研发经验。