Title: Codeep Voice: Text to Speech MP3 for Posts
Author: sdsoftware
Published: <strong>October 8, 2026</strong>
Last modified: October 11, 2026

---

Search plugins

![](https://ps.w.org/codeep-voice-for-posts/assets/banner-772x250.png?rev=3734359)

![](https://ps.w.org/codeep-voice-for-posts/assets/icon-256x256.png?rev=3734359)

# Codeep Voice: Text to Speech MP3 for Posts

 By [sdsoftware](https://profiles.wordpress.org/sdsoftware/)

[Download](https://downloads.wordpress.org/plugin/codeep-voice-for-posts.0.5.0.zip)

 * [Details](https://mri.wordpress.org/plugins/codeep-voice-for-posts/#description)
 * [Reviews](https://mri.wordpress.org/plugins/codeep-voice-for-posts/#reviews)
 *  [Installation](https://mri.wordpress.org/plugins/codeep-voice-for-posts/#installation)
 * [Development](https://mri.wordpress.org/plugins/codeep-voice-for-posts/#developers)

 [Support](https://wordpress.org/support/plugin/codeep-voice-for-posts/)

## 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,
    
   in `assets/js/vendor/phonemizer.js` and 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

[⌊The player on a published post: what your readers see.⌉⌊The player on a published
post: what your readers see.⌉[

The player on a published post: what your readers see.

[⌊The voicing screen: what your computer can do, what the one download costs, and
every post with its state.⌉⌊The voicing screen: what your computer can do, what 
the one download costs, and every post with its state.⌉[

The voicing screen: what your computer can do, what the one download costs, and 
every post with its state.

[⌊Voicing in progress: the number of chunks, the estimate, and the time left.⌉⌊Voicing
in progress: the number of chunks, the estimate, and the time left.⌉[

Voicing in progress: the number of chunks, the estimate, and the time left.

[⌊The MP3 in the Media Library, attached to the post.⌉⌊The MP3 in the Media Library,
attached to the post.⌉[

The MP3 in the Media Library, attached to the post.

[⌊Settings, all of them.⌉⌊Settings, all of them.⌉[

Settings, all of them.

## Installation

 1. Upload the plugin through **Plugins  Add New  Upload**, or copy the folder to `
    wp-content/plugins/`.
 2. Activate it.
 3. Go to **Codeep Voice** in the admin menu.
 4. Press **Prepare the voice** once. The model downloads and stays in your browser.
 5. 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.

Contributors

 *   [ sdsoftware ](https://profiles.wordpress.org/sdsoftware/)
 *   [ vladimirgrigoryan ](https://profiles.wordpress.org/vladimirgrigoryan/)

[Translate “Codeep Voice: Text to Speech MP3 for Posts” into your language.](https://translate.wordpress.org/projects/wp-plugins/codeep-voice-for-posts)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/codeep-voice-for-posts/),
check out the [SVN repository](https://plugins.svn.wordpress.org/codeep-voice-for-posts/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/codeep-voice-for-posts/)
by [RSS](https://plugins.trac.wordpress.org/log/codeep-voice-for-posts/?limit=100&mode=stop_on_copy&format=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_attributes` filter, and two
    editor
   events, `codeep-voice:voice-now` and `codeep-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.

## Meta

 *  Version **0.5.0**
 *  Last updated **3 days ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.0 or higher **
 *  Tested up to **7.1.3**
 *  PHP version ** 7.4 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/codeep-voice-for-posts/)
 * Tags
 * [accessibility](https://mri.wordpress.org/plugins/tags/accessibility/)[podcast](https://mri.wordpress.org/plugins/tags/podcast/)
   [text to audio](https://mri.wordpress.org/plugins/tags/text-to-audio/)[text to speech](https://mri.wordpress.org/plugins/tags/text-to-speech/)
   [tts](https://mri.wordpress.org/plugins/tags/tts/)
 *  [Advanced View](https://mri.wordpress.org/plugins/codeep-voice-for-posts/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/codeep-voice-for-posts/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/codeep-voice-for-posts/reviews/)

## Contributors

 *   [ sdsoftware ](https://profiles.wordpress.org/sdsoftware/)
 *   [ vladimirgrigoryan ](https://profiles.wordpress.org/vladimirgrigoryan/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/codeep-voice-for-posts/)