FastRTC: Python 实时通信库
在过去的几个月里,许多新的实时语音模型已经发布,并且围绕开源和闭源模型成立了多家公司。举几个里程碑:
- 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 Base,get_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
!