Title: ListenUp
Author: Adam Greenwell
Published: <strong>Febuari 3, 2026</strong>
Last modified: Septemba 30, 2026

---

Tafuta vijalizi

![](https://ps.w.org/listenup/assets/banner-772x250.png?rev=3453083)

![](https://ps.w.org/listenup/assets/icon-256x256.png?rev=3453083)

# ListenUp

 By [Adam Greenwell](https://profiles.wordpress.org/adamgreenwell/)

[Pakua](https://downloads.wordpress.org/plugin/listenup.1.6.0.zip)

 * [Details](https://sw.wordpress.org/plugins/listenup/#description)
 * [Reviews](https://sw.wordpress.org/plugins/listenup/#reviews)
 *  [Installation](https://sw.wordpress.org/plugins/listenup/#installation)
 * [Development](https://sw.wordpress.org/plugins/listenup/#developers)

 [Saidia](https://wordpress.org/support/plugin/listenup/)

## Maelezo

ListenUp is a powerful WordPress plugin that adds text-to-speech functionality to
your posts and pages. With just a few clicks, you can generate high-quality audio
versions of your content using Murf.ai’s advanced AI voices.

#### Key Features

 * **Easy Audio Generation**: Generate audio for any post or page with a simple 
   click
 * **Murf.ai Integration**: Uses professional AI voices for natural-sounding audio
 * **Gen2 API Controls**: Tune reusable Murf audio with locale, format, response
   mode, duration, timing metadata, speed, pitch and pauses
 * **No FFmpeg Required**: Ideal for hosting environments where FFmpeg is not available
   or restricted
 * **Smart Caching**: Audio files are cached locally to save API credits
 * **Hands-Off Generation**: Queue audio automatically when content is published
   and backfill recent posts on a schedule
 * **Intelligent Chunking**: Long content is automatically broken into manageable
   chunks
 * **Seamless Playback**: Multiple audio chunks play continuously without interruption
 * **Leech Protection**: Secure audio delivery prevents unauthorized direct file
   access and hotlinking
 * **Download Control**: Restrict downloads to logged-in users or disable downloads
   entirely
 * **Flexible Placement**: Choose where to display the audio player (before/after
   content)
 * **Shortcode Support**: Use [listenup] shortcode to place players anywhere
 * **Accessibility First**: WCAG-compliant audio player with keyboard navigation
 * **Mobile Responsive**: Works perfectly on all devices
 * **Admin-Friendly**: Simple settings page with clear instructions
 * **A Voice for Each Language**: Read each post in the voice, and with the pronunciation
   rules, chosen for its language
 * **Translation (Optional)**: Draft a translation of a post for a person to review
   and approve, then read it aloud in its own language. Off until you turn it on,
   and nothing is translated unless someone asks

#### How It Works

 1. **Setup**: Enter your Murf.ai API key in the plugin settings
 2. **Generate**: Use the meta box on any post/page, or enable background generation
    on publish
 3. **Display**: Audio players appear automatically or via shortcode
 4. **Listen**: Visitors can play, pause, and download audio content

#### Advanced Features

**Content Chunking**: For posts that exceed Murf.ai’s API limits, content is automatically
broken into smaller chunks. Each chunk generates a separate audio file, but the 
frontend player seamlessly plays all chunks in sequence without interruption.

**Audio Concatenation**: When downloading audio content that has been chunked, the
plugin automatically concatenates supported stream-friendly formats into a single
file, so listeners do not have to manage separate chunks.

**Bulk Cloud Migration**: Upload existing local-only audio files to configured cloud
storage from the Audio Library without regenerating audio. Large backlogs run in
small browser-safe batches, track remaining work by post, and upload the canonical
playable audio file instead of internal chunk files.

**Murf Gen2 Controls**: Choose URL or direct base64 responses, set single-file target
durations, request word timing metadata, tune speed/pitch/variation, and use `[pause
1s]` tags in content or pre-roll scripts. ListenUp still caches generated files 
locally so audio is reused instead of regenerated on every play.

**No FFmpeg Dependency**: Unlike many audio plugins, ListenUp doesn’t require FFmpeg,
making it perfect for shared hosting environments, managed WordPress hosts, or any
situation where FFmpeg is not available or restricted.

**Leech Protection**: Audio files are served through a secure PHP proxy with cache-
safe per-file tokens, preventing unauthorized direct access and hotlinking without
embedding expiring nonces in cached article HTML. All audio is delivered via WordPress
AJAX endpoints with proper HTTP range request support for smooth seeking. This server-
agnostic solution works on Apache, Nginx, IIS, and any PHP-capable server without
requiring special server configuration.

#### Translation

ListenUp can draft a translation of a post for a person to review, and narrate the
approved translation in its own language. Translation is off until an administrator
turns it on, on the Translation tab of ListenUp’s settings.

 * **Only when someone asks**: A translation starts from the Translations box in
   the post editor, from WP-CLI, or through an ability once its cost is confirmed.
   Nothing is translated on publish, on save or on a schedule, and nothing translates
   the whole archive.
 * **Drafts for review**: Each translation is saved as a new draft linked to its
   source, and the source post is never changed. A translation can’t be published,
   scheduled or voiced until a person approves it.
 * **Your choice of engine**: The WordPress AI client, which uses the AI provider
   connected to your site (WordPress 7.0 and later), or Murf.ai’s translation API.
   No engine runs without a monthly budget, and the Murf.ai engine keeps a reserve
   of your Murf.ai balance for audio. Other plugins can add engines.
 * **Glossaries and checks**: A glossary for each language fixes how terms are translated
   and which are kept as written. Every translation is checked for broken markup,
   changed numbers and units, glossary terms, formality, length and untranslated
   text.
 * **Out-of-date flags**: A translation whose source changed after it was translated
   is flagged in the editor, on post lists and in WP-CLI.
 * **Background jobs**: Long translations run in the background through Action Scheduler
   or WP-Cron, and WP-CLI finishes them where WP-Cron is disabled.
 * **Narration in each language**: Choose a voice for each language, keep pronunciation
   rules by language, and play the site’s pre-roll only before audio in the site’s
   language.
 * **Engine bake-off**: `wp listenup translate compare` and `wp listenup translate
   score` compare engines blind on your own articles, so you can choose one on evidence.
 * **Abilities**: `listenup/translate-post` and `listenup/translation-status` let
   AI and MCP clients ask for and follow translations with the same permissions 
   and budgets as the editor. They are not exposed to REST or MCP unless your site
   opts in.
 * **Analytics by language**: Player events say which language the post and its 
   audio are in, which voice read it, and whether the post is a translation.

#### Perfect For

 * Bloggers who want to offer audio versions of their posts
 * Content creators looking to improve accessibility
 * Websites targeting mobile users who prefer audio content
 * Educational sites with long-form content
 * News sites wanting to offer audio news

#### Accessibility Features

 * Full keyboard navigation support
 * Screen reader compatible
 * High contrast mode support
 * Reduced motion support
 * Proper ARIA labels and descriptions

### External Services

ListenUp connects to the services below, each only for the feature described. It
never sends anything about your visitors to any of them. Translation is off until
an administrator turns it on, and even then nothing is translated on publish, on
save or on a schedule: a post is sent for translation only when someone asks for
it.

**Murf.ai text-to-speech**
 ListenUp uses Murf.ai’s text-to-speech API to create
audio versions of your posts and pages.

 * **Endpoint**: `https://api.murf.ai/v1/speech/generate`
 * **Data Sent**: Your Murf.ai API key; the text of the post or page; the voice 
   ID, locale and style chosen for the post’s language; the speech generation settings(
   format, sample rate, channels, speed, pitch, variation, response mode, optional
   target duration and optional word timing request); and the pronunciation rules
   for the post’s language, if you have set any. A voice or pronunciation preview
   sends a short sample sentence, and pre-roll generation sends your pre-roll script.
 * **When Sent**: Only when audio is asked for: from the post editor, with `wp listenup
   generate`, or from a preview or pre-roll generation on the settings screen; and,
   once an administrator turns them on in the Automation settings (both are off 
   by default), when a post is published or by the recurring backfill. In URL response
   mode, ListenUp then downloads the finished audio from the address Murf.ai returns.
 * **Cost**: Uses characters from your Murf.ai plan.
 * **Terms of Service**: https://murf.ai/terms-of-service
 * **Privacy Policy**: https://murf.ai/privacy-policy

**Murf.ai voice list**
 ListenUp reads Murf.ai’s list of voices, with the languages
and styles each one offers, to show the voice pickers and to pick a style a voice
offers.

 * **Endpoint**: `https://api.murf.ai/v1/speech/voices?model=GEN2`
 * **Data Sent**: Your Murf.ai API key only. No content is sent.
 * **When Sent**: When an administrator tests the API connection, and when the list
   is needed and not already kept: on ListenUp’s settings screen, and when audio
   is created or previewed in a voice other than the site’s default voice. Once 
   fetched, the list is kept for a day, or until the API key changes.
 * **Cost**: Free; it uses no characters.
 * **Terms of Service**: https://murf.ai/terms-of-service
 * **Privacy Policy**: https://murf.ai/privacy-policy

**Murf.ai translation**
 The optional Murf.ai translation engine translates posts
with Murf.ai’s translation API.

 * **Endpoint**: `https://api.murf.ai/v1/text/translate`
 * **Data Sent**: Your Murf.ai API key (the audio key, or a separate translation
   key set on the Translation tab or with the `LISTENUP_MURF_TRANSLATION_API_KEY`
   constant); the target language; and the text of the post’s title, excerpt and
   content, with the alt and title text in its markup, as plain text with numbered
   placeholders in place of the markup. No tags or other attributes are sent, so
   no link or image addresses, and nothing else: no glossary, style notes or context.
 * **When Sent**: Only after an administrator turns translation on and sets a monthly
   budget and an audio reserve for the Murf.ai engine, and only when a user allowed
   to translate the post asks for a translation: from the Translations box in the
   post editor; through the `listenup/translate-post` ability once the caller confirms
   the cost; or with `wp listenup translate post`, `batch`, `compare` (after `--
   yes`) or `run`, which runs translations already asked for. A translation asked
   for in the editor, or a long one asked for through the ability, is sent from 
   a background job, by WP-Cron or Action Scheduler.
 * **Raw-HTML probe**: `wp listenup translate compare --probe-raw-html` also sends
   a few passages of each compared post to the same endpoint with their HTML markup
   and attributes, link addresses included, to test whether Murf.ai keeps markup.
   It runs only when that option is given.
 * **Cost**: Spends the same Murf.ai balance as audio, billed by the characters 
   returned. Every request counts against the monthly budget and keeps the audio
   reserve for audio.
 * **Terms of Service**: https://murf.ai/terms-of-service
 * **Privacy Policy**: https://murf.ai/privacy-policy

**AI provider, through the WordPress AI client**
 The optional AI translation engine
translates posts with the AI provider connected to your site, through the AI client
built into WordPress 7.0 and later. ListenUp includes no provider of its own and
makes no request to one directly: it hands the request to the WordPress AI client,
which sends it to the AI provider selected on ListenUp’s Translation tab or, when
none is selected there, to the site’s default provider. Providers are added by provider
plugins and connected under Settings > Connectors.

 * **Data Sent**: The text of the post’s title, excerpt and content, with the alt
   and title text in its markup, and with its inline HTML tags but none of their
   attributes, so no link or image addresses; the title and excerpt again as plain
   text, for context; the glossary terms the text uses; the language’s style notes;
   and the translation instructions. The provider receives it with your site’s credentials
   for that provider.
 * **When Sent**: Only after an administrator turns translation on and sets a monthly
   budget for the AI engine, and only when a user allowed to translate the post 
   asks for a translation, in the same ways as for Murf.ai above.
 * **Cost**: Billed by the provider, under your account with it. Every request counts
   against the monthly budget.
 * **Terms and Privacy**: The selected provider’s terms of service and privacy policy
   apply to what it is sent, together with your account’s data settings with that
   provider, such as whether it keeps or trains on what it receives. Check them 
   before choosing this engine.

**Optional Cloud Storage Services**
 This plugin optionally supports uploading audio
files to cloud storage services (Amazon S3, Google Cloud Storage, Cloudflare R2)
to reduce bandwidth usage on your web server. This feature is completely optional
and disabled by default. No data is sent to these services unless you explicitly
configure and enable cloud storage in the plugin settings. Once it is enabled, audio
files are uploaded when you move them there from the Audio Library or with `wp listenup
cloud-upload`, when audio is created with automatic upload turned on, and when ListenUp
replaces a cloud copy it finds incomplete. Your visitors’ browsers then play and
download audio from the storage service.

 * **Amazon S3**: https://aws.amazon.com/service-terms/ (Privacy: https://aws.amazon.
   com/privacy/)
 * **Google Cloud Storage**: https://cloud.google.com/terms/ (Privacy: https://cloud.
   google.com/terms/cloud-privacy-notice)
 * **Cloudflare R2**: https://www.cloudflare.com/terms/ (Privacy: https://www.cloudflare.
   com/privacypolicy/)

### Support

For support, please visit the plugin’s support forum or contact the developer.

### Privacy Policy

ListenUp stores nothing about your site’s visitors and sets no cookies. It sends
your content to other services only as described under External Services: to Murf.
ai when audio is created, to your cloud storage service if you use one, and to the
translation engine you choose when someone asks for a translation. It never sends
anything about your visitors.

 * **Audio playback**: Audio plays from your site, or from your cloud storage service
   if you use one, which then receives the IP address and browser details of each
   visitor who plays or downloads audio from it, as with any download. The audio
   library remembers a visitor’s autoplay choice in their browser’s local storage,
   and never sends it to your site.
 * **Analytics**: If you turn on analytics tracking (off by default), the player
   adds play, progress and download events to the page’s dataLayer. They carry facts
   about the content only: the post, its audio, their languages, the voice, and 
   whether the post is a translation and of which post. ListenUp sends them nowhere;
   your tag manager or analytics service decides what happens to them.
 * **Translation**: Off until an administrator turns it on. ListenUp records who
   asked for each translation and who approved it, and when, and it counts the translations
   each user started in the last hour, to limit them.
 * **Abilities**: The `listenup/translate-post` and `listenup/translation-status`
   abilities act for a signed-in user who may translate the post. They are not available
   through the REST API or the MCP Adapter unless your site opts in with the `listenup_translation_ability_public`
   filter, and translate-post sends nothing until the caller confirms the cost.
 * **Suggested policy text**: ListenUp suggests text for your privacy policy under
   Settings > Privacy > Policy Guide.

Deleting ListenUp removes everything it stores and keeps translated posts as ordinary
posts; see “What happens to my data when I delete ListenUp?” above.

## Screenshots

[⌊Choose your desired voice, language and reading style⌉⌊Choose your desired voice,
language and reading style⌉[

Choose your desired voice, language and reading style

[⌊Automatically insert the player into your theme or manually add with a shortcode⌉⌊
Automatically insert the player into your theme or manually add with a shortcode⌉[

Automatically insert the player into your theme or manually add with a shortcode

[⌊Specify how words and phrases should be pronounced⌉⌊Specify how words and phrases
should be pronounced⌉[

Specify how words and phrases should be pronounced

[⌊Add or generate pre-roll audio to play before each content piece⌉⌊Add or generate
pre-roll audio to play before each content piece⌉[

Add or generate pre-roll audio to play before each content piece

[⌊Offload audio to S3, R2 or GCS to reduce bandwidth usage and server load⌉⌊Offload
audio to S3, R2 or GCS to reduce bandwidth usage and server load⌉[

Offload audio to S3, R2 or GCS to reduce bandwidth usage and server load

[⌊Quickly see which posts have audio, what type of audio and where the audio is 
stored⌉⌊Quickly see which posts have audio, what type of audio and where the audio
is stored⌉[

Quickly see which posts have audio, what type of audio and where the audio is stored

[⌊Generate audio from your post editor with a single click⌉⌊Generate audio from 
your post editor with a single click⌉[

Generate audio from your post editor with a single click

## Installation

 1. Upload the plugin files to the `/wp-content/plugins/listenup` directory, or install
    the plugin through the WordPress plugins screen directly.
 2. Activate the plugin through the ‘Plugins’ screen in WordPress
 3. Go to Settings > ListenUp to configure your Murf.ai API key
 4. Start generating audio manually, or enable Automation settings for hands-off generation

## FAQ

### Do I need a Murf.ai account?

Yes, you’ll need a Murf.ai account and API key to use this plugin. You can sign 
up at Murf.ai and get your API key from your dashboard.

### How much does Murf.ai cost?

Murf.ai offers various pricing plans. Check their website for current pricing information.

### Can I use this on multiple sites?

Yes, but you’ll need separate API keys for each site or ensure your Murf.ai plan
supports multiple domains.

### Does ListenUp work on a multisite network?

Yes. Activated for the whole network, ListenUp runs on every site, and each site
has its own settings, audio and scheduled tasks. A site’s audio folder is created,
with the files that keep it private, when audio is first saved on that site, sites
added later included.

Deactivated for the whole network, ListenUp stops its scheduled tasks on every site
of that network, except sites that have it activated on their own. On a network 
of more than 10,000 sites, deactivate it with `wp plugin deactivate listenup --network`,
which the web server’s time limit doesn’t cut short.

Deleting ListenUp removes its settings, post meta, scheduled tasks and cached audio
files from every site. Audio copied to cloud storage stays in your bucket.

### What audio formats are supported?

The plugin supports MP3, WAV, FLAC, ALAW, ULAW, PCM, and OGG output from Murf.ai.
MP3 is the default because it works well across browsers and supports chunked audio
downloads without requiring FFmpeg.

### What is the Audio Response Mode setting?

Audio Response Mode controls how ListenUp receives the generated file from Murf.
ai. URL mode asks Murf for a hosted audio URL, then ListenUp downloads and caches
it. Direct base64 mode asks Murf to return the encoded audio in the API response,
then ListenUp decodes and caches it locally. Both modes still generate audio through
Murf.ai and both are cached locally after generation.

### Does direct base64 mode cost less?

No. Response mode changes delivery, not Murf.ai generation usage. The cost saver
is ListenUp’s local cache: once audio is generated and cached, visitors replay the
saved file instead of generating new audio each time.

### Can I force audio to a specific length?

You can set an optional target duration for single-file Murf Gen2 audio. Murf.ai
treats this as a generation target, not a frame-perfect editor. For very long posts
that ListenUp splits into multiple chunks, target duration is skipped so each chunk
can be generated safely.

### Can I add pauses to the spoken audio?

Yes. Add pause tags like `[pause 1s]` in post content or generated pre-roll scripts.
ListenUp normalizes supported pause values between 0.1 seconds and 5 seconds before
sending text to Murf.ai.

### What does Word Timing Metadata do?

When enabled, ListenUp asks Murf.ai to return word timing metadata and stores it
with newly generated audio when Murf returns it. This metadata is mainly for future
transcript and word-highlighting features; it does not display a transcript on the
frontend yet. Regenerate existing audio if you need timing metadata added to audio
that was already cached.

### Can I customize the audio player appearance?

Yes, the plugin includes CSS classes that you can customize in your theme’s stylesheet.

### What happens with very long posts?

For posts that exceed Murf.ai’s API character limits, the plugin automatically breaks
the content into smaller chunks. Each chunk is processed separately and saved as
an individual audio file. The frontend player seamlessly plays all chunks in sequence,
and supported formats can be downloaded as a concatenated file.

### How does the leech protection work?

ListenUp serves audio files through a secure PHP proxy instead of relying on direct
file access. Public playback URLs include stable per-file tokens so cached pages
keep working behind page caches, CDNs, and hosts like Kinsta. Private or unpublished
content still uses WordPress nonce and capability checks where needed. The system
supports HTTP range requests for smooth audio seeking and includes proper caching
headers for performance. This protection works automatically without requiring any
server configuration.

### Can I block direct access to audio files at the server level?

Yes! For additional security, you can configure your web server to block direct 
access to the audio directory. Here are example configurations:

**For Apache (.htaccess):**
 Add this to `/wp-content/uploads/listenup-audio/.htaccess`:`
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [F,L] </IfModule>

**For Nginx:**
 Add this to your server block configuration: `location ~* ^/wp-content/
uploads/listenup-audio/ { return 403; }

After implementing server-level blocks, audio will still play normally through the
WordPress player because the plugin reads files directly from the filesystem, bypassing
the web server’s URL routing entirely.

### Does ListenUp translate automatically?

No. Translation is off until an administrator turns it on, and even then a post 
is translated only when a person asks: from the Translations box in the post editor,
with `wp listenup translate`, or through the `listenup/translate-post` ability once
the caller confirms the cost. Nothing is translated when a post is saved or published,
and nothing runs on a schedule. Each translation is a draft that a person reviews
and approves before it can be published or voiced.

### Which translation engine should I use?

ListenUp recommends none yet: an administrator chooses. The WordPress AI client 
engine takes your glossary, the formality and the markup, and needs WordPress 7.0
or later with an AI provider connected under Settings > Connectors. The Murf.ai 
engine takes plain text only, and spends the same Murf.ai balance as your audio.
To choose on evidence, run a blind comparison on your own articles with `wp listenup
translate compare`, then `wp listenup translate score`.

### Does translation cost anything?

Each engine bills you under your own account: the AI provider for AI translation,
Murf.ai for Murf.ai translation. The post editor shows the estimate and asks before
anything is sent. From the command line, `wp listenup translate post` sends at once,
so run it with `--dry-run` first to see the estimate. No engine runs without a monthly
budget in characters, which you set on the Translation tab.

### Can each language have its own voice?

Yes. Under Voices by Language on the API Configuration tab, choose a voice, locale
and style for each language. A post is read in its language’s voice, with that language’s
pronunciation rules, and posts in the site language keep the site voice. ListenUp
chooses no voice for you: for Spanish (Mexico), preview en-US-natalie speaking es-
MX and the native es-MX voices.

### What happens to my data when I delete ListenUp?

Deleting ListenUp from the Plugins screen removes everything it stores, on every
site of a network: its settings, pronunciation rules, translation settings, glossaries,
usage records and translation jobs, its cached data and scheduled tasks, all of 
its post meta, and the cached audio and pre-roll files in your uploads. Audio copied
to cloud storage stays in your bucket, and comparison output from `wp listenup translate
compare` stays where you wrote it.

Translated posts are your content, so they are kept, as ordinary posts of the same
type and status. Their link to the source post, their provenance and their review
state are removed with the rest of ListenUp’s post meta. While ListenUp is deactivated
or deleted, nothing holds an unapproved translation back from being published, so
review or delete unapproved translations first.

Deactivating ListenUp only stops its scheduled tasks. Queued translations stay queued
until you run them again.

## Reviews

Hakuna hakiki za programu-jalizi hii.

## Wachangiaji & Wasanidi

“ListenUp” is open source software. The following people have contributed to this
plugin.

Contributors

 *   [ Adam Greenwell ](https://profiles.wordpress.org/adamgreenwell/)

[Translate “ListenUp” into your language.](https://translate.wordpress.org/projects/wp-plugins/listenup)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/listenup/), check out
the [SVN repository](https://plugins.svn.wordpress.org/listenup/), or subscribe 
to the [development log](https://plugins.trac.wordpress.org/log/listenup/) by [RSS](https://plugins.trac.wordpress.org/log/listenup/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.6.0

 * Added an optional translation module, off by default: draft a translation of 
   a post for a person to review, from the editor’s Translations box, WP-CLI or 
   an ability. Nothing is translated on publish, on save or on a schedule, and the
   source post is never changed
 * Added an approval gate: a translation can’t be published, scheduled or voiced
   until a person approves it, on every publishing path, whether or not translation
   is on
 * Added two translation engines, the WordPress AI client (WordPress 7.0 and later)
   and Murf.ai’s translation API, each within a monthly character budget, with an
   audio reserve that keeps part of the Murf.ai balance for audio. Other plugins
   can add engines
 * Added per-language glossaries with CSV import and export, automatic translation
   checks, out-of-date detection and an optional Translations column on post lists
 * Added background translation jobs through Action Scheduler or WP-Cron, and the
   wp listenup translate (post, batch, status, check, roundtrip, run) and wp listenup
   glossary commands
 * Added a blind engine bake-off harness: wp listenup translate compare and wp listenup
   translate score
 * Added the listenup/translate-post and listenup/translation-status abilities (
   WordPress 6.9 and later), not exposed to REST or MCP unless a site opts in with
   the listenup_translation_ability_public filter
 * Added per-language narration: voices by language, pronunciation rules by language(
   existing rules become the site language’s, unchanged), and the site pre-roll 
   only before audio in the site’s language. Only approved translations are voiced
 * Added language fields to player analytics events (audio_language, content_language,
   audio_voice_id, is_translation, translation_source_post_id) and listenup_get_player_attributes()
   for players built by themes
 * Fixed download analytics events never firing from ListenUp’s own player
 * A post or translation whose generated audio can’t be saved gets no audio and 
   no recorded voice, and keeps a voice recorded before
 * Added suggested privacy policy text under Settings > Privacy > Policy Guide
 * Changed uninstall to also remove the translation settings, glossaries, usage 
   ledger, jobs and translation links on every site of a network; translated posts
   are kept as ordinary posts
 * Improved: the Murf.ai voice list is cached for a day, and long text is split 
   into chunks by characters rather than bytes
 * Deactivation now also unschedules translation runs, in WP-Cron and Action Scheduler
 * The audio folder’s .htaccess from versions before 1.5.131 is now replaced with
   the current one the next time audio is saved; a .htaccess you edited is left 
   as it is

#### 1.5.138

 * Security: ListenUp no longer saves a .json file beside each audio file in uploads/
   listenup-audio. Each held the voiced text or its word timings, including a draft’s
   text, and the Murf.ai account’s remaining characters, and on servers that don’t
   apply the folder’s .htaccess, such as Nginx, anyone could read it. Existing .
   json files are deleted once per site, on the next admin page or audio save; on
   a network, `wp site list --field=url | xargs -I % wp listenup cleanup-orphaned--
   dry-run --url=%` lists them on every site, and running it without `--dry-run`
   deletes them along with every local audio file no post uses
 * Fixed Delete Audio and permanent post deletion leaving a post’s audio files, 
   chunks included, on the server, and Regenerate Audio leaving unused files behind
 * Security: Updated the bundled Guzzle, PSR-7 and JMESPath libraries, used by cloud
   storage, to versions with published security fixes
 * Fixed a fatal error when activating ListenUp on sites where WordPress writes 
   files over FTP or SSH, and uninstalling or clearing the debug log failing there
 * Fixed network deactivation and deletion only cleaning up the main site; scheduled
   tasks, settings and cached audio are now removed from every site
 * Fixed the audio folder missing its protection files on network sites; they are
   now added whenever audio is saved
 * Fixed multisite sites using another site’s pronunciation rules, audio folder 
   or cloud storage after `switch_to_blog()`, which could delete the main site’s
   audio when a network user was deleted
 * Fixed Regenerate Audio and `wp listenup generate --force` deleting the old audio
   before the new audio was saved; if generation fails, the post keeps its old audio
 * Changed `wp listenup generate --force` to request new audio from Murf.ai, which
   uses Murf.ai characters for every post it touches
 * Fixed a fatal error in URL mode when Murf.ai’s audio couldn’t be downloaded or
   saved, which spent characters again on every retry; batches now stop and automatic
   generation pauses for 24 hours
 * Fixed `wp listenup generate --cloud-upload` and the Audio Library’s Upload button
   uploading long posts one chunk at a time
 * Fixed `wp listenup cloud-upload` recording a cloud path that doesn’t exist, so
   the posts it uploaded couldn’t play, and `--force` not uploading again
 * Fixed Delete Audio in the post editor leaving the cloud copy in the bucket
 * Fixed the Audio Library reporting “Failed to delete” for audio it had deleted
   on WordPress 5.9–6.6
 * Fixed the Audio Library’s “Local Files Only” delete removing the site’s shared
   pre-roll file along with a long post’s chunks
 * Added a bucket scan to `wp listenup cleanup-orphaned --cloud` that lists cloud
   audio no post uses, with `--delete-untracked` to remove it on production sites
 * Fixed `wp listenup cleanup-orphaned --cloud` skipping sites with no local audio
   folder and deleting cloud files other posts still use
 * Fixed deleting a post leaving its cloud copies behind, and added the `listenup_supported_post_types`
   filter
 * Fixed the player and editor strings showing in English on sites in other languages
 * Added Murf.ai quota and rate-limit handling: automated generation pauses when
   characters run out, busy responses are retried, and remaining characters are 
   shown on the API Configuration tab

#### 1.5.137

 * Fixed longer posts playing only the last part of their article from cloud storage
   instead of the full recording; affected posts are detected and republished automatically
 * Fixed Audio Library bulk upload re-uploading every chunked post on each run instead
   of skipping those already in cloud storage
 * Fixed posts with pre-roll audio being unable to upload to cloud storage
 * Fixed cloud playback never being used on sites whose audio is not MP3
 * Fixed concatenated audio files in formats other than WAV building up in the uploads
   directory
 * Added WordPress 7.1 compatibility

#### 1.5.136

 * Fixed audio playback failures on long-lived page caches by removing expiring 
   nonce requirements from public playback URL refreshes
 * Added cache-safe local audio proxy tokens and legacy nonce compatibility for 
   existing cached markup
 * Added Audio Library bulk upload controls for moving existing local-only audio
   files to cloud storage without regenerating
 * Fixed bulk cloud upload counting so the Audio Library tracks local-only posts
   and does not count internal chunk files as separate migration items
 * Added Kinsta edge/CDN cache guidance for large sites using cloud storage and 
   signed audio URLs

#### 1.5.135

 * Added file-based cache busting for plugin assets to prevent stale JavaScript 
   after CDN/browser caching
 * Added Murf Gen2 locale, sample rate, channel, response mode, duration, word timing,
   pause, speed, pitch and variation controls for reusable audio generation
 * Added direct base64 response caching, optional target duration, word timing metadata
   storage and pause tag normalization for Murf Gen2 generation

#### 1.5.134

 * Added player display options for featured or compact layouts
 * Added selectable player accent colors
 * Refreshed the frontend player with a featured visual treatment and stronger theme
   isolation
 * Removed the experimental Howler.js playback option in favor of the native browser
   audio player

#### 1.5.132

 * Added Automation settings for publish-triggered audio generation and recurring
   recent-content backfill
 * Fixed audio playback failing on post revisions and previews due to meta lookups
   using the revision ID instead of the parent post
 * Centralized revision-to-parent post resolution into Cache::get_meta_post_id()
   for consistent behavior across all audio endpoints
 * Fixed pre-roll audio URL resolution for revisions via cloud storage
 * Fixed access check in AJAX audio URL handler incorrectly rejecting anonymous 
   users on revisions of published posts
 * Preserved audio post meta when local files are missing instead of deleting it,
   allowing recovery and regeneration

#### 1.5.131

 * Security fixes

#### 1.5.13

 * Fixed audio playback errors caused by expired signed URLs when page caching is
   enabled
 * Cloud storage audio URLs are now fetched fresh via AJAX on player initialization
 * Improved compatibility with page caching plugins and CDNs (Varnish, Cloudflare,
   WP Super Cache, etc.)
 * Enhanced security: added post existence and publication status validation for
   audio URL requests
 * Improved error handling with generic client messages and detailed server-side
   logging

#### 1.5.12

 * Code optimizations for WordPress plugin directory compliance
 * Update documentation with external service usage

#### 1.5.11

 * Added pagination to Audio Library admin page
 * Update Audio Library filtering
 * Improve analytics events to not fire for pre-roll audio

#### 1.5.1

 * Added “pronunciation” feature to plugin settings to specify how certain words
   should be spoken

#### 1.5.0

 * Code quality improvements and WordPress coding standards compliance
 * Enhanced security and sanitization throughout the plugin
 * Improved error handling and user feedback
 * Optimized file operations and directory structure
 * Better compatibility with WordPress plugin directory requirements

#### 1.4.1

 * Implement tracking feature to push events to the datalayer for GTM and GA4 consumption

#### 1.4.0

 * Add option to specify conversion output bitrate
 * Add option to apply normalization with parameters to conversion process

#### 1.3.22

 * Fix autoplay feature in audio library

#### 1.3.21

 * Add ability to delete cloud audio as well as local audio files

#### 1.3.2

 * Improve frontend player user experience when pre-roll audio is present

#### 1.3.11

 * Add feature to generate pre-roll audio

#### 1.3.1

 * Add “autoplay” feature to audio library shortcode

#### 1.3.0

 * Restrict download to logged-in users or block all downloads completely
 * Implemented leech protection (requires server configuration)
 * 1.2.01 =
 * Minor frontend player presentation improvements

#### 1.2.0

 * Added ability to generate audio for posts that do not fit in the Murf.ai API 
   request length

#### 1.1.1

 * Improved debug logging

#### 1.1.0

 * Users can select a default voice and style
 * Voices can now be previewed

#### 1.0.0

 * Initial release
 * Murf.ai API integration
 * Audio caching system
 * Meta box for manual generation
 * Automatic placement options
 * Shortcode support
 * Accessibility features
 * Mobile responsive design

## Meta

 *  Version **1.6.0**
 *  Last updated **1 wiki zilizopita**
 *  Active installations **10+**
 *  WordPress version ** 5.9 au juu **
 *  Tested up to **7.1.3**
 *  PHP version ** 8.1 au juu **
 *  Language
 * [English (US)](https://wordpress.org/plugins/listenup/)
 * Tags
 * [accessibility](https://sw.wordpress.org/plugins/tags/accessibility/)[audio](https://sw.wordpress.org/plugins/tags/audio/)
   [text to speech](https://sw.wordpress.org/plugins/tags/text-to-speech/)[tts](https://sw.wordpress.org/plugins/tags/tts/)
 *  [Advanced View](https://sw.wordpress.org/plugins/listenup/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/listenup/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/listenup/reviews/)

## Contributors

 *   [ Adam Greenwell ](https://profiles.wordpress.org/adamgreenwell/)

## Saidia

Got something to say? Need help?

 [Angalia Baraza ya Usaidizi](https://wordpress.org/support/plugin/listenup/)