A spirit box, debugged.

A spirit box sweeps across radio stations so quickly that only fragments of speech get through, and believers hear the dead in the gaps. This one hops nine live internet radio stations, plays a two-second snippet from each, and hands exactly what you heard to two language models to transcribe and translate. Every step is logged below, so you can watch precisely how little of it is supernatural.

Eidolon

Think of a question. Hold it in your mind.
When you are ready, invoke the spirits.

sound on · then ask them what they said

-- not tuned in --

    Transcript

    Everything played since the previous transcript, sent as one clip.

    Tune in, listen for a while, then press transcript.

    Behind the scenes

    Every step the page and server take, as it happens: connections, snippet picks, playback, model calls with their prompts, token counts and the cost OpenRouter reports.

    Mostly for fun

    This is a Halloween toy and an excuse to learn something, nothing more. The models transcribe whatever the radio actually said, and speech-to-text models are famous for inventing confident words out of noise, which happens to be exactly the property a spirit box wants. If the dead really are reaching out through internet radio, they are fighting the same battles I was: a TLS handshake per station, a CORS policy written by the living, and a two-second burst of stale buffer every time they reconnect. One assumes the afterlife has better retry logic.

    Internet radio is not a radio

    The original Eidolon is a command-line tool that drives real radio hardware. Retuning a software-defined radio is nearly instant and the audio is live. An internet station is an HTTP stream instead, and getting a few seconds of it means DNS, a TLS handshake and the server’s burst-on-connect: Icecast and StreamTheWorld servers send every new listener several seconds of pre-buffered audio so playback starts smoothly. Reconnect on every hop and you replay that catch-up burst each time; measured, it inflated the audio to about 3.5× real time. What the web version does instead:

    The hardware version: RTL-SDR Blog V4

    The command-line version listens through an RTL-SDR Blog V4, an inexpensive USB software-defined radio built on the RTL2832U, a chip originally made for digital TV dongles, and an R828D tuner. The V4 adds a 1 PPM temperature-compensated oscillator, a built-in HF upconverter, a bias tee and an aluminium case. Eidolon hops the US FM grid (odd tenths from 88.1 MHz, 200 kHz apart) and favours frequencies where an rtl_power scan found real stations, with some purely random hops kept for static. A web page can’t reach a USB radio on a stranger’s desk, hence internet radio here.

    Models, tokens and cost

    Speech-to-text is mistralai/voxtral-mini-transcribe through OpenRouter, chosen for latency over Whisper-class models, at $0.003 per minute of audio. It doesn’t translate, and most of these stations aren’t in English, so a second call sends the transcript to openai/gpt-4o-mini with a one-paragraph system prompt ($0.15 per million input tokens, $0.60 per million output). A typical 30-second transcript costs about $0.0015 to transcribe and $0.00005 to translate, roughly 650 transcripts per dollar. The log above shows the exact token counts and cost OpenRouter reports for each request. Transcription is limited to ten requests a minute per visitor, which is all the protection the budget needs.