当前位置: 首页 > news >正文

AI框架工具FastRTC快速上手2——整体框架及Stream类详解

一、前言

在上一篇,我们仅用10行代码就实现了一个音频应用,包含了前后端,实现了“回音壁”的效果。本篇我们将根据回音壁demo的代码详细剖析,从而快速掌握整体框架及Stream类的使用方法。

二、整体框架

之所以说FastRTC能够迅速搭建起应用,它的框架也必定是极简的,大体就分为三个步骤:

(1)定义一个handler函数

顾名思义,就是定义一个处理音频或者视频的handler函数。

在这个函数中,开发者需要根据输入的音频、视频数据进行处理,处理完之后返回。在handler里面就可以内嵌各种AI功能了。

(2)定义一个Stream对象

Stream类是FastRTC中最重要的类,Stream类定义了带有内置界面的音视频流,也可挂载到FastAPI应用中。它的核心功能就包括了三点:

  • 建立点对点连接:主要是服务器和客户端之间的连接
  • 管理媒体轨道:WebRTC中的媒体轨道
  • 生成Gradio交互界面:这个就是它令人着迷的地方,交互界面不需要前端介入来写。

(3)启动

FastRTC提供了3种启动模式:

  • .ui.launch():启动内置的 Gradio 交互界面,用于快速测试和分享音视频流。
  • .fastphone():支持电话呼叫接入音视频流,但需提供 Hugging Face 凭证。
  • .mount(app):将音视频流挂载到 FastAPI 应用,无缝集成现有生产系统

目前我们仅需重点关注ui.launch()即可,ui.lauch()已经足够让我们去体验和实现不同的AI效果。fastphone模式和mount模式后续在合适的场合会介绍到。

三、代码回顾

我们先回顾下上一篇的完整代码:

from fastrtc import Stream, ReplyOnPause
import numpy as npdef echo(audio: tuple[int, np.ndarray]):yield audiostream = Stream(handler=ReplyOnPause(echo),modality="audio", mode="send-receive",
)
stream.ui.launch(server_name="0.0.0.0", server_port=8383)

从代码中可见,ReplyOnPause(echo)为第一步所说的handler函数,echo函数为实际的执行函数,第二步建立了stream对象,第三部则利用ui.lauch()对服务进行了启动。

四、代码剖析

4.1 Stream类

Stream类的详细前面见链接:https://fastrtc.org/reference/stream/

这里解释下用到的几个关键参数:

  • handler:

流处理函数。这个参数是Stream类中最重要的传参,可以是一个方法,也可以是一个类。类的话需要继承StreamHandler或者AsyncStreamHandler。如上所述,handler主要就是处理音频视频流的。

  • modality:

媒体类型,支持3种媒体类型:"video", "audio", "audio-video"。如本次回音壁demo,只用到了音频,就传参“audio”

  • mode:

流的模式。也主要有三种:"send-receive", "receive", "send"。从参数值上可以明显看到,就是双向和单向流的意思。如本次回音壁demo,需要双向传递,就用了"send-receive"。该参数的默认值也是"send-receive",所以不传也不影响。

4.2 ReplyOnPause类

ReplyOnPause是一个内置的handler类,可以直接使用。它的核心功能是能实时处理输入音频流,检测语音停顿,并在停顿发生时触发回复生成函数。

在本次demo中,echo函数就作为ReplyOnPause的参数,作为回复生成函数。我们在跟应用交互的时候,一旦检测到音频中断(也就是断句),就能立马执行echo函数。而echo函数的处理其实也很简单,什么都没做,就把收集到的音频数据原路返回,即yield audio。

所以大家看,fastrtc中连自动断句都已经提供了,实为大大提升效率。

4.3 ui.launch()

最后就是直接启动,这个非常好理解。

由于Stream类的ui属性,是Gradio的Blocks对象,所以lauch函数其实是Gradio里面的东西。熟悉Gradio的小伙伴就很清楚了。

我们主要看下launch函数里面的传参:

server_name:服务器地址,填0.0.0.0即任意外部ip能够访问

server_port:发布端口,指定发布的端口

还有一个很有意思的参数:

share: 如果设定了share=True,代码如下:

stream.ui.launch(share=True)

则会生成一个公网链接来访问。其原理是Gradio官方提供了一个云环境,通过frp穿透机制,从而使得能够在公网访问本地的服务。小伙伴们可以自己试试。

下一篇,我们将会演示FastRTC跟LLM大模型结合的例子。

本专栏系列文章

AI框架工具FastRTC快速上手1——框架搭建及回音壁DEMO-CSDN博客

AI框架工具FastRTC快速上手2——整体框架及Stream类详解-CSDN博客

http://www.lryc.cn/news/604767.html

相关文章:

  • 方块世界:失落文明的遗产
  • Deforum Stable Diffusion,轻松实现AI视频生成自由!
  • 语音识别dolphin 学习笔记
  • UE5多人MOBA+GAS 番外篇:将冷却缩减属性应用到技能冷却中
  • 设计模式十四:适配器模式(Adapter Pattern)
  • Linux ps -ef 命令解析
  • 基于成像空间转录组技术的肿瘤亚克隆CNV原位推断方法
  • composer 常用命令
  • 智慧城市SaaS平台|市政公用管理系统
  • 从单机到分布式:Redis如何成为架构升级的胜负手
  • 串口接收数据包(协议带帧头帧尾)的编程实现方法:1、数据包格式定义结构体2、使用队列进行数据接收、校验解包
  • 三十二、【Linux网站服务器】搭建httpd服务器演示虚拟主机配置、网页重定向功能
  • uni-app webview 的message无法触发的解决方案
  • MacTex+Vscode数学建模排版
  • 字节跳动“扣子”(Coze)开源:AI智能体生态的技术革命
  • AI Compass前沿速览:可灵创意工坊、字节Coze StudioCoze Loop、通义万相2.2 、智谱GLM-4.5、腾讯混元3D世界模型开源
  • 添加捕捉吸附标识(使用QT+OpenGL开发三维CAD)
  • 【翻译】Label Studio——开源标注工具README.md
  • 2025年DDoS攻防战:六层防护体系构建业务“数字免疫”
  • ADA4622-2ARMZ-R7 ADI双通道精密运算放大器 ±0.25μV超低失调+0.1μV/°C温漂
  • K8s 备份与恢复利器:Velero 实战指南
  • click和touch事件触发顺序 糊里糊涂解决的奇怪bug
  • VUE -- 基础知识讲解(三)
  • 前端安全防护:XSS、CSRF与SQL注入漏洞深度解析与防御
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | 3dBackgroundBoxes(3D背景盒子组件)
  • 前端兼容性问题全面解决方案
  • Vue2-封装一个看起来像左右分布表格的表单组件
  • JetBrains Annotations:从入门到落地,彻底告别 NullPointerException
  • 2025年GEO服务商有哪些?——从技术到服务的专业分析
  • 2507C++,介绍名字对象