{"id":381192,"date":"2026-10-08T11:09:19","date_gmt":"2026-10-08T11:09:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sd-voice-for-posts\/"},"modified":"2026-10-08T12:50:52","modified_gmt":"2026-10-08T12:50:52","slug":"codeep-voice-for-posts","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/codeep-voice-for-posts\/","author":23577358,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.2","stable_tag":"0.3.2","tested":"7.1.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Codeep Voice: Text to Speech MP3 for Posts","header_author":"SD Software LLC","header_description":"Turn any post into a real MP3 with a human-sounding voice. The audio is made in your own browser and saved to your media library.","assets_banners_color":"eef1f4","last_updated":"2026-10-08 12:50:52","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/sdsoftware.io\/codeep-voice-for-posts\/","header_author_uri":"https:\/\/sdsoftware.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":102,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.3.0":{"tag":"0.3.0","author":"sdsoftware","date":"2026-10-08 11:31:48","revision":3734413},"0.3.1":{"tag":"0.3.1","author":"sdsoftware","date":"2026-10-08 11:58:21","revision":3734471},"0.3.2":{"tag":"0.3.2","author":"sdsoftware","date":"2026-10-08 12:50:52","revision":3734616}},"upgrade_notice":{"0.3.2":"<p>Nothing to do. Your existing audio files and settings are untouched.<\/p>","0.3.1":"<p>Nothing to do. Only the name and the short description changed.<\/p>","0.3.0":"<p>Nothing to do. Your existing audio files and settings are untouched.<\/p>","0.2.0":"<p>Nothing to do. This release only adds hooks for other plugins to use.<\/p>","0.1.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3734359,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3734359,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3734359,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3734359,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.3.0","0.3.1","0.3.2"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3734359,"resolution":"1","location":"assets","locale":"","width":1470,"height":774},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3734359,"resolution":"2","location":"assets","locale":"","width":1470,"height":742},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3734359,"resolution":"3","location":"assets","locale":"","width":1470,"height":672},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3734359,"resolution":"4","location":"assets","locale":"","width":1470,"height":560},"screenshot-5.jpg":{"filename":"screenshot-5.jpg","revision":3734359,"resolution":"5","location":"assets","locale":"","width":1470,"height":578}},"screenshots":{"1":"The player on a published post: what your readers see.","2":"The voicing screen: what your computer can do, what the one download costs, and every post with its state.","3":"Voicing in progress: the number of chunks, the estimate, and the time left.","4":"The MP3 in the Media Library, attached to the post.","5":"Settings, all of them."}},"plugin_section":[],"plugin_tags":[1953,238,53891,16722,1449],"plugin_category":[34,50,56],"plugin_contributors":[284994,284995],"plugin_business_model":[],"class_list":["post-381192","plugin","type-plugin","status-publish","hentry","plugin_tags-accessibility","plugin_tags-podcast","plugin_tags-text-to-audio","plugin_tags-text-to-speech","plugin_tags-tts","plugin_category-accessibility","plugin_category-media","plugin_category-social-and-sharing","plugin_contributors-sdsoftware","plugin_contributors-vladimirgrigoryan","plugin_committers-sdsoftware"],"banners":{"banner":"https:\/\/ps.w.org\/codeep-voice-for-posts\/assets\/banner-772x250.png?rev=3734359","banner_2x":"https:\/\/ps.w.org\/codeep-voice-for-posts\/assets\/banner-1544x500.png?rev=3734359","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/codeep-voice-for-posts\/assets\/icon-128x128.png?rev=3734359","icon_2x":"https:\/\/ps.w.org\/codeep-voice-for-posts\/assets\/icon-256x256.png?rev=3734359","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/codeep-voice-for-posts\/assets\/screenshot-1.jpg?rev=3734359","caption":"The player on a published post: what your readers see."},{"src":"https:\/\/ps.w.org\/codeep-voice-for-posts\/assets\/screenshot-2.jpg?rev=3734359","caption":"The voicing screen: what your computer can do, what the one download costs, and every post with its state."},{"src":"https:\/\/ps.w.org\/codeep-voice-for-posts\/assets\/screenshot-3.jpg?rev=3734359","caption":"Voicing in progress: the number of chunks, the estimate, and the time left."},{"src":"https:\/\/ps.w.org\/codeep-voice-for-posts\/assets\/screenshot-4.jpg?rev=3734359","caption":"The MP3 in the Media Library, attached to the post."},{"src":"https:\/\/ps.w.org\/codeep-voice-for-posts\/assets\/screenshot-5.jpg?rev=3734359","caption":"Settings, all of them."}],"raw_content":"<!--section=description-->\n<p>Codeep Voice for Posts turns a post into an audio file. You open the plugin's\nscreen in your admin, pick a post and press a button. Your own browser generates\nthe speech, and the finished recording is saved to your media library as an\nordinary MP3, attached to that post. A small player then appears on the post for\nyour readers.<\/p>\n\n<p>The speech is produced by a model that runs on your computer, inside the admin\nscreen. The plugin has no server of its own. There is no account to create, no\nAPI key to paste and nothing that counts your usage, and your post text is not\nuploaded anywhere.<\/p>\n\n<h4>Hear it before you install<\/h4>\n\n<p>Two recordings of the same sentence, one made by this plugin and one by the\nspeech voice built into your browser, are on the plugin page:\nhttps:\/\/sdsoftware.io\/codeep-voice-for-posts\/<\/p>\n\n<h4>What you get<\/h4>\n\n<ul>\n<li>A real <strong>MP3 file<\/strong> in your media library, attached to the post<\/li>\n<li><strong>Nine voices<\/strong>: Heart, Bella, Nicole and Sarah; Michael and Adam, American; Emma and George, British; and Amy, American, fast on a computer with no graphics card<\/li>\n<li>A <strong>player<\/strong> on the post, under 12 KB, which takes its colours from your theme<\/li>\n<li>A <strong>download button<\/strong> in that player, so a reader can keep the file<\/li>\n<li>Your readers download the MP3 and nothing else: no model, no engine, no waiting<\/li>\n<\/ul>\n\n<p>Because the file is a plain MP3 in your media library, you can do anything you\nwould do with any other upload: download it, put it in a podcast feed, serve it\nfrom a CDN, or hand it to someone.<\/p>\n\n<h4>How it works<\/h4>\n\n<p>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.<\/p>\n\n<p>Visitors download <strong>nothing<\/strong> but the MP3 itself. No model, no engine, no WebGPU on their side.<\/p>\n\n<h4>Honest about speed<\/h4>\n\n<p>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.<\/p>\n\n<p>On a machine with graphics acceleration it is quick. Without acceleration it still works, it just takes considerably longer on a long article.<\/p>\n\n<p>The plugin measures your computer and shows an estimate for that specific post <strong>before<\/strong> 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.<\/p>\n\n<p>You can also find out before installing anything. This page downloads the same\nvoice and times one sentence on your own machine:\nhttps:\/\/sdsoftware.io\/check\/<\/p>\n\n<h4>What this plugin does not claim<\/h4>\n\n<p>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.<\/p>\n\n<h3>External services<\/h3>\n\n<p>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.<\/p>\n\n<ul>\n<li><strong>Hugging Face<\/strong> (<code>huggingface.co<\/code>) hosts the Kokoro-82M model files, licensed Apache-2.0. Downloaded once, when you press <strong>Prepare the voice<\/strong>, and then cached in your browser. Your post text is never uploaded. Terms: https:\/\/huggingface.co\/terms-of-service Privacy: https:\/\/huggingface.co\/privacy<\/li>\n<li><strong>Hugging Face<\/strong> (<code>huggingface.co<\/code>) 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 <strong>Prepare the voice<\/strong> 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<\/li>\n<\/ul>\n\n<p>No account, API key or registration is required for any of this, and no data about you or your visitors is sent anywhere.<\/p>\n\n<h3>Third-party libraries<\/h3>\n\n<p>The plugin carries the code it needs instead of pulling it from a CDN. That is\nwhat makes it work offline, and it means shipping other people's work. Licences\nare included in <code>assets\/js\/vendor\/licenses\/<\/code>.<\/p>\n\n<ul>\n<li><strong>kokoro-js<\/strong> 1.2.1, Apache-2.0: the voice model runner<\/li>\n<li><strong>@huggingface\/transformers<\/strong> 3.8.1, Apache-2.0: inside the same bundle<\/li>\n<li><strong>onnxruntime-web<\/strong> 1.22, MIT: the WebAssembly runtime in <code>assets\/wasm\/<\/code>,\n  assets\/js\/vendor\/ort.js and part of the same bundle<\/li>\n<li><strong>phonemizer<\/strong> 1.2.1, Apache-2.0: turns text into the sounds a voice reads,\nin <code>assets\/js\/vendor\/phonemizer.js<\/code> and inside the same bundle<\/li>\n<li><strong>espeak-ng<\/strong>, GPL-3.0-or-later: the pronunciation rules phonemizer is built\non. It ships inside phonemizer rather than as a package of its own<\/li>\n<li><strong>@breezystack\/lamejs<\/strong> 1.2.7, LGPL-3.0: MP3 encoding<\/li>\n<\/ul>\n\n<p>Two of those licences are the reason this plugin is <strong>GPLv2 or later<\/strong> rather\nthan GPLv2 only: espeak-ng under GPL-3.0 and lamejs under LGPL-3.0. Both are\ncompatible through the \"or later\" clause, and neither would be without it.<\/p>\n\n<p>espeak-ng is easy to miss, so it is named here on purpose: it appears in no\npackage.json. It arrives inside <code>phonemizer<\/code>, which arrives inside <code>kokoro-js<\/code>,\nand all three end up compiled into one file.<\/p>\n\n<p>The voice model itself (Kokoro-82M, Apache-2.0) is not bundled. It is\ndownloaded from Hugging Face on first use, as described above.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin through <strong>Plugins \u2192 Add New \u2192 Upload<\/strong>, or copy the folder to <code>wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate it.<\/li>\n<li>Go to <strong>Codeep Voice<\/strong> in the admin menu.<\/li>\n<li>Press <strong>Prepare the voice<\/strong> once. The model downloads and stays in your browser.<\/li>\n<li>Pick a post and press <strong>Voice it<\/strong>.<\/li>\n<\/ol>\n\n<p>The MP3 lands in your Media Library and the player appears on the post automatically.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20my%20visitors%20download%20the%20voice%20model%3F\"><h3>Do my visitors download the voice model?<\/h3><\/dt>\n<dd><p>No. They download the MP3 and a player under 12 KB. The model only ever runs in your admin screen, on your computer.<\/p><\/dd>\n<dt id=\"does%20my%20post%20text%20get%20sent%20anywhere%3F\"><h3>Does my post text get sent anywhere?<\/h3><\/dt>\n<dd><p>No. The text is turned into audio inside your browser. There is no server of ours involved at any point.<\/p><\/dd>\n<dt id=\"what%20does%20it%20need%20to%20run%3F\"><h3>What does it need to run?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20close%20the%20tab%20while%20it%20is%20working%3F\"><h3>Can I close the tab while it is working?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"i%20changed%20the%20voice%20in%20settings%20but%20my%20posts%20sound%20the%20same\"><h3>I changed the voice in settings but my posts sound the same<\/h3><\/dt>\n<dd><p>Changing the setting does not rewrite audio that already exists. The posts list shows which voice each post was made with; press <strong>Voice it again<\/strong> on the ones you want switched.<\/p><\/dd>\n<dt id=\"i%20edited%20a%20post.%20what%20happens%20to%20the%20audio%3F\"><h3>I edited a post. What happens to the audio?<\/h3><\/dt>\n<dd><p>The post is marked <strong>Out of date<\/strong> 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.<\/p><\/dd>\n<dt id=\"can%20i%20change%20how%20the%20player%20looks%3F\"><h3>Can I change how the player looks?<\/h3><\/dt>\n<dd><p>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:<\/p>\n\n<pre><code>.entry-content {\n  --codeep-voice-accent: #7c3aed;\n  --codeep-voice-line: #e9d5ff;\n  --codeep-voice-background: #faf5ff;\n  --codeep-voice-box-radius: 10px;\n  --codeep-voice-padding: .9em 1em;\n}\n<\/code><\/pre>\n\n<p>Or with <code>::part()<\/code> for full control:<\/p>\n\n<pre><code>codeep-voice-player::part(title)  { font-weight: 700; }\ncodeep-voice-player::part(button) { background: #7c3aed; color: #fff; }\n<\/code><\/pre>\n\n<p>Available parts: <code>box<\/code>, <code>play<\/code>, <code>rate<\/code>, <code>button<\/code>, <code>title<\/code>, <code>seek<\/code>, <code>time<\/code>, <code>download<\/code>. Font and text colour are inherited from your theme automatically.<\/p><\/dd>\n<dt id=\"where%20does%20the%20player%20show%20up%3F\"><h3>Where does the player show up?<\/h3><\/dt>\n<dd><p>Before the post by default. You can move it after the post, or turn automatic placement off entirely and put the <code>[codeep_voice]<\/code> shortcode exactly where you want it.<\/p><\/dd>\n<dt id=\"which%20languages%20are%20supported%3F\"><h3>Which languages are supported?<\/h3><\/dt>\n<dd><p>The voice model reads English. The plugin interface itself follows your site language.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20a%20phone%3F\"><h3>Does it work on a phone?<\/h3><\/dt>\n<dd><p>The player does, for your readers. Generating audio on a phone is not recommended. Do that on a desktop.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.2<\/h4>\n\n<ul>\n<li>After three of your posts have audio, the plugin's own screen asks once\nfor a review on WordPress.org. One click on either button and it never\nasks again. It never appears on any other admin page.<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>The name in the plugin directory now says what the plugin does:\nCodeep Voice: Text to Speech MP3 for Posts. No code changed.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>A second voice engine, Piper. The new voice \"Amy, American, fast on any\ncomputer\" needs no graphics acceleration and is many times faster than the\nexisting voices on a plain processor. Pick it in Settings; everything else\nworks exactly as before.<\/li>\n<li>Smaller download: the plugin now carries one ONNX runtime instead of two.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Extension points for add-ons: the voice list, the data passed to the admin\nscreen and the moment an MP3 is attached to a post can now be filtered or\nhooked by other plugins. Nothing changes for anyone who does not use them.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Text to speech for posts with a human-sounding voice, saved as a real MP3. Runs in your browser: no API key, no per-character fees.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/381192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=381192"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sdsoftware"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=381192"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=381192"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=381192"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=381192"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=381192"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=381192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}