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
!