WRIT-FM is a 24/7 talk radio station where Claude generates all spoken content. Live at radio.khy.io, source at github.com/keltokhy/wvoid-fm. Technical breakdown: The system splits cleanly into two layers: AI generation and deterministic plumbing. Claude CLI (claude -p) receives persona prompts for 5 distinct hosts — each defined with identity, voice style, philosophy, and explicit anti-patterns (things the host would never say). It generates 1,500-3,000 word scripts for 7 segment types: deep dives, simulated interviews, panel discussions (two AI hosts debating), news analysis (fed real RSS headlines), stories, music essays, and listener mailbag. Kokoro TTS renders scripts to audio, chunking long segments at sentence boundaries and concatenating via ffmpeg. The streamer (stream_gapless.py) is pure heuristic — no AI at runtime. It resolves the active show from a schedule.yaml lookup (8 shows across the week), plays talk segments from a per-show queue, inserts AI-generated music bumpers (ACE-Step) between them, and deletes segments after playing. Daemon scripts poll segment counts and trigger generation when inventory drops below threshold. Play history in SQLite prevents repeats within a 4-hour window. Architecture: single Python process pipes decoded PCM through a persistent ffmpeg encoder to Icecast. The API server runs as a daemon thread in the same process. A bash CLI (writ) manages all components via tmux sessions. Limitations: TTS quality is the bottleneck — Kokoro is fast but occasionally stumbles on unusual phrasing. Multi-voice segments (panels, interviews) have noticeable speaker transitions. Claude sometimes generates scripts that are too short and get rejected by the word-count quality gate, requiring a retry. Music bumpers from ACE-Step vary wildly in quality. Lessons: keeping AI out of the runtime loop was the key design decision. Pre-generating content into filesystem queues that the streamer consumes means the stream never stalls waiting for an API call. The persona anti-patterns (explicit “NEVER do X” lists) matter more than the positive identity prompts for keeping hosts consistent. Stack: Python, ffmpeg, Icecast, Claude CLI, Kokoro TTS, ACE-Step. Runs on a Mac Mini. Repo: github.com/keltokhy/writ-fm Listen: https://www.khaledeltokhy.com/claude-show (free, nothing to sign up for) submitted by /u/eltokh7
Originally posted by u/eltokh7 on r/ArtificialInteligence
