{"id":374219,"date":"2026-09-27T08:59:18","date_gmt":"2026-09-27T08:59:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/dub-any-video-ai-video-dubbing\/"},"modified":"2026-09-27T08:59:05","modified_gmt":"2026-09-27T08:59:05","slug":"shelfcompass-video-voice-translator","status":"publish","type":"plugin","link":"https:\/\/mn.wordpress.org\/plugins\/shelfcompass-video-voice-translator\/","author":23572419,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.5.2","stable_tag":"0.5.2","tested":"7.1.2","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Shelfcompass Video Voice Translator","header_author":"Dub Any Video","header_description":"Generate AI voice-over for your videos in 31 languages and play them with a language switcher. Audio and subtitles are stored in your own Media Library.","assets_banners_color":"082769","last_updated":"2026-09-27 08:59:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/dubanyvideo.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":53,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"0.5.2":{"tag":"0.5.2","author":"shelfcompass","date":"2026-09-27 08:59:05","revision":3715190}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3715289,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3715289,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3715289,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3715289,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"dubanyvideo\/player":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"dubanyvideo\/player","title":"Dubbed video","category":"media","icon":"format-video","description":"Play a video from your Media Library with an audio-language switcher and translated subtitles.","keywords":["dubbing","audio","language","translation"],"textdomain":"shelfcompass-video-voice-translator","supports":{"html":false,"customClassName":false,"reusable":true},"attributes":{"id":{"type":"number","default":0},"default":{"type":"string","default":"original"},"subtitles":{"type":"boolean","default":true},"width":{"type":"string","default":"100%"}},"editorScript":"dubanyvideo-block-editor","editorStyle":"file:.\/editor.css"}},"tagged_versions":["0.5.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3715190,"resolution":"1","location":"assets","locale":"","width":1280,"height":700},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3715190,"resolution":"2","location":"assets","locale":"","width":1280,"height":980},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3715190,"resolution":"3","location":"assets","locale":"","width":1280,"height":1000},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3715190,"resolution":"4","location":"assets","locale":"","width":1280,"height":900}},"screenshots":{"1":"Every video in your library, the languages each one already speaks, and the shortcode to paste.","2":"One video: what a language costs, what your balance is, and every finished language with its audio and subtitle files.","3":"The script before anything is voiced \u2014 lines, timings, speakers and the voice each one gets.","4":"The player a visitor sees, with the audio language menu under the video."}},"plugin_section":[],"plugin_tags":[282915,1734,1982,2333,222],"plugin_category":[48,50],"plugin_contributors":[282916],"plugin_business_model":[],"class_list":["post-374219","plugin","type-plugin","status-publish","hentry","plugin_tags-dubbing","plugin_tags-localization","plugin_tags-subtitles","plugin_tags-translation","plugin_tags-video","plugin_category-language-tools","plugin_category-media","plugin_contributors-shelfcompass","plugin_committers-shelfcompass"],"banners":{"banner":"https:\/\/ps.w.org\/shelfcompass-video-voice-translator\/assets\/banner-772x250.png?rev=3715289","banner_2x":"https:\/\/ps.w.org\/shelfcompass-video-voice-translator\/assets\/banner-1544x500.png?rev=3715289","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/shelfcompass-video-voice-translator\/assets\/icon-128x128.png?rev=3715289","icon_2x":"https:\/\/ps.w.org\/shelfcompass-video-voice-translator\/assets\/icon-256x256.png?rev=3715289","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/shelfcompass-video-voice-translator\/assets\/screenshot-1.png?rev=3715190","caption":"Every video in your library, the languages each one already speaks, and the shortcode to paste."},{"src":"https:\/\/ps.w.org\/shelfcompass-video-voice-translator\/assets\/screenshot-2.png?rev=3715190","caption":"One video: what a language costs, what your balance is, and every finished language with its audio and subtitle files."},{"src":"https:\/\/ps.w.org\/shelfcompass-video-voice-translator\/assets\/screenshot-3.png?rev=3715190","caption":"The script before anything is voiced \u2014 lines, timings, speakers and the voice each one gets."},{"src":"https:\/\/ps.w.org\/shelfcompass-video-voice-translator\/assets\/screenshot-4.png?rev=3715190","caption":"The player a visitor sees, with the audio language menu under the video."}],"raw_content":"<!--section=description-->\n<p>Pick a video in your Media Library, choose the languages, and get a dubbed audio\ntrack plus translated subtitles for each one. The files are stored in your own\nMedia Library, and the included player keeps your original video while switching\nonly the audio.<\/p>\n\n<p><strong>How it works<\/strong><\/p>\n\n<ol>\n<li>Open <em>Voice Translator \u2192 Settings<\/em> and press <strong>Connect this site<\/strong>. You sign in\nto dubanyvideo.com (or create an account), approve this site by name, and the\nplugin fetches its key itself \u2014 there is no key to copy. If you already have a\nkey, or your site cannot open dubanyvideo.com in a browser, <em>Enter a key\nmanually<\/em> on the same screen still works.<\/li>\n<li>Open <em>Voice Translator<\/em> \u2014 it lists your videos and which languages each one has.<\/li>\n<li>Choose languages, then pick how much control you want:\n\n<ul>\n<li><strong>Transcribe &amp; review first<\/strong> \u2014 the video is transcribed and translated at\nhalf the minute rate, and nothing is voiced yet. You get a review screen:\ncorrect the transcript and the translation, nudge the timings, say who\nspeaks each line, and choose a voice per speaker. Then generate the audio.<\/li>\n<li><strong>Dub now<\/strong> \u2014 the machine's own reading, straight to audio. Cheaper, with\nnothing to correct first.<\/li>\n<\/ul><\/li>\n<li>Either way the cost, and your remaining minutes, are shown before the click.<\/li>\n<li>When a language finishes, its MP3, SRT and VTT files appear in your Media\nLibrary and can be played right there.<\/li>\n<li>Add the <em>Dubbed video<\/em> block to a page, or use <code>[dubanyvideo id=\"123\"]<\/code>.\nViewers get an <em>Audio:<\/em> switcher labelled in each language's own name.<\/li>\n<\/ol>\n\n<p><strong>Editing a dub you already published<\/strong><\/p>\n\n<p>Change a line, a speaker or a voice and the languages you already generated are\nmarked <em>out of date<\/em> \u2014 the files keep playing, nothing is charged, and you decide\nwhich language is worth generating again.<\/p>\n\n<p><strong>Why only the audio is replaced<\/strong><\/p>\n\n<p>One copy of the picture serves every language. Three languages of a ten-hour\nlibrary is roughly 0.8 GB of audio, against roughly 19 GB if every language were a\nfull video copy. Switching languages does not reload the video.<\/p>\n\n<p><strong>What this plugin does not do<\/strong><\/p>\n\n<ul>\n<li>It does not host your media. Files are downloaded into your Media Library and\nserved from your site. If this plugin disappears, your dubbed videos keep\nplaying.<\/li>\n<li>It does not re-encode or modify your original video.<\/li>\n<li>It does not claim a translation is correct. Review the subtitles before you\npublish; they are ordinary SRT files you can edit.<\/li>\n<\/ul>\n\n<p><strong>Voice and quality<\/strong><\/p>\n\n<p>Speech is generated with synthetic voices and speaker detection. There is no voice\ncloning and no lip sync, so the result suits lessons, tutorials, onboarding,\nproduct and process videos rather than close-up advertising.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin sends data to <strong>dubanyvideo.com<\/strong>, which performs the transcription,\ntranslation and voice generation. Nothing is sent until you press <em>Connect this\nsite<\/em> or enter an API key.<\/p>\n\n<ul>\n<li><strong>What is sent:<\/strong> the URL of the video you select and the target language\ncodes. The dubbing service downloads the file from that URL. When your site is\nnot reachable from the internet, the video file itself is uploaded instead, and\nthe dubbing screen tells you so before you start. Your API key is sent as an\nauthorization header.<\/li>\n<li><strong>When you connect:<\/strong> this site's address, its name, a return address inside\nyour admin and the hash of a one-time secret are carried in the link that opens\ndubanyvideo.com. Approving sends back a single-use code, which the plugin trades\nfor your API key in a direct request from your server. The key itself never\ntravels through the browser, and disconnecting revokes it.<\/li>\n<li><strong>When:<\/strong> when you open a video's dubbing screen (a free length, balance and\nreachability check), while that screen is open (job status), once a minute\nthrough WP-Cron while a dub is running, when you press <em>Start dubbing<\/em>, and on\nthe review screen when you edit a line, a speaker or a voice.<\/li>\n<li><strong>The price list:<\/strong> once connected, the settings screen asks the service for\nthe plans, their monthly minutes and their prices (<code>GET \/api\/v1\/plans<\/code>) so\nnothing about pricing is hardcoded in the plugin. No key, no site data and no\npersonal data are sent, and the answer is cached for twelve hours.<\/li>\n<li><strong>Identification:<\/strong> requests name the plugin and its version in the\nUser-Agent header. The site's address is not included.<\/li>\n<li><strong>The Contact screen:<\/strong> only when you press <em>Send message<\/em>, and only what you\ntyped \u2014 the category and the text \u2014 sent with your API key so the reply can go\nto the address on your account. Nothing about your site or your videos is\nattached, and the screen is never contacted otherwise.<\/li>\n<li><strong>What comes back:<\/strong> a dubbed audio file and subtitle files, which the plugin\ndownloads into your Media Library.<\/li>\n<li><strong>Retention:<\/strong> an uploaded source file is deleted from the service after seven\ndays. The finished audio and subtitles live in your Media Library, not on the\nservice.<\/li>\n<li>Terms: https:\/\/dubanyvideo.com\/terms \u2014 Privacy policy: https:\/\/dubanyvideo.com\/privacy<\/li>\n<\/ul>\n\n<p>An account on dubanyvideo.com is required; dubbing consumes minutes from that\naccount's balance.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20my%20site%20have%20to%20be%20publicly%20reachable%3F\"><h3>Does my site have to be publicly reachable?<\/h3><\/dt>\n<dd><p>No. The service prefers to download the video from your site's URL, and when that\nis not possible \u2014 a local install, a staging site behind a password, protected\nuploads \u2014 the plugin uploads the file instead. The dubbing screen says which of\nthe two will happen before any minutes are spent. Files above 200 MB on an\nunreachable site are the one case that needs a public URL.<\/p><\/dd>\n<dt id=\"how%20long%20does%20one%20video%20take%3F\"><h3>How long does one video take?<\/h3><\/dt>\n<dd><p>Processing runs on the service's side and typically takes a few minutes per\nlanguage. The plugin checks every minute and imports the files when they are\nready; you can leave the page.<\/p><\/dd>\n<dt id=\"can%20i%20edit%20the%20subtitles%3F\"><h3>Can I edit the subtitles?<\/h3><\/dt>\n<dd><p>Yes. Both an SRT and a VTT file are added to your Media Library. The player uses\nthe VTT, so edit that file (or replace it) to change what viewers see.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20language%20fails%3F\"><h3>What happens if a language fails?<\/h3><\/dt>\n<dd><p>The failure and its reason are shown on the video's dubbing screen, and nothing is\npublished. Minutes for a failed job are refunded by the service.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20my%20theme%27s%20player%3F\"><h3>Does it work with my theme's player?<\/h3><\/dt>\n<dd><p>The block and the shortcode render their own lightweight player, because\nswitching audio tracks requires control over playback. Your original video stays\na normal attachment and can still be used anywhere else.<\/p><\/dd>\n<dt id=\"does%20the%20language%20switcher%20work%20on%20iphone%3F\"><h3>Does the language switcher work on iPhone?<\/h3><\/dt>\n<dd><p>Yes. The player keeps the video muted and plays the dubbed track alongside it,\nwhich is the arrangement iOS permits, and it stops both together when the system\ninterrupts one of them \u2014 losing your headphones pauses the video rather than\nleaving a silent picture.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.5.2<\/h4>\n\n<ul>\n<li>The videos list and a video's dubbing screen load their styles and scripts again (lost in the 0.5.1 rename).<\/li>\n<\/ul>\n\n<h4>0.5.1<\/h4>\n\n<ul>\n<li>Renamed to Shelfcompass Video Voice Translator; the plugin now installs as shelfcompass-video-voice-translator, which is also its text domain.<\/li>\n<\/ul>\n\n<h4>0.5.0<\/h4>\n\n<ul>\n<li>Nothing is sent to dubanyvideo.com until you connect: the settings screen no longer fetches the price list on an unconnected site, and requests no longer carry the site's address in their User-Agent.<\/li>\n<li>Dubbing, deleting a language, retrying, reviewing and previewing check permission for that particular video, so an Author can act only on their own uploads.<\/li>\n<li>The \"Create a draft page with this video\" button now works.<\/li>\n<li>Every option, meta key, hook, handle and class uses the <code>dubanyvideo<\/code> prefix. A site that ran a pre-release build has to connect again, and videos dubbed with it no longer show their languages; the audio and subtitle files stay in the Media Library.<\/li>\n<\/ul>\n\n<h4>0.4.9<\/h4>\n\n<ul>\n<li>A Contact screen: write to us from wp-admin, with your account and plan already attached, or use the email address beside the form when the connection itself is what is broken. A rejected message stays in the box instead of being lost.<\/li>\n<li>When every language of a video is finished, you land back on that video's own screen \u2014 each language with its player, its files, an edit that re-dubs it, and a delete \u2014 instead of a dead-end preview page. A failure keeps you where the error and the retry are.<\/li>\n<li>The video list sorts by name or by upload date.<\/li>\n<li>The audio switcher under the player is a menu rather than a row of buttons: a library with a dozen languages no longer wraps into a wall or scrolls the wanted language off-screen, and a phone gets the system picker.<\/li>\n<li>Admin screens and the player redrawn on one set of design tokens, with a dark mode that follows the visitor's system setting.<\/li>\n<li>A balance of zero that came from a refused starter grant now says so \u2014 \"this network or this site already had the free minutes\" \u2014 instead of reading as a billing fault.<\/li>\n<\/ul>\n\n<h4>0.4.4<\/h4>\n\n<ul>\n<li>Deleting the plugin now revokes this site's key on the service and removes the plugin's own options, so a reinstall starts from the connect step instead of announcing a connection the owner thought they had removed. Dubbed audio, subtitles and their attachment records are left alone \u2014 they are your media.<\/li>\n<\/ul>\n\n<h4>0.4.3<\/h4>\n\n<ul>\n<li>Settings screen lists the plans, with prices fetched from the service rather than compiled into the plugin, the current plan marked, and the per-hour price derived from the quota. Cards in a row now share one width and one baseline.<\/li>\n<\/ul>\n\n<h4>0.4.2<\/h4>\n\n<ul>\n<li>Settings screen: account, plan and balance as three cards, with what a minute buys stated outright (one dubbed language costs a minute per minute of video, transcription for review half of that, same voices on every plan) and a link to upgrade or buy minutes. Disconnecting moved to a quiet footer row.<\/li>\n<\/ul>\n\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>A balance of zero now says which zero it is: free minutes held back until the\naccount's email is confirmed are named as such, instead of sending you to the\npricing page for minutes you already have.<\/li>\n<li>Plan names read as names, not as database values.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>A first-run screen that says what the plugin needs before it can dub anything:\nconnect an account, then add a video. Activation lands there instead of on a\nscreen whose only offer was an upload that could not lead anywhere.<\/li>\n<li>Every admin screen rebuilt on one layout \u2014 panels, headers and state pills that\nmatch across the videos list, the settings, the dubbing screen and the editor.<\/li>\n<li>The editor no longer loads its own copy of shared styles.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Connect this site with one press: you sign in on dubanyvideo.com and approve\nthe site by name, and the plugin fetches its own key. Copying a key between two\ntabs was the step people abandoned the setup on.<\/li>\n<li>The settings screen now leads with the connection \u2014 the account, the plan, the\nminutes left and the site it is connected as \u2014 and offers <em>Disconnect this\nsite<\/em>, which revokes the key on our side. Audio already in your Media Library\nkeeps playing.<\/li>\n<li>Free accounts get 10 minutes once, on connecting, so a first dub can be heard\nbefore anything is bought.<\/li>\n<li>Entering a key by hand is still there, collapsed under <em>Enter a key manually<\/em>,\nfor an existing key or a site that cannot reach dubanyvideo.com in a browser.<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>\"Watch with the video\": a finished dub can be checked in the real player from\nthe dubbing and review screens, before the video is on any page. Listening to\nthe mp3 never showed whether the dub sits on the picture.<\/li>\n<li>The script editor no longer appears while a video is still being transcribed;\nthat screen now says what is running and what comes next.<\/li>\n<li>Finished audio shows its length straight away instead of \"0:00 \/ 0:00\".<\/li>\n<li>The shortcode accepts force=\"on\" to make its default language win over the\nviewer's remembered choice.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Reviewable dubbing: a video can be transcribed and translated first, then the\ntranscript, timings, speakers and per-speaker voices edited before any audio is\ngenerated. Editing a finished language marks it out of date so it can be\nregenerated deliberately.<\/li>\n<li>The source-language transcript returned with every dub is now imported and\noffered in the player as the \"Original\" subtitle track.<\/li>\n<li>A videos screen with dubbing state, the cost and remaining minutes shown before\na dub starts, live per-language progress, in-place preview of finished audio,\nand a \"Dubbed video\" block for the editor.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release: a videos screen with dubbing state, per-language dubbing with the\ncost shown before it is spent, live progress, automatic import of audio and\nsubtitles into your Media Library, a <em>Dubbed video<\/em> block and a shortcode\nplayer with an audio language switcher.<\/li>\n<\/ul>","raw_excerpt":"Generate AI voice-over for your videos in 31 languages and play them with a language switcher. Audio and subtitles land in your own Media Library.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/374219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=374219"}],"author":[{"embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/shelfcompass"}],"wp:attachment":[{"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=374219"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=374219"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=374219"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=374219"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=374219"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=374219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}