当前位置: 首页 > 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.dtcms.com/a/306383.html

相关文章:

  • 浏览器pdf、image显示
  • MaxKB+MinerU:通过API实现PDF文档解析并存储至知识库
  • 虚幻基础:旋转体
  • 在java开发中,错误信息类中定义一个errMap,为什么要在static{}中,put键值对?这是为什么?好处是什么?
  • 嵌入式 C 语言入门:分支结构(if/switch)的用法与硬件控制实践
  • [ java IO ] 文件传输中的输入输出(流)
  • 算法能力提升之快速矩阵
  • PSO-TCN-BiLSTM-MATT粒子群优化算法优化时间卷积神经网络-双向长短期记忆神经网络融合多头注意力机制多特征分类预测/故障诊断Matlab实现
  • 电动车充电桩能耗实时监测解决方案
  • 【Java】批量生成Excel放入文件夹并打zip压缩包
  • LangChain 完全入门:5分钟搭建你的第一个AI智能体
  • 河南萌新联赛2025第(三)场:河南理工大学【补题】
  • 氯碱废水除钙镁金属离子
  • 无人机在复杂气流中,IMU 如何精准捕捉姿态变化以维持稳定?
  • WPFC#超市管理系统(3)商品管理
  • 今日行情明日机会——20250730
  • 【LeetCode】链表反转实现与测试
  • ansible巡检脚本
  • 2025年7月28日–7月29日 · AI 今日头条
  • 串口接收数据包(协议带帧头帧尾)的编程实现方法:1、数据包格式定义结构体2、使用队列进行数据接收、校验解包
  • centos7 aarch64上安装PostgreSQL14.3
  • 如何在生成式引擎优化(GEO)中取得成功
  • Java:高频面试知识分享1
  • 比特币挖矿的能源消耗和环保问题
  • 【Linux】重生之从零开始学习运维之备份恢复
  • CONTRASTIVE-KAN:一种用于稀缺标记数据的网络安全半监督入侵检测框架
  • Apache Kafka核心组件详解
  • click和touch事件触发顺序 糊里糊涂解决的奇怪bug
  • 开源 Arkts 鸿蒙应用 开发(十二)传感器的使用
  • WiFi连接简单流程