Back to the CV

Radio Show

An autonomous radio DJ: an agent writes the script of a live show, voices it with text to speech and controls Spotify playback in each listener's own browser.

Live show panel with the transcript
Status
Self-hosted, in development

What it does

  • Plans the whole show as a running order, then writes each block live, one block ahead of what is playing.
  • Picks tracks on Spotify, rejecting karaoke versions and songs played too recently.
  • Voices each link with text to speech and lowers the music under the voice.
  • Remembers past shows: a short digest of recent plays, plus a history search the model calls when it needs it.

How it is built

  • Spotify delivers no audio through its API, so the backend produces and the browser directs: each listener plays the music with the Web Playback SDK and the voice is mixed locally with Web Audio.
  • The producer is a LangGraph graph with one thread per show, checkpointed in PostgreSQL, so a show survives an API restart. A rejected track is an edge back to the writing step.
  • FastAPI serves HTTP and a WebSocket. Voice clips wait in Redis and the next block is prepared while the current one plays.
  • Each listener uses their own OpenAI key, never shared, with a spending guard per show and tracing switched off.
  • A rewrite of a first version that polled Spotify every 200 ms. Message types are generated from the backend OpenAPI into TypeScript, so the two repositories share one contract.
Current block: script and track
Show history

Technologies

  • FastAPI
  • LangGraph
  • PostgreSQL
  • Redis
  • React
  • TypeScript
  • Spotify Web Playback SDK
  • OpenAI API
  • Web Audio