Description
Codeep Voice for Posts turns a post into an audio file. You open the plugin’s
screen in your admin, pick a post and press a button. Your own browser generates
the speech, and the finished recording is saved to your media library as an
ordinary MP3, attached to that post. A small player then appears on the post for
your readers.
The speech is produced by a model that runs on your computer, inside the admin
screen. The plugin has no server of its own. There is no account to create, no
API key to paste and nothing that counts your usage, and your post text is not
uploaded anywhere.
Hear it before you install
Two recordings of the same sentence, one made by this plugin and one by the
speech voice built into your browser, are on the plugin page:
https://sdsoftware.io/codeep-voice-for-posts/
What you get
- A real MP3 file in your media library, attached to the post
- Nine voices: Heart, Bella, Nicole and Sarah; Michael and Adam, American; Emma and George, British; and Amy, American, fast on a computer with no graphics card
- A player on the post, under 12 KB, which takes its colours from your theme
- A download button in that player, so a reader can keep the file
- Your readers download the MP3 and nothing else: no model, no engine, no waiting
Because the file is a plain MP3 in your media library, you can do anything you
would do with any other upload: download it, put it in a podcast feed, serve it
from a CDN, or hand it to someone.
How it works
The voice model is downloaded once and then lives in your browser. When you press the button, your own computer generates the audio, the plugin saves it as an MP3 attachment, and your visitors simply get that file.
Visitors download nothing but the MP3 itself. No model, no engine, no WebGPU on their side.
Honest about speed
The voice is generated on your own computer, so the speed is your computer’s speed, and it depends on how long the post is.
On a machine with graphics acceleration it is quick. Without acceleration it still works, it just takes considerably longer on a long article.
The plugin measures your computer and shows an estimate for that specific post before you start, so you know what you are in for. Either way you only do it once per post, and the file stays for good.
You can also find out before installing anything. This page downloads the same
voice and times one sentence on your own machine:
https://sdsoftware.io/check/
What this plugin does not claim
It does not make your site compliant with any accessibility standard. WCAG does not require that article text be read aloud, so an audio version is a convenience for your readers rather than a compliance measure. A good convenience, but a convenience.
External services
This plugin downloads a text-to-speech model the first time you use it. Nothing is sent out: the transfer is one-way, into your browser.
- Hugging Face (
huggingface.co) hosts the Kokoro-82M model files, licensed Apache-2.0. Downloaded once, when you press Prepare the voice, and then cached in your browser. Your post text is never uploaded. Terms: https://huggingface.co/terms-of-service Privacy: https://huggingface.co/privacy - Hugging Face (
huggingface.co) also hosts the Piper voice files, licensed MIT, used by the voice named “Amy, American, fast on any computer”. The same one-way download applies: it happens once, when you press Prepare the voice with that voice selected, and the file is then cached in your browser. Which file is downloaded depends on the voice you choose, and its size is shown on the screen before you start. Terms: https://huggingface.co/terms-of-service Privacy: https://huggingface.co/privacy
No account, API key or registration is required for any of this, and no data about you or your visitors is sent anywhere.
Third-party libraries
The plugin carries the code it needs instead of pulling it from a CDN. That is
what makes it work offline, and it means shipping other people’s work. Licences
are included in assets/js/vendor/licenses/.
- kokoro-js 1.2.1, Apache-2.0: the voice model runner
- @huggingface/transformers 3.8.1, Apache-2.0: inside the same bundle
- onnxruntime-web 1.22, MIT: the WebAssembly runtime in
assets/wasm/,
assets/js/vendor/ort.js and part of the same bundle - phonemizer 1.2.1, Apache-2.0: turns text into the sounds a voice reads,
inassets/js/vendor/phonemizer.jsand inside the same bundle - espeak-ng, GPL-3.0-or-later: the pronunciation rules phonemizer is built
on. It ships inside phonemizer rather than as a package of its own - @breezystack/lamejs 1.2.7, LGPL-3.0: MP3 encoding
Two of those licences are the reason this plugin is GPLv2 or later rather
than GPLv2 only: espeak-ng under GPL-3.0 and lamejs under LGPL-3.0. Both are
compatible through the “or later” clause, and neither would be without it.
espeak-ng is easy to miss, so it is named here on purpose: it appears in no
package.json. It arrives inside phonemizer, which arrives inside kokoro-js,
and all three end up compiled into one file.
The voice model itself (Kokoro-82M, Apache-2.0) is not bundled. It is
downloaded from Hugging Face on first use, as described above.
Screenshots





Installation
- Upload the plugin through Plugins Add New Upload, or copy the folder to
wp-content/plugins/. - Activate it.
- Go to Codeep Voice in the admin menu.
- Press Prepare the voice once. The model downloads and stays in your browser.
- Pick a post and press Voice it.
The MP3 lands in your Media Library and the player appears on the post automatically.
FAQ
-
Do my visitors download the voice model?
-
No. They download the MP3 and a player under 12 KB. The model only ever runs in your admin screen, on your computer.
-
Does my post text get sent anywhere?
-
No. The text is turned into audio inside your browser. There is no server of ours involved at any point.
-
What does it need to run?
-
A reasonably current browser in your admin. Graphics acceleration makes it much faster but is not required. Without it the plugin still works, just slower.
-
Can I close the tab while it is working?
-
You can stop and come back. Progress is saved after every chunk, so reopening the screen continues from where it left off rather than starting over. Do not close the tab mid-run if you can help it, because leaving it open is faster.
-
I changed the voice in settings but my posts sound the same
-
Changing the setting does not rewrite audio that already exists. The posts list shows which voice each post was made with; press Voice it again on the ones you want switched.
-
I edited a post. What happens to the audio?
-
The post is marked Out of date in the list. The old file keeps playing and is not deleted until you make a new one, so your readers never hit a dead player.
-
Can I change how the player looks?
-
Yes, with CSS, and nothing in the plugin needs editing. The player uses a shadow root so your theme cannot break it and it cannot break your theme. Style it from outside with custom properties:
.entry-content { --codeep-voice-accent: #7c3aed; --codeep-voice-line: #e9d5ff; --codeep-voice-background: #faf5ff; --codeep-voice-box-radius: 10px; --codeep-voice-padding: .9em 1em; }Or with
::part()for full control:codeep-voice-player::part(title) { font-weight: 700; } codeep-voice-player::part(button) { background: #7c3aed; color: #fff; }Available parts:
box,play,rate,button,title,seek,time,download. Font and text colour are inherited from your theme automatically. -
Where does the player show up?
-
Before the post by default. You can move it after the post, or turn automatic placement off entirely and put the
[codeep_voice]shortcode exactly where you want it. -
Some parts of my post are not read. Why?
-
Code, tables, images, embedded videos and form fields are skipped on purpose: read aloud they make no sense. A table gets a short “A table follows” instead. The voicing screen lists everything that will be skipped, under the estimate, before you start. Image captions can be turned on in Settings.
-
Which languages are supported?
-
The voice model reads English. The plugin interface itself follows your site language.
-
Does it work on a phone?
-
The player does, for your readers. Generating audio on a phone is not recommended. Do that on a desktop.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Codeep Voice: Text to Speech MP3 for Posts” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Codeep Voice: Text to Speech MP3 for Posts” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
0.5.0
- The player is no longer shown on password-protected or private posts,
including when it is added to another post with the shortcode. - The Voice button in the editor now reads the post as it was last saved,
so a change made just before voicing is never left out. - While voicing, the plugin now records when each sentence starts and ends
in the audio, so the text on the page can follow the voice. If a security
plugin or the server rejects this extra data, the audio is still saved. - The daily cleanup of leftover audio files now works through the whole
media library, 100 files at a time, and continues where it stopped. Only
one cleanup runs at a time, and files younger than a day are left alone. - When the same post is voiced in two tabs at once, the audio saved last is
kept, and only the file it replaced is removed. - For developers: a new
codeep_voice_player_attributesfilter, and two
editor events,codeep-voice:voice-nowandcodeep-voice:voice-status.
0.4.2
- Stop now works when the voice runs on the processor instead of the
graphics card, and always for the Amy voice. Before, the screen said
“stopping” but voicing went on to the end of the post. - Leftover audio files are cleaned up in two more cases: when the upload
worked but the browser never got the answer, and when two tabs voice the
same post at the same time. Each uploaded file is marked for its post
before it is attached, and a daily cleanup removes marked files that were
never attached. Only files the plugin made are ever removed.
0.4.1
- After you stop a post halfway, the button says Continue, and a post
left unfinished shows how much is already done. - The settings screen says “Settings saved.” after you save.
0.4.0
- The voicing screen now lists what will not be read aloud (code, tables,
images, captions, embeds), under the estimate, before you start. - Post titles on the voicing screen open the post in the editor in a new
tab, and the screen scrolls to the voicing panel after you pick a post. - Image captions are read when that setting is on. Before, captions in
WordPress image blocks were skipped even with the setting on, and tables
from the block editor did not get their “A table follows”. - If the upload works but attaching the file to the post fails, the
uploaded file is removed instead of being left in the media library. - If the voice chosen in Settings is no longer available, for example
because the add-on that provided it is switched off, the default voice is
used and the screen says so, instead of failing with “Voice not found”. - The Amy voice is now kept in the browser like the main voice, so it works
offline after the first download. - Clear messages when the voice cannot be downloaded, when the browser has
no room to keep it, and when it cannot save progress. - The screen no longer waits forever if the voice engine fails to start.
- The Stop button no longer shows before voicing has started.
0.3.2
- After three of your posts have audio, the plugin’s own screen asks once
for a review on WordPress.org. One click on either button and it never
asks again. It never appears on any other admin page.
0.3.1
- The name in the plugin directory now says what the plugin does:
Codeep Voice: Text to Speech MP3 for Posts. No code changed.
0.3.0
- A second voice engine, Piper. The new voice “Amy, American, fast on any
computer” needs no graphics acceleration and is many times faster than the
existing voices on a plain processor. Pick it in Settings; everything else
works exactly as before. - Smaller download: the plugin now carries one ONNX runtime instead of two.
0.2.0
- Extension points for add-ons: the voice list, the data passed to the admin
screen and the moment an MP3 is attached to a post can now be filtered or
hooked by other plugins. Nothing changes for anyone who does not use them.
0.1.0
- First release.
