FastRTC: Python 实时通信库

发布于 2025 年 2 月 25 日
在 GitHub 上更新

在过去的几个月里,许多新的实时语音模型已经发布,并且围绕开源和闭源模型成立了多家公司。举几个里程碑:

  • OpenAI 和 Google 发布了他们针对 ChatGPT 和 Gemini 的实时多模态 API。OpenAI 甚至推出了 1-800-ChatGPT 电话号码!
  • Kyutai 发布了 Moshi,一个完全开源的音频到音频 LLM。阿里巴巴发布了 Qwen2-Audio,Fixie.ai 发布了 Ultravox——这两个都是原生理解音频的开源 LLM。
  • ElevenLabs 在 C 轮融资中筹集了 1.8 亿美元

尽管模型和资金方面出现了爆炸式增长,但构建流式传输音频和视频的实时 AI 应用程序仍然很困难,尤其是在 Python 中。

  • 机器学习工程师可能不具备构建实时应用程序所需的技术经验,例如 WebRTC。
  • 即使是 Cursor 和 Copilot 等代码助手工具也难以编写支持实时音频/视频应用程序的 Python 代码。我深有体会!

这就是为什么我们很高兴地宣布 FastRTC,一个用于 Python 的实时通信库。该库旨在让您能够轻松地完全用 Python 构建实时音频和视频 AI 应用程序!

在这篇博客文章中,我们将通过构建实时音频应用程序来介绍 FastRTC 的基础知识。最后,您将了解 FastRTC 的核心功能:

  • 🗣️ 内置自动语音检测和轮流发言功能,因此您只需关注响应用户的逻辑。
  • 💻 自动 UI - 内置 WebRTC 支持的 Gradio UI,用于测试(或部署到生产环境!)。
  • 📞 通过电话呼叫 - 使用 fastphone() 获得一个免费电话号码,可以呼叫您的音频流(需要 HF Token。PRO 账户限制增加)。
  • ⚡️ 支持 WebRTC 和 Websocket。
  • 💪 可定制 - 您可以将流挂载到任何 FastAPI 应用程序,以便您可以提供自定义 UI 或部署到 Gradio 之外。
  • 🧰 大量用于文本转语音、语音转文本、停用词检测的实用程序,助您入门。

让我们深入了解。

入门

我们将从构建实时音频的“hello world”开始:回显用户所说的话。在 FastRTC 中,这就像这样简单:

from fastrtc import Stream, ReplyOnPause
import numpy as np

def echo(audio: tuple[int, np.ndarray]) -> tuple[int, np.ndarray]:
    yield audio

stream = Stream(ReplyOnPause(echo), modality="audio", mode="send-receive")
stream.ui.launch()

让我们分解一下:

  • ReplyOnPause 将为您处理语音检测和轮流发言。您只需关注响应用户的逻辑。任何返回音频元组(表示为 (sample_rate, audio_data))的生成器都可以工作。
  • Stream 类将为您构建一个 Gradio UI,以便您快速测试您的流。完成原型设计后,您可以通过一行代码将您的流部署为生产就绪的 FastAPI 应用程序 - stream.mount(app),其中 app 是一个 FastAPI 应用程序。

以下是其运行情况:

升级:LLM 语音聊天

下一级是使用 LLM 响应用户。FastRTC 内置了语音转文本和文本转语音功能,因此使用 LLM 非常容易。让我们相应地修改我们的 echo 函数:

import os

from fastrtc import (ReplyOnPause, Stream, get_stt_model, get_tts_model)
from openai import OpenAI

sambanova_client = OpenAI(
    api_key=os.getenv("SAMBANOVA_API_KEY"), base_url="https://api.sambanova.ai/v1"
)
stt_model = get_stt_model()
tts_model = get_tts_model()

def echo(audio):
    prompt = stt_model.stt(audio)
    response = sambanova_client.chat.completions.create(
        model="Meta-Llama-3.2-3B-Instruct",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=200,
    )
    prompt = response.choices[0].message.content
    for audio_chunk in tts_model.stream_tts_sync(prompt):
        yield audio_chunk

stream = Stream(ReplyOnPause(echo), modality="audio", mode="send-receive")
stream.ui.launch()

我们使用 SambaNova API,因为它速度很快。get_stt_model() 将从 Hub 获取 Moonshine Baseget_tts_model() 将从 Hub 获取 Kokoro,这两者都已针对设备端 CPU 推理进行了进一步优化。但是您可以使用任何 LLM/文本转语音/语音转文本 API,甚至语音转语音模型。带上您喜欢的工具——FastRTC 只处理实时通信层。

附赠:通过电话呼叫

如果您调用 stream.fastphone() 而不是 stream.ui.launch(),您将获得一个免费电话号码来呼叫您的流。请注意,需要 Hugging Face token。PRO 账户的限制有所增加。

您将在终端中看到类似这样的内容:

INFO:	  Your FastPhone is now live! Call +1 877-713-4471 and use code 530574 to connect to your stream.
INFO:	  You have 30:00 minutes remaining in your quota (Resetting on 2025-03-23)

然后您可以拨打该号码,它将连接到您的流!

后续步骤

  • 阅读 文档,了解更多 FastRTC 的基础知识。
  • 开始构建的最佳方式是查看教程。了解如何与流行的 LLM 提供商(包括 OpenAI 和 Gemini 的实时 API)集成、将您的流与 FastAPI 应用程序集成并进行自定义部署、从处理程序返回额外数据、进行视频处理等等!
  • ⭐️ 为 repo 加星,并提交 bug 和 issue 请求!
  • 关注 HuggingFace 上的 FastRTC 组织以获取更新并查看已部署的示例!

感谢您关注 FastRTC

社区

哇。

fastphone() 可以接受印度电话号码吗?

·

我们正在努力获取 WhatsApp 号码

太棒了!

📻 🎙️ 嘿,我为这篇博文生成了一个 AI 播客,快来听听看吧!

此播客通过 ngxson/kokoro-podcast-generator 生成,使用 DeepSeek-R1Kokoro-TTS

感谢所有人。很棒的工作!!!

我有一个关于使用 tts_model 和 stt_model 时的并发问题。每种模型如何同时处理多个请求。(例如,批处理技术?仅 CPU 线程...) @freddyaboulton

·

您好 @MRU4913 !每个流都是事件循环中的一个独立事件。但是您可以非常轻松地限制同时运行的流的数量。Stream 类中有一个参数:

连接需要一段时间。您是否使用了 VPN?还有其他人遇到这个错误吗(我没有使用 VPN)?这只发生在 Gemini 示例中。

·

您好 @Nirav-Madhani - 我不确定。我看看。同时,您可以随时克隆并在本地运行。

如果您能添加一个 Azure OpenAI-API 的示例就太酷了。

您好 @MechanicCoder - 如果您愿意,请随意在此处添加示例。这应该很简单——拿这篇博客文章中的示例,并将 LLM 替换为您喜欢的 Azure 上的 LLM 的 API 调用。

·

嘿,我有一个可以工作的示例……我应该给您发一个 repo 链接吗?

我可以连接 FreeSWITCH 之类的东西并让它的 RTC 直接由 fastRTC 解析吗?

·

我自己没有尝试过,但我想可以。FastRTC 服务器是完全开放的,因此您可以与任何电话/WebRTC 客户端集成。

请提交一个 PR 来添加如何实现此操作的指南:https://github.com/freddyaboulton/fastrtc/blob/main/docs/userguide/audio.md

也欢迎加入 HF Discord 并在 fastrtc 频道提问:https://discord.gg/TSWU7HyaYu

你好,我是 WebRTC 应用程序的新手,我主要的问题之一是:音频捕获过程是如何工作的?我的意思是,在演示中,您总是直接从麦克风获取音频,但我想知道是否可以从特定端口获取输入音频(例如,接收 RTP 数据包的监听端口)。我想我需要更好地了解 WebRTC 通信的工作原理……谢谢!

·

您能多告诉我一些关于用例的信息吗 @JuanRoyo ?WebRTC 需要在两个客户端之间进行“握手”。这个握手由 FastRTC 服务器的 webrtc/offer 路由负责。所以您只需在那里发送一个 POST 请求。请参阅此 js 代码片段:

https://fastrtc.org/userguide/api/

注册登录 以评论