Narrate every new Ghost blog post into an audio edition
Every hour, Geni finds your newest Ghost posts, narrates them in a consistent ElevenLabs voice, saves the MP3 to Google Drive, and announces the audio edition in Slack.
Integrations
Ghost
ElevenLabs
Google Drive
Slack Bot
Type
Categories
- Marketing
- Operations
Every hour, find Ghost blog posts that were published since the last run and turn each one into a narrated MP3 audio edition that my readers can listen to alongside the written post.
Trigger: cron, every hour.
Step 1 — Find new posts. Use Ghost Browse Posts (Admin API), filtered to status:published and published_at greater than the last run, sorted oldest first so I work through them in order. For each post, also keep the title, slug, full HTML body, and published_at.
Step 2 — Skip posts already processed. Before narrating, call Google Drive List Files against the configured target folder and search for a file whose name starts with the post slug (for example name contains '<slug>' and '<folderId>' in parents and trashed = false). If a match exists, skip that post.
Step 3 — Clean the body for narration. Strip elements that do not narrate well: image captions and figure alt text, footnote markers, raw URLs, code fences and inline code, embed blocks, and obvious call-to-action / subscribe-now / 'read more' blocks. Keep the post title (read it once at the start) and the body prose. Decode HTML entities and collapse repeated whitespace.
Step 4 — Narrate with ElevenLabs Text to Speech. Use one configurable voice_id for every post so all audio editions sound like the same narrator, the eleven_multilingual_v2 model, and a single output_format (default mp3_44100_128). If the cleaned text is longer than about 9,000 characters, split it on sentence boundaries into chunks under that cap, call Text to Speech once per chunk keeping voice_id, model_id, and output_format identical across chunks, then concatenate the returned MP3 bytes in order so the final audio plays as one continuous track without audible seams.
Step 5 — Save to Google Drive. Upload the final MP3 to a configurable Google Drive folder using Upload File (Multipart). Name the file using the post slug (for example <slug>.mp3) so the dedupe check in Step 2 keeps working. Make the file shareable to anyone with the link and capture the shareable URL for the next step.
Step 6 — Announce in Slack. Use Slack Bot Send a Message to post into a configurable channel. The message should include the post title, the public Google Drive link to the audio, and a short ready-to-copy blurb (one or two sentences) the social team can paste straight into LinkedIn or X to announce the audio edition.
Configurable inputs: the Ghost site, the target Google Drive folder ID, the target Slack channel, the ElevenLabs voice ID, and optionally an override for the announcement blurb tone.
What it does
- Checks Ghost on the hour for blog posts published since the last run.
- Narrates the full post in a consistent voice, chunking long-form pieces so multi-thousand-word essays still sound seamless.
- Saves the finished MP3 to a Google Drive folder you choose, using the post slug as the filename.
- Posts a Slack message with the post title, a shareable Drive link, and a short copy-ready blurb your social team can use as the announcement.
What you’ll need
- A Ghost site with an admin login so the workflow can read your latest posts.
- An ElevenLabs account and a chosen voice you want every narration to use.
- A Google Drive folder where audio editions should land.
- A Slack workspace and the channel where the launch announcement should post.
How to customize it
- Swap the ElevenLabs voice, or change the narration style to match your brand tone.
- Point the workflow at a different Google Drive folder, or change the file naming pattern to include the publish date next to the slug.
- Change which Slack channel gets the announcement, or rewrite the blurb so it matches the way your team usually talks on social.
Use cases
- Content Generation
- Notifications & Alerts