FastRTC:3行Python函数变成实时语音流
【免费下载链接】fastrtcThe python library for real-time communication项目地址: https://gitcode.com/GitHub_Trending/fa/fastrtc
FastRTC 是一个 Python 库,把普通函数变成基于 WebRTC 或 WebSocket 的实时音视频流:内置静音检测自动判断"该你说话了",.ui.launch()一行起界面。适合想快速搭语音助手、实时视频应用的全栈开发者和 AI 工程师。
它到底能干嘛?语音助手、视频标注、语音写代码
三个最能说明问题的场景:给大模型装上嘴和耳朵的语音助手,暂停检测自动完成轮次切换,完整实现见 LLM 语音聊天 demo;对着摄像头实时画检测框,YOLOv10 每帧标注人物和物体,见 视频目标检测 demo;纯靠说话让 LLM 写并修改 HTML 页面,见 语音代码编辑器。
最小可运行示例
下面这段代码做了两件事:定义一个"收到什么就回什么"的回声函数,再把它交给Stream起一个内置 Gradio 界面。
from fastrtc import Stream, ReplyOnPause import numpy as np def echo(audio: tuple[int, np.ndarray]): # yield 一个音频块,前端就能立刻播出来 yield audio stream = Stream( handler=ReplyOnPause(echo), # 检测到说话暂停才触发回复 modality="audio", mode="send-receive", ) if __name__ == "__main__": stream.ui.launch()跑起来打开浏览器,点麦克风按钮:你说话、停顿,自己的声音会原样播回来,延迟大约半秒,能明显感觉到"管道是通的"。完整可部署版本(含 FastAPI 挂载)见 回声音频 demo。
两种传输协议怎么选?
Stream同时支持 WebRTC 和 WebSocket,怎么选主要看场景。纯实时音视频通话选 WebRTC——浏览器原生编解码,延迟最低;如果需要音频之外再走文本(聊天框、控制指令),或者想绕过 WebRTC 握手自己管数据通道,选 WebSocket,文本/音频混发 demo 就同时演示了这条链路。至于两者延迟差多少,webrtc_vs_websocket 对比 demo 会直接给你实测数据,别凭感觉选。
接上大模型:从回声到对话
回声只是骨架,真正的价值在 STT → LLM → TTS 这条链路。官方 cookbook 里的 LLM 语音聊天示例 大概长这样:
from fastrtc import ReplyOnPause, Stream, get_stt_model, get_tts_model from openai import OpenAI stt_model = get_stt_model() # 本地 STT,免 key tts_model = get_tts_model() # 本地 TTS client = OpenAI(api_key=..., base_url="https://api.sambanova.ai/v1") def chat(audio): prompt = stt_model.stt(audio) # 语音 → 文本 reply = client.chat.completions.create( model="Meta-Llama-3.2-3B-Instruct", messages=[{"role": "user", "content": prompt}], max_tokens=200, ).choices[0].message.content # LLM 生成回复 for chunk in tts_model.stream_tts_sync(reply): yield chunk # TTS 边合成边推 stream = Stream(ReplyOnPause(chat), modality="audio", mode="send-receive")重点不在逐行逻辑,而在yield:handler 是个生成器,每yield一个音频块,前端立刻播一块,不用等整段 TTS 合成完——这是"边说边播"低延迟的来源。ReplyOnPause负责静音检测:用户开口时把音频攒起来,一旦停顿就把整段送进 handler,轮次切换不用自己写 VAD。真实项目可以照搬 talk_to_claude 或 talk_to_openai,还能通过yield AdditionalOutputs(chatbot)把文字同步推到聊天框。
前端三档方案
原型阶段直接stream.ui.launch(),内置 Gradio 界面带上麦克风开关和波形动画,零前端代码。半生产用stream.mount(app)把 Stream 装进 FastAPI,前端自己写页面,talk_to_claude demo 就是这种模式,前端还能通过/outputs的 SSE 接口同步聊天框。全自定义参考 nextjs_voice_chat,前端直接调 lib/webrtc-client.ts 里的现成封装,不用重造轮子。
踩坑与调优:采样率、分片、TURN
采样率不匹配。麦克风进来可能是 48kHz,STT 模型只吃 16kHz,TTS 输出又是 24kHz。在ReplyOnPause里显式声明input_sample_rate/output_sample_rate,库内部用 librosa 重采样;TTS 输出要按采样率包成(sr, int16_array)再 yield,音调才不会变调。
分片粒度不对。别一次性 yield 整段 TTS 音频,浏览器端会卡住不播;TTS 服务返回的原始字节流要先用aggregate_bytes_to_16bit()聚合成约 20ms 的 PCM 块再转np.int16数组,webrtc_vs_websocket demo 里就是这么切的。
公网连不上。两个浏览器之间打洞失败就必须走 TURN 中继。部署到 HF Spaces / Colab 时,把rtc_configuration=get_twilio_turn_credentials()或get_cloudflare_turn_credentials()传进Stream,这几个 helper 都在 credentials 模块 里,本地开发一般不需要。
继续往下挖
官方文档:userguide 从音频到 WebRTC 逐层展开,适合刚装完包、想系统过一遍 API 的人。demo 目录:15+ 完整应用,cookbook 支持按 LLM、语音、视觉等标签筛选,每个 demo 都能直接跑,适合照着抄。API 参考:逐字段讲Stream参数和 handler 协议,适合动手写生产代码前最后查一遍细节。
【免费下载链接】fastrtcThe python library for real-time communication项目地址: https://gitcode.com/GitHub_Trending/fa/fastrtc
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考