54f1ec176ca7171e3428e878ff341951.gif

随着人工智能技术的飞速发展,实时音视频交互应用逐渐成为市场热点。从智能语音助手到多模态教育平台,企业对高效、低延时且可扩展的解决方案需求日益增加。借助Amazon Nova系列模型、Amazon Transcribe和Amazon Polly等亚马逊云科技服务,您可以轻松构建功能强大的实时音视频交互系统。

本文将深入介绍这些服务如何协同工作,帮助开发者打造卓越的用户体验。

技术选型和现状

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

《Amazon Bedrock的实时语音解决方案》

https://aws.amazon.com/cn/blogs/china/building-an-end-to-end-real-time-voice-assistant-on-amazon-bedrock/

逻辑架构

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

3fc465b4cd632341b477f0cf71122702.png

前端用户交互模块

用户终端:支持Web和移动应用,收集用户的音视频信息并与后端建立实时通信。

Web Server:作为前端请求的入口,负责处理用户的连接请求用于创建通道与开启/停止对话。

TEN Agent

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

  • RTC插件:处理实时音视频数据的收发,保证低延迟传输。

  • Amazon Transcribe插件:调用Amazon Transcribe实现实时语音识别,将语音转化为文本。

  • Interrupt插件:监测语音和文本输入,判断用户输入的中断状态,优化对话流程。

  • Amazon Bedrock插件:使用Amazon Nova模型进行多模态推理,处理图像、文本和视频数据。

  • Amazon Polly插件:调用Amazon Polly将文本生成自然语音输出,提供更具沉浸感的交互体验。

RTC网络

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

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

a0270ff4c201c42ec55e589157abb99c.png

1.通信建立初始化流程:

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

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

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

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

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

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

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

物理架构

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

用户请求流转流程

终端用户接入:用户通过Web或移动应用访问系统。

内容分发:Amazon CloudFront作为内容分发网络(CDN),负责加速边缘用户请求。

流量路由:经过鉴权后,流量由Application Load Balancer(ALB)转发至后端服务,确保高效的流量分发。

服务处理层

容器化服务部署:Amazon EKS承载所有核心服务,使用容器编排以支持高可用性和弹性伸缩。

实时数据处理:RTC网络通过Agora的Software-Defined Real-Time Network(SD-RTN)实现低延迟的音视频数据传输。

数据流插件:包括Amazon Transcribe(语音识别)、Amazon Polly(文本转语音)和Amazon Nova模型(多模态推理),各模块通过TEN框架编排实现无缝衔接。

研发支持与管理

Docker镜像管理:研发人员通过Amazon ECR上传和存储Docker镜像。

服务部署与监控:研发人员使用kubectl部署服务,并监控运行状态。

359fb59d13674a3c701bcb2322ce7ac9.png

核心服务

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

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

9a8b36e4b4b5f2482dc069f5a32a4a5a.png

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

  • Amazon Nova Micro:有不错的性能,低成本、速度快。

  • Amazon Nova Pro:在性能、速度和成本间实现最佳平衡,适用于广泛的任务。

  • Amazon Nova Lite:低成本的选择,可快速处理图像和视频输入。

  • Amazon Nova Premier:适合复杂推理任务的高性能模型,即将在2025年推出。

8237880cd375bbaac136485f01ab7da9.png

0f750e20b8ddeeaef1fdcb45832d392a.png

从上图可以看到,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}")

左右滑动查看完整示意

实施图片压缩与历史图片合并技术,优化带宽利用。

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)

左右滑动查看完整示意

中断与完成信号检测

检测实时音频输入中断,并动态调整输出。

利用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)

左右滑动查看完整示意

模块化架构

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

详细部署流程

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

环境准备

登录亚马逊云科技账户,并为所需服务(Amazon EKS、Amazon ECR、Amazon Nova、Amazon CloudFront、Amazon Transcribe、Amazon Polly、Amazon EC2等)分配访问权限。

登陆声网控制台:开通声网账户,创建appid和App certificate和token,具体收费请参考官网。

声网控制台:

https://console.agora.io/

声网官网:

https://www.agora.io/en/pricing/

使用Amazon EKS的编排文件Deployment.yaml和Service.yaml文件(或者手动编辑),用于工作负载和服务的编排。

镜像构建与服务部署

1.下载代码并构建Docker镜像。

  • 删掉ARG USE_AGENT=agents/examples/default

  • RUN这一行修改成RUN task clean && task use AGENT=agents/examples/demo

2.将镜像上传至Amazon 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

左右滑动查看完整示意

3.创建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

左右滑动查看完整示意

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

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig


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


autoModeConfig:
  enabled: true

左右滑动查看完整示意

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"

左右滑动查看完整示意

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

左右滑动查看完整示意

网络配置

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

b59b3b05d1448da07630088e87bb0181.png

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

3d0e16c30b5f771942ac248afb49c60f.png

Demo演示

选择Voice Agent/STT+Nova Mutimodal+TTS进行Connect,如下图所示。

体验地址:

https://agent.theten.ai/

134f9f52299d990cae650526f2112a44.png

支持中英文对话的Demo。

36aba868f9405f1ab00220b9abb22e22.gif

方案的应用场景与优化

可拓展应用场景

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

  • 智能音视频助手:例如下图的桌面智能助手,可以嵌入在智能IoT设备中为个人提供服务。

  • 视觉识别系统:可以用于集成摄像头用于工业安全监控、儿童看护监控场景。

  • 交互教育平台:系统支持共享用户桌面,可用课文和题目进行解答和讲解。

  • 直播实时翻译:使用该方案对直播内容实现实时翻译多语种,支持出海带货等业务。

方案优化

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

outside_default.png

参考文档

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

本篇作者

d34602d5349ea8903364503456b47018.jpeg

黎小为

亚马逊云科技解决方案架构师,负责亚马逊云科技解决方案构建。

dc8dda8a70d285d7cc164e5fbb560bf9.png

522a2562c8ccc6c31c2374aff2a82069.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

听说,点完下面4个按钮

就不会碰到bug了!

19087feeb9ebdf4bc09a771e4b55195b.gif

点击阅读原文查看博客!获得更详细内容!

Logo

邀请您加入社区

更多推荐