A daily podcast feed, localized in seven languages

Role
Solo build
Year
2025
Stack
Python · Whisper · Azure Translator · Azure Speech (TTS) · LaunchAgent
Outcome
Shipped a self-running pipeline that delivers a translated podcast to my iPhone every morning, in whichever language the day calls for — running for under $0/month on free tiers.

The premise

I keep nine languages alive at once. Reading and conversation are easy to schedule around; listening was always the hole. Learner content is too dull, and curating a fresh feed in seven languages by hand isn't a thing a working person does for long.

What I actually wanted was the podcasts I already listen to in English — but in the language I'd assigned to that day of the week. So I built it.

github.com/accipio09/rss-podcast-translator

Stack

  • Ingest: RSS pull via feedparser, episode download with a small LRU cache so I'm not re-pulling the same audio on retries.
  • Transcription: OpenAI Whisper, running locally. No API, no per-minute bill.
  • Translation: Azure Translator (2M chars/month on the free tier).
  • Voice: Azure Neural TTS, with a hand-picked voice pinned per language.
  • Schedule: A macOS LaunchAgent fires the pipeline at 9am. Mondays land in German, Tuesdays Russian, Wednesdays Japanese, and so on through the week.
  • Delivery: Output files drop into an iCloud Drive folder that my phone treats as a podcast source. By the time I'm on the bus, the episode is on the device.

What was hard

  • Cost discipline. The obvious path was OpenAI for everything plus ElevenLabs for voices, and the math didn't work for a daily personal feed. Pushing transcription onto local Whisper and keeping translation + TTS inside Azure's free tiers got the running bill to roughly zero — which is the only price point at which a personal tool survives the second month.
  • The sync. Getting audio onto an iPhone without going through the App Store meant treating iCloud Drive as a transport layer. It works, but every link in the chain — filename, container format, metadata, folder location — has to be exactly right or iOS silently drops the file. Most of the debugging time on this project went there, not into the models.
  • Voices. Default neural voices vary wildly across languages. Some are warm and listenable; some are unusable at any length. Pinning a specific voice per language — and re-auditioning when Azure rotates their catalog — was the difference between I use this every day and I built it once and never opened it again.
  • Schedule drift. A LaunchAgent that runs every morning will, at some point, run when the laptop is closed, when the network is down, or when Azure throttles you mid-job. The pipeline had to be idempotent and resumable; "re-run tomorrow and it heals itself" was the design rule.

Notes

The interesting part of a system like this isn't the AI. It's the integration spine — the joins between RSS, a local model, two cloud APIs, the macOS scheduler, and the iPhone. Most of the bugs live in those joins, and almost none of them are model-level problems.