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

需求背景

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

技术选型和现状

在客户需求调研中,我们发现许多企业希望构建一个基于 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 技术支持实时音视频通信,该网络利用亚马逊云科技全球骨干网络确保低延迟和高稳定的实时通信。

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

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 的基础设施,该物理架构提供了高可用性、低延迟和扩展性。架构的关键组件和流程如下:

用户请求流转流程

  • 终端用户接入:用户通过 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 部署服务,并监控运行状态。

核心服务

我们的解决方案围绕以下亚马逊云科技服务构建,下面我们简单介绍下该方案用到的核心服务。

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

Amazon Nova 是亚马逊云科技提供的一款支持文本、图像和视频输入的多模态 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 抽帧以减少数据量。 可以根据业务需要自动调整。代码如下:
python 复制代码
    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}")
  • 实施图片压缩与历史图片合并技术,优化带宽利用。
arduino 复制代码
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))

中断与完成信号检测

  • 检测实时音频输入中断,并动态调整输出。
  • 利用 Amazon Transcribe 插件判断输入完成信号 is_partial,提高对话流畅度。
ini 复制代码
    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)

模块化架构

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

详细部署流程

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

环境准备

  • 登录亚马逊云科技账户,并为所需服务(Amazon EKS、Amazon ECR、Amazon Nova、Amazon CloudFront、Amazon Transcribe、Amazon Polly、Amazon EC2 等)分配访问权限。
  • 登陆声网控制台:console.agora.io/ 开通声网账户,创建 appid 和 App certificate 和 token,具体收费请参考官网: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)。
bash 复制代码
# 登陆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
  • 创建 Amazon EKS 集群并部署服务与工作负载。
bash 复制代码
# 部署集群
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

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

yaml 复制代码
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: ten-framework
  region: us-east-1

autoModeConfig:
  enabled: true

deployment.k8s.yaml 配置如下:

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"

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

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

网络配置

1、创建 CloudFront ,配置 Orgin domain 为 k8s 创建的 ALB,注意这里的命名规则为"k8s-tenframe-ingress-***",使用 Amazon CloudFront 提供 HTTPS WEB 服务。使用 Amazon CloudFront 提供 HTTPS WEB 服务。

2、创建完成之后到 CloudFront 的 console 复制 Domain name 对应的 endpoint 打开浏览器来体验服务。

Demo 演示

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

支持中英文对话的 Demo

方案的应用场景与优化

可拓展应用场景

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

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

方案优化

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

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

参考文档

本篇作者

本期最新实验为《大模型选型实战 ------ 基于Amazon Bedrock测评对比和挑选最合适业务的大模型

✨ 立即解锁当下最火爆的AI大模型,带你零基础玩转 DeepSeek、Nova 等顶尖大预言模型。

📱 即刻在云上探索实验室,开启构建开发者探索之旅吧!

⏩[点击进入实验] 构建无限, 探索启程!🚀

相关推荐
萧鼎7 分钟前
RAGFlow:构建高效检索增强生成流程的技术解析
人工智能·python
爱的叹息11 分钟前
主流开源 LLM 应用开发平台详解
人工智能·开源
赋范大模型技术社区13 分钟前
从0手撕代码搭建MCP Client与Server!详解DeepSeek、ollama、vLLM接入MCP实战!
人工智能·mcp
Baihai_IDP23 分钟前
面对开源大模型浪潮,基础模型公司如何持续盈利?
人工智能·openai·deepseek
陈明勇24 分钟前
MCP 实战:用 Go 语言开发一个查询 IP 信息的 MCP 服务器
人工智能·后端·mcp
浏览器爱好者30 分钟前
如何下载适用于语音识别功能增强的Google Chrome浏览器
人工智能·chrome·语音识别
孔令飞1 小时前
彻底学会 gRPC:用 Go 实现一个迷你考试服务
人工智能·云原生·go
梓羽玩Python1 小时前
告别OCR!这个AI文档神器直接"看懂"PDF,支持文档归类及多模态问答!
人工智能·github
weixin_457885821 小时前
Discuz!+DeepSeek:传统论坛的智能化蜕变之路
人工智能·学习·discuz·deepseek
檀越剑指大厂1 小时前
Browser-Use WebUI:让AI自动使用浏览器帮你查询信息执行任务
人工智能