Copertina: FastRTC: streaming audio e video in tempo reale direttamente in Python

FastRTC: streaming audio e video in tempo reale direttamente in Python

La libreria open-source del team Gradio che trasforma qualsiasi funzione Python in un flusso WebRTC o WebSocket a bassa latenza.

29 luglio 20266 min di lettura
FastRTCWebRTC Pythonagenti vocaliFastAPI streamingtext-to-speechspeech-to-textopen sourceGradio

Cos'è FastRTC

FastRTC è una libreria Python open-source, distribuita con licenza Apache-2.0 e sviluppata dal team di Gradio (Hugging Face), che si propone di risolvere uno dei problemi storicamente più ostici dello sviluppo web: portare audio e video in tempo reale dentro un'applicazione Python senza diventare esperti di telecomunicazioni. Il tagline ufficiale è piuttosto chiaro: "trasforma qualsiasi funzione Python in uno stream audio e video in tempo reale via WebRTC o WebSocket".

Il punto di forza sta nella filosofia: invece di chiedervi di installare e amministrare un media server dedicato (SFU, MCU, TURN/STUN configurati a mano), FastRTC incapsula la complessità di WebRTC — negoziazione SDP, ICE, gestione delle tracce, chunking dell'audio — dentro un'astrazione minima. Voi scrivete una funzione Python che riceve un array NumPy con l'audio dell'utente e restituisce un generatore con l'audio di risposta; la libreria fa tutto il resto. Il repository è gradio-app/fastrtc su GitHub, la documentazione ufficiale è su fastrtc.org e il pacchetto si installa da PyPI con pip install fastrtc.

A cosa serve

Il caso d'uso più frequente è la costruzione di agenti vocali e interfacce conversazionali a bassa latenza: assistenti che ascoltano, trascrivono, ragionano e rispondono a voce in tempo quasi reale. Ma il perimetro è più ampio:

  • Chat vocali voice-to-voice: pipeline complete STT → LLM → TTS dove l'utente parla dal browser e riceve una risposta parlata.
  • Trascrizione in tempo reale: stream verso modelli tipo Whisper per dettatura live.
  • Elaborazione video in tempo reale: object detection (ad esempio con YOLO) sul flusso webcam dell'utente, filtri, trasformazioni frame-by-frame.
  • Prototipi dimostrativi: grazie all'integrazione con Gradio, si può lanciare un'interfaccia web funzionante con un solo metodo.
  • Integrazione telefonica: il metodo fastphone() fornisce un numero di telefono temporaneo per chiamare il proprio stream, utile per test rapidi di centralini vocali.

Per una PMI o un'agenzia italiana, tradotto in pratica: un centralino vocale intelligente per il customer care, un assistente vocale dentro una dashboard gestionale, un prototipo di "parla col documento" per un cliente, o un sistema di monitoraggio video con rilevamento oggetti in diretta. Tutto senza dipendere da piattaforme SaaS esterne a consumo.

Come funziona

L'architettura ruota attorno a tre concetti: la classe Stream, gli handler e le modalità di deployment.

La classe Stream. È l'oggetto centrale: accetta un handler, una modalità (audio, video o audio-video) e un mode (send-receive per flussi bidirezionali, receive-only per sola ricezione). Lo stream gestisce la negoziazione WebRTC con il browser e instrada i dati verso la vostra logica.

Gli handler. L'handler più importante è ReplyOnPause: incorpora un modello di Voice Activity Detection (VAD) che rileva quando l'utente smette di parlare e solo a quel punto invoca la vostra funzione di risposta, gestendo automaticamente i turni della conversazione. La funzione riceve una tupla (sample_rate, array_numpy) e deve restituire un generatore che produce chunk audio. Questo design a generatori permette lo streaming della risposta: il TTS può iniziare a parlare prima che il testo completo sia pronto, abbattendo la latenza percepita.

Gli extra opzionali. Installando fastrtc[vad, stt, tts] si ottengono plugin pronti per modelli di speech-to-text, text-to-speech e turn-taking, con una galleria di modelli intercambiabili. La scelta dei modelli resta libera: si possono usare API cloud (OpenAI, ElevenLabs, Anthropic, Google Gemini) oppure modelli locali self-hosted, il che conta molto per chi ha vincoli di privacy o vuole contenere i costi.

Le tre modalità di deployment:

  1. stream.ui.launch() — avvia un'interfaccia Gradio integrata, perfetta per prototipare e testare.
  2. stream.mount(app) — monta lo stream su un'applicazione FastAPI esistente, esponendo endpoint WebRTC e WebSocket. È la modalità da produzione: il vostro frontend React, Vue o vanilla JS si connette a questi endpoint, e la libreria fornisce anche esempi completi di client Next.js nella cartella demo del repository.
  3. stream.fastphone() — espone lo stream via telefono con un numero temporaneo gratuito (richiede un token Hugging Face).

Un esempio minimo, giusto per dare la misura della semplicità:

from fastrtc import Stream, ReplyOnPause

def echo(audio):
    # audio è una tupla (sample_rate, np.ndarray)
    yield audio  # risponde con lo stesso audio

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

Da qui a un agente vocale vero il passo è sostituire l'echo con una catena STT → LLM → TTS, come mostrano le numerose demo nel Cookbook ufficiale: conversazioni con Claude, GPT, Gemini, Moshi, trascrizione Whisper in tempo reale, code editor comandati a voce.

Perché conta

Abbatte la barriera d'ingresso al real-time. WebRTC è notoriamente complesso: fino a ieri, per aggiungere voce in tempo reale a un'app Python serviva un media server esterno (LiveKit, Janus, Jitsi) oppure settimane di studio. FastRTC riduce il tutto a una dipendenza pip e una route FastAPI. Per team piccoli — il tessuto tipico delle PMI e delle software house italiane — la differenza tra "progetto da un trimestre" e "prototipo in un pomeriggio" è decisiva.

Si integra con lo stack esistente invece di sostituirlo. Essendo una libreria e non una piattaforma, si inserisce nel backend che già avete: autenticazione, logging, database e business logic restano dove sono. Lo stream è solo un endpoint in più.

È agnostica rispetto ai modelli. A differenza delle API vocali "chiavi in mano" dei grandi provider, FastRTC non vi lega a nessun modello: potete combinare STT e TTS cloud per la qualità massima, oppure modelli open-source locali (Whisper, Kokoro e simili) per la sovranità dei dati — un tema sensibile in ambito GDPR quando l'audio dei clienti contiene dati personali.

Ha un ecosistema solido alle spalle. Essendo mantenuta dal team Gradio/Hugging Face, la libreria beneficia di una comunità ampia, di demo pronte all'uso e di un'evoluzione rapida. La licenza Apache-2.0 consente l'uso commerciale senza vincoli.

Attenzione ai limiti. FastRTC è pensata per sessioni punto-punto (un utente, uno stream): non è un SFU e non scala a stanze con decine di partecipanti; per videoconferenze multi-party servono soluzioni come LiveKit. Inoltre, in produzione su internet serviranno comunque server TURN per attraversare NAT restrittivi e HTTPS obbligatorio (WebRTC lo richiede). Infine, essendo una libreria giovane, l'API può evolvere: conviene fissare le versioni nelle dipendenze.

Dove trovarlo

  • Repository GitHub: github.com/gradio-app/fastrtc (licenza Apache-2.0)
  • Documentazione: fastrtc.org, con user guide e Cookbook di esempi completi
  • Pacchetto: PyPI, pip install fastrtc (extra consigliati: pip install "fastrtc[vad,tts]")
  • Demo live: spazi Hugging Face sotto l'organizzazione fastrtc, tra cui Talk to Claude, Talk to Gemini e la chat vocale Next.js

Il consiglio pratico: partite dall'esempio "LLM Voice Chat" del Cookbook, montatelo su una FastAPI di test con stream.mount(app) e collegate i vostri modelli STT/TTS preferiti. In un'ora avrete un assistente vocale funzionante nel browser, e da lì valutare se portarlo in produzione diventa una decisione informata invece che un salto nel buio.

Hai letto fino a qui

🤔 Hai domande su questo argomento?

Posso aiutarti a capire come applicarlo al tuo business. Scegli come vuoi parlarmi.

— oppure —

💬 Chat: risposta immediata · 📧 Email: risposta personale entro 24h · 🔒 Niente spam

Continua a leggere