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/

註冊登入 以評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.