Turn every WordPress post into a narrated audio version
A studio your content team opens after publishing to clean up the script, pick a voice, and ship a listenable version of every post.
Build me an audio version studio that my content team opens whenever we publish, so every blog post gets a listenable version without anyone touching recording gear. The people using this are writers and editors, not developers, so the app should read like a production tool: a queue of work, a script to clean up, a voice to pick, and an approve button that ships it.
The home screen is the queue. Pull posts from WordPress with List Posts, filtered by status and date range, defaulting to published posts from the last 90 days. Each row shows the title, publish date, approximate word count, and a badge marking whether narration has already shipped for that post. Give it three tabs: Needs audio (published posts with no approved take, oldest first so the backlog actually gets worked through), All posts, and Shipped. Add a title search box. The badge and the Needs audio tab are driven by the app's own records rather than anything stored in WordPress, matched on the WordPress post ID.
Opening a post loads its full body with Retrieve a Post and drops it into an editable script pane, with the original post rendered read-only beside it for reference. On first open, auto-clean the text: strip HTML tags and shortcodes, remove image captions and figure text, drop navigational furniture like Read more links, and collapse leftover whitespace. From there the team edits by hand, which is the part that matters most: trimming the intro, respelling names and product terms so they are pronounced correctly, and expanding abbreviations that would otherwise be read out letter by letter. Every save creates a new script version with a timestamp and the person who saved it, so nothing is lost and you can always see what shipped.
Split the script into sections, either on headings or on a manual split marker the editor can insert. Each section shows its own character count and can be narrated on its own, so fixing one paragraph does not mean re-narrating a 2,000 word post while you are still iterating.
Above the Generate button, show a voice picker listing the Deepgram Aura voices with a short descriptor for each, the live character count for the whole script and for the selected section, and an estimated cost for the generation. Work the estimate out as characters multiplied by a per-million-character rate stored in app settings, so an admin can keep it accurate as pricing changes, and always show it before the team spends anything.
Generate sends the edited script, or a single section, to Deepgram Text to Speech. Keep every generation as a take and never overwrite one. A take records the voice and model used, the script version it came from, the character count, the estimated cost, who requested it, when, and the x-request-id from the response for support tickets. Render the takes as a list with inline audio players so the team can play two voices back to back and pick one. Section takes exist for auditioning and fixing; once the script reads the way they want, a Render full narration action produces the single continuous file that actually ships.
Approve on a take uploads that audio file to Cloudinary with Upload Asset, then builds a player embed pointing at the returned secure URL and writes it into the post with WordPress Update a Post, placed at the very top of the content so readers meet a play button before they start reading. Wrap the embed in a recognisable container so that approving a second take replaces the existing player instead of stacking another one on top. Record the approval in the post's history: voice, model, script version, hosted URL, who approved it, and when. That history is what powers the badge back on the queue.
A few integration details worth getting right. Deepgram authenticates with an Authorization header using the literal word Token rather than Bearer, and a Bearer prefix will fail with a 401. The speak endpoint accepts either plain text or a JSON body, and voice, model, and encoding are all query string parameters. It responds with raw audio bytes rather than JSON, with the response Content-Type matching the requested encoding and defaulting to mp3, so handle and store the response as binary rather than stuffing base64 into a record. On the Cloudinary side, audio uploads go up under the video or raw resource type. WordPress post bodies are HTML, which is why the script needs cleaning before narration and why the player goes back in as an HTML block.
What does this prompt do?
- Lists your published posts with a badge showing which ones already have audio, plus a queue of everything still waiting so the team can work through the backlog
- Opens each post in an editable script pane where you trim the intro, fix name pronunciations, and drop image captions before anything gets narrated
- Generates narration in the voice you pick, keeps every take so you can compare voices, and shows the character count and estimated cost before you spend anything
- Publishes the take you approve to your media library and drops a play button at the top of the post, then records which voice and script version shipped
What do I need to use this?
- A WordPress site where your team can view and edit posts
- A Deepgram account, which supplies the voices
- A Cloudinary account to host the finished audio files
- No microphones, recording software, or voice talent
How can I customize it?
- Change which posts land in the queue by status, date range, or category
- Swap the default voice, or narrow the picker to a shortlist your brand has approved
- Set the rate used for cost estimates, and choose whether the player sits at the top or the bottom of the post
FAQs
Do we need recording gear or a voice actor?
Will this work with a self-hosted WordPress site?
How much does it cost to narrate one post?
Can we hear a few voices before committing to one?
What happens to the audio once we approve it?
Do we have to re-narrate the whole post if we change one paragraph?
Related templates
Replace the monthly decay spreadsheet with a live board of pages losing search traffic, moving each one from spotted to refreshed and monitored.
One screen showing every published post, the languages it exists in, and which translations fell behind after the English was edited.
Pull every page on your site into one ranked table, see what is thin or broken, and hand your team a ready-to-edit draft without anything going live.
Pull this week's call recordings into one board, score every rep against the same rubric, and see at a glance who still needs a review.
See every interview still missing a writeup, listen back to what the candidate actually said, and file the feedback before you forget it.
Let your whole team search, preview and grab approved images and video from your Cloudinary library without asking a designer for links.
Give every post a play button.
Set the studio up once and your team can work through the entire back catalogue without booking a single recording session.