
Audio description for every WordPress video
Captions are not enough. WCAG 2.1 Level AA also asks for audio description of prerecorded video (success criterion 1.2.5): short spoken descriptions of what is on screen, in the pauses of the speech. The slide with the new opening hours, the name under the speaker, the map, the chart. Blind and low-vision viewers miss all of it without audio description. Describewright Pro writes those descriptions inside WordPress with the AI service you choose, lets you check every one next to the video, and adds an Audio description button to your player.Why now
- ADA Title II: US state and local governments, public schools, colleges and universities must meet WCAG 2.1 AA from April 26, 2027 (50,000+ residents) and April 26, 2028 (smaller entities). Level AA includes 1.2.5.
- European Accessibility Act: in force across the EU since June 28, 2025 (EN 301 549).
- Section 508 for US federal agencies.
How it works
- Click Describe next to a video in Media → Audio description, or let the queue describe the whole library.
- Describewright finds the pauses in the speech and the scene changes, and picks still frames.
- The AI writes one description per pause, sized to fit it, and reads on-screen text word for word.
- You check each description next to the playing video, with its frame and word budget, and save.
- Viewers press AD: each description is read aloud at the right moment, announced to screen readers and shown as text under the video.
Features
- Whole-library queue with stop, resume and a retry list for videos that fail.
- Extended audio description: when the speech has no pause, the video waits while the description is read.
- Translations into 30 languages with the same timing and a language picker in the player.
- Editor with frames: editable times, word budgets that turn red when a description does not fit, read-aloud preview.
- Notes for the AI: names and context once, used in every description.
- Described transcript block and
[describewright_transcript]shortcode with clickable times (WCAG 1.2.3 and 1.2.8). - Works with the core Video block and the
shortcode. No new player. - Your choice of AI: OpenAI, Google Gemini, OpenRouter, any OpenAI-compatible service, a local model (LM Studio, Ollama) or WordPress 7 Connectors.
- Works with Captionwright: captions make the pauses exact and tell the AI what is said.
- Standard WebVTT files (
kind="descriptions") in your uploads folder. They are yours to keep.
What it costs to run
You use your own AI service. Our estimate from the published prices (October 2026): a few cents for a 10-minute video with GPT-6 Luna or Gemini 3.5 Flash-Lite. No per-minute fee from us.Private by design
Sent only from your server, only to the AI service you choose, and only when you start it: still frames (JPEG, at most 512 pixels wide), the video title, your notes, the pause times, the language and style, up to four earlier descriptions of the same video and, if Captionwright has captions, the words spoken around each pause. Translating (Pro) sends the saved description text. The connection test sends a built-in red test image, and Load models sends only your API key. Your API key never reaches the browser. Nothing is sent to us, and this marketplace edition never contacts a licence server.Tested
The whole flow is tested end to end in Chrome, Edge and Firefox, on WordPress 7.1 and PHP 8.3. It passes the official WordPress Plugin Check.Requirements
- WordPress 6.5 or later, PHP 7.4 or later.
- An AI service that can look at images (your own API key), a provider in WordPress 7 Connectors, or a local vision model.
- Chrome, Edge or Firefox to create descriptions. Viewers can use any browser.
Changelog:
1.0.11 (2026-10-30)
- Frames for the AI, scene detection and thumbnails are taken only after the video confirms it shows the requested time. A seek that times out never counts as done because an earlier picture is still decoded: it is tried again, and when seeks keep failing for 30 seconds the video counts as stalled, generation shows an error you can retry, and the queue records the video as failed and goes on. Every seek's listener, frame callback and timers are removed however it ends.
- A video the browser cannot jump in (a server without range requests) gives its own error at once instead of a stall after 30 seconds.
- A thumbnail is never shown for a time the description was moved away from.
1.0.10 (2026-10-30)
- Opening a video for a description, its sound track and the thumbnails never waits forever: a video that sends no data for 30 seconds (or has no first picture after 3 minutes) gives an error you can retry, the queue records it as failed and goes on with the next video, and leaving the editor stops every load and request it started at once, including its own player.
- The time limits wait while the tab is in the background (browsers do not load video in a hidden tab), so a queue running in another tab is not failed by them.
- A video that stops sending data after the first picture is reported as stalled instead of sending old frames to the AI.
- The sound track is read into one buffer when its size is known (half the memory for large files).
- Thumbnails that could not be made are mentioned in the editor's status line.
- Documentation updated for this version: installation file names, and how the word budget follows the Speaking rate.
1.0.9 (2026-10-29)
- Editor: the word budget of every description is worked out from its current timing every time: while a time is typed, after a change, and for generated, added and reopened descriptions. Moving the start towards the end lowers the budget and shows the warning at once; more time clears it.
- Editor: a description's budget never runs past the point where the speech starts again (kept with every generated description) or where the next description starts, and the warning says which one limits it.
- The word budget, and the number of words the AI may use, follow the Speaking rate setting, as the player does. The word limit the AI gets is the budget of the description's own time.
- Editor: times outside the video are corrected to fit it, a description moved to another time gets the picture at that time, the preview reads in the language in the Language box, and "Saved." is replaced as soon as something changes.
- Extended descriptions are shown with a word budget, like the others, while extended description is off.
- Player: with extended description on, the video waits only at the end of the description being read.
- Queue: running it in one tab keeps the failures another tab recorded; the queue buttons and the failed list follow changes made in other tabs.
- Translation: the "(saved)" marks follow translations and saves made since the panel opened.
1.0.8 (2026-10-27)
- Editor: a save that finishes no longer marks newer edits as saved. Text, times, the name in the player or the language changed while the save was running stay marked unsaved, leaving the page still warns, and the status says to save again. Save stays off while a save is running.
- Editor: saving never replaces descriptions saved elsewhere without asking (a new language only if it has none yet; the loaded language only if nobody saved it in another window since it was opened).
- Editor: nothing can be added, generated or saved until the saved descriptions have loaded; a failed load offers Retry, and descriptions deleted meanwhile open an empty editor.
- Editor: while the AI generates, the descriptions, the language and the name are locked. "Describe without speech timing" uses the language in the field. Leaving the editor also stops the sound analysis and the scene search.
- Editor: the notes for the AI are saved one request at a time, and the field shows the text as stored.
- Video list: a deletion that finishes while an editor is open no longer swaps the editor for the list; one deletion per video at a time.
- Translation: asks to save unsaved edits first; a language saved elsewhere meanwhile is asked about, the other languages are still translated, and the result lists what was skipped.
- Queue: checks again right before describing a video, so no AI requests are spent on a video described meanwhile. Resume and Retry look up every queued video, 100 at a time, and report a failed lookup.
- Settings: Test and Load models ask to save first after the service, key or address changed; switching back restores the saved model; invalid language, pause or speed values are reported instead of replaced silently.
- Player: in screen reader mode and without speech synthesis, an extended description pauses the video for its reading time; descriptions are read again after seeking back, in every language.
- Described transcript block: a video that cannot be loaded shows the error with Retry.
- Uninstall: on multisite every site's settings, records and files are removed. Licence: a failed deactivation shows the error.
1.0.7 (2026-10-25)
- Saving, translating and deleting the descriptions of one video now happen one at a time, also when two windows, the editor and the queue, or two people work on the same video at once. Saves in different languages are both kept, the check that keeps an existing language (queue, translation) is made inside that protected step, and a save or deletion that cannot be stored completely reports an error instead of leaving the file and the track list out of step.
- Translation: descriptions saved in the target language while the AI was translating are kept unless you chose to replace them.
- Settings: an empty key field keeps the saved key only for the same AI service and address; a key is never sent to a service it was not entered for.
- AI requests are checked as a whole before anything is sent: frames must be JPEG stills with a time, pauses need at least one frame, caption lines need a start time and text.
- Video list: newest first in a stable order, every page loaded, and videos you may not edit are shown without their notes. The queue skips them.
- Queue state is kept per site and per user; Resume and Retry keep the videos still waiting, and videos deleted in the meantime are dropped.
- Deleting descriptions that cannot be removed shows an error, and deleting a video removes all of its description files. Plain-function sanitize callback for the settings.
1.0.6 (2026-10-24)
- Described transcript: the time buttons always control the transcript's own video. Transcript and video are linked by the attachment, otherwise by the complete video address (folder included, query string ignored), never by the file name alone. Two different video.mp4 files from different upload folders on one page each keep their own transcript, also with <source> elements and URLs with query parameters.
- Player: a description interrupted by pausing is read again on play, and one you seek into while paused is read when you press play. Several described videos on one page no longer cut off or restart each other's descriptions.
- Editor: invalid language codes are refused before any AI request (the server refuses them too), and the label follows the language. Reloading, closing the tab or leaving through the WordPress menu asks first while descriptions are being created or have unsaved changes, notes included.
- Notes for the AI and caption lines over 2,000 characters are refused with a message instead of being cut short.
- Privacy: requests to the AI service and the licence check no longer send your site address.
- Queue: a video that gets descriptions in the meantime (editor or another tab) is never overwritten.
- Translation: existing languages are marked and replacing them asks first; replies with missing lines are refused; nine more language names.
- Transcript block: a list that cannot be loaded shows the error with Retry.
1.0.5 (2026-10-23)
- Queue: Retry no longer replaces the unfinished queue. The videos still waiting for Resume, the videos being retried and the failed videos are kept and saved separately, and a run removes only the video/language entries it actually finished. If you stop a run, the videos it did not reach go back to where they came from (Resume or Retry), also after a page reload. Each video and language is still saved once.
1.0.4 (2026-10-21)
- Queue: only one queue runs at a time. Opening a video in the editor while the queue works and coming back to the list keeps the running queue with its progress, its log and the Stop button; it can no longer be started a second time. A second browser tab is told that a queue is already running there. Each video is processed once, and Stop, Resume and Retry keep exactly the right videos.
- Translation: a translation keeps running when you close the editor, and opening the same video again shows its progress instead of offering a second run.
- Editor: leaving the editor while the AI is still describing a video now asks first, and stops the AI requests if you leave. Before, the AI kept working in the background and the result was thrown away.
1.0.3 (2026-10-21)
- Audio analysis: if the browser cannot analyse a video's sound, Describewright stops with a clear message instead of treating the whole video as silent. Add Captionwright captions, try another browser, or choose "Describe without speech timing" for a video without speech. Videos with no sound track at all are still described as before.
- The queue records a video whose sound cannot be analysed as failed, saves nothing for it, and keeps it for Retry.
- The style you pick in the editor (Concise or Detailed) is always used. The saved default only applies when no valid style is sent.
- Requests to the AI service are never cut short: an oversized request is refused with a message, and the media list refuses more than 100 per page instead of trimming.
1.0.2 (2026-10-21)
- Extended audio description: switching audio description off, changing the description language or seeking while the video waits for a description now ends the description cleanly. The video plays on, the volume comes back, and a pause you make yourself afterwards stays a pause. If you press play while the video waits, the description finishes without pausing the video again.
- Described transcript block: the video picker has a search field and loads more videos page by page, so any described video can be chosen. The chosen video is loaded on its own, so its languages stay available when you reopen the block.
- Player: a volume you set while a description is read is kept when it ends.
- External services: the readme, the settings page, the documentation and this listing now list exactly what each action sends to your AI service.
1.0.1 (2026-10-20)
- New AI service: Anthropic Claude (Claude Haiku 5.5 by default).
1.0.0 (2026-10-20)
- First release.
Only logged in customers who have purchased this product may leave a review.
Support by Karelia Labs
Karelia Labs supports this product through WPBay
Questions are handled in WPBay's private ticket system, keeping your purchase details and support conversation together.
After purchase, open this item in My Downloads and choose Get Support.
What support includes
- Answers to product-related questions
- Help with reported bugs and issues
- Guidance for included third-party assets
What support does not include
- Customizations or new features
- Installation or setup services
Maintenance snapshot
See recent updates, compatibility, support, and developer activity.
- Updated 1 day ago
- Developer active recently
- WPBay support available
- WordPress 7.1 tested
Snapshot updated 2 hours ago
View details Hide details
Maintenance details
This is maintenance data. It does not measure product quality or sales.
- Last update Updated 1 day ago
- Compatibility WordPress 7.1 tested · PHP 8.3 tested, one version behind
- Releases 12 releases in the 11 days since listing
- Developer activity Developer active recently
- Support No recent support tickets to measure
- Docs and demo Documentation available · Changelog available · No demo listed
Health remained stable during the last 90 days.
How this snapshot works
Plugin Health
The score is out of 100 and uses data WPBay can check. Ratings, popularity, and sales are not used.
- Last update 30 points
-
Plugins receive full recency points under 30 days, then step down at 90, 180, 365, and 545 days.
- Compatibility 20 points
-
WordPress, PHP, and WooCommerce (when relevant) are scored separately. The latest two PHP lines count as current. Nearby previous versions keep most of the points.
- Current version 100%
- One version behind 75%
- Two versions behind 50%
- Three versions behind 25%
- Older or not listed 0%
- Releases 15 points
-
One release earns 10, two or three earn 13, and four or more earn 15. Each accepted product ZIP counts once; reprocessing the same upload and listing-only edits do not count.
- Developer activity 15 points
-
Based on WPBay login and dashboard activity. Exact last-login dates are never shown.
- Support 15 points
-
There are no recent WPBay tickets to measure.
- Docs and demo 5 points
-
Documentation: 2. Changelog: 1. Working demo or preview: 2.
Score ranges
- 90–100 Excellent
- 75–89 Healthy
- 60–74 Fair
- 40–59 Needs attention
- 0–39 Limited
Long gaps
WPBay also checks for long gaps between updates, developer activity, support replies, and releases. Buyers do not see this score.
- Time since update 35 points
- Last developer activity 25 points
- WordPress compatibility 15 points
- Support replies 15 points
- Fewer releases 10 points

Reviews
There are no reviews yet.