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博客