{"id":381664,"date":"2026-10-14T16:45:52","date_gmt":"2026-10-14T16:45:52","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/video-caption-studio\/"},"modified":"2026-10-14T16:45:17","modified_gmt":"2026-10-14T16:45:17","slug":"mwangip-video-captions","status":"publish","type":"plugin","link":"https:\/\/su.wordpress.org\/plugins\/mwangip-video-captions\/","author":13209897,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.3","requires":"6.5","requires_php":"8.0","requires_plugins":null,"header_name":"mwangip Video Captions","header_author":"Ceaser Mwangi","header_description":"Automatically turn the spoken audio of your WordPress videos into accurate, synchronized, editable captions.","assets_banners_color":"","last_updated":"2026-10-14 16:45:17","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.paypal.com\/donate\/?business=ceasngi%40gmail.com&no_recurring=0&item_name=Support+mwangip+Video+Captions&currency_code=USD","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/mwangip-video-captions\/","header_author_uri":"https:\/\/profiles.wordpress.org\/mwangip\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":58,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"mwangip","date":"2026-10-14 16:45:17","revision":3746802}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3746802,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3746802,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":{"mwcap\/video-caption":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"mwcap\/video-caption","title":"Video Captions","category":"media","icon":"format-video","description":"A responsive video player with automatic, styled captions.","keywords":["video","captions","subtitles"],"textdomain":"mwangip-video-captions","attributes":{"videoId":{"type":"number","default":0},"captionId":{"type":"number","default":0},"captionsEnabled":{"type":"boolean","default":true},"autoplay":{"type":"boolean","default":false},"muted":{"type":"boolean","default":false},"loop":{"type":"boolean","default":false},"posterId":{"type":"number","default":0}},"supports":{"html":false,"align":["wide","full"]},"editorScript":"file:.\/edit.js"}},"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3746802,"resolution":"1","location":"assets","locale":"","width":1174,"height":463},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3746802,"resolution":"2","location":"assets","locale":"","width":1177,"height":369},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3746802,"resolution":"3","location":"assets","locale":"","width":1174,"height":339},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3746802,"resolution":"4","location":"assets","locale":"","width":951,"height":499}},"screenshots":[]},"plugin_section":[],"plugin_tags":[1953,1981,1982,1983,222],"plugin_category":[34,50],"plugin_contributors":[268907],"plugin_business_model":[],"class_list":["post-381664","plugin","type-plugin","status-publish","hentry","plugin_tags-accessibility","plugin_tags-captions","plugin_tags-subtitles","plugin_tags-transcription","plugin_tags-video","plugin_category-accessibility","plugin_category-media","plugin_contributors-mwangip","plugin_committers-mwangip"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/mwangip-video-captions\/assets\/icon-128x128.png?rev=3746802","icon_2x":"https:\/\/ps.w.org\/mwangip-video-captions\/assets\/icon-256x256.png?rev=3746802","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/mwangip-video-captions\/assets\/screenshot-1.jpg?rev=3746802","caption":""},{"src":"https:\/\/ps.w.org\/mwangip-video-captions\/assets\/screenshot-2.jpg?rev=3746802","caption":""},{"src":"https:\/\/ps.w.org\/mwangip-video-captions\/assets\/screenshot-3.jpg?rev=3746802","caption":""},{"src":"https:\/\/ps.w.org\/mwangip-video-captions\/assets\/screenshot-4.jpg?rev=3746802","caption":""}],"raw_content":"<!--section=description-->\n<p>Pick a video from the Media Library, click <strong>Generate Automatic Captions<\/strong>, then edit, style, preview and publish.<\/p>\n\n<ul>\n<li>Automatic transcription with timestamps (word-level when your provider supplies it)<\/li>\n<li>Visual caption editor: edit text and timing, drag on the timeline, split, merge, duplicate, search, undo\/redo<\/li>\n<li>Caption styling, presets, animations and word highlighting<\/li>\n<li>Multiple caption tracks per video with a language selector<\/li>\n<li>SRT and WebVTT import\/export, JSON export<\/li>\n<li><code>[mwcap_video id=\"123\"]<\/code> shortcode and a Gutenberg block<\/li>\n<li>Background processing with progress, so long videos never block a page request<\/li>\n<li>System Status screen with FFmpeg, memory, upload and cron checks<\/li>\n<\/ul>\n\n<h4>External services<\/h4>\n\n<p>Automatic transcription needs a speech-to-text service. You choose it in <strong>Settings \u2192 Transcription<\/strong>:<\/p>\n\n<ul>\n<li><strong>API provider<\/strong> \u2014 any OpenAI-compatible <code>\/audio\/transcriptions<\/code> endpoint. No provider is preselected: you enter the base URL and API key of the service you choose (for example OpenAI, Groq, or your own Whisper server). When you press Generate, the audio of the selected video (or the video file itself when FFmpeg is unavailable), the chosen language and your API key are sent to that service. See the provider's terms and privacy policy. You must confirm this each time.<\/li>\n<li><p><strong>Local \/ self-hosted<\/strong> \u2014 a Whisper-compatible server you run yourself. Audio is sent only to the URL you configure.<\/p><\/li>\n<li><p><strong>PayPal (optional donation link)<\/strong> \u2014 the Donate links in the plugin only open paypal.com when you click them. Nothing is sent to PayPal otherwise. See https:\/\/www.paypal.com\/webapps\/mpp\/ua\/privacy-full.<\/p><\/li>\n<\/ul>\n\n<p>Nothing is sent until you start a transcription. No data is sent to the plugin author. You can also create captions manually or import SRT\/VTT without any external service.<\/p>\n\n<h4>FFmpeg<\/h4>\n\n<p>FFmpeg is optional but recommended: it extracts and splits audio so long videos work. It is not bundled; install it on your server and, if needed, set its path in Settings \u2192 Video. The plugin runs it with PHP's <code>proc_open()<\/code> using an argument array (no shell), and only with the binary path an administrator configured. If your host disables <code>proc_open()<\/code>, the plugin falls back to sending small MP4\/WebM files directly to the provider.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin and activate it.<\/li>\n<li>Open <strong>Video Captions \u2192 Settings<\/strong> and configure transcription.<\/li>\n<li>Open <strong>Caption Videos<\/strong>, select a video and generate captions.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"captions%20never%20leave%20%22waiting%20to%20start%22.\"><h3>Captions never leave \"Waiting to start\".<\/h3><\/dt>\n<dd><p>Background jobs use WP-Cron. If <code>DISABLE_WP_CRON<\/code> is set, trigger wp-cron.php from a system cron. See System Status.<\/p><\/dd>\n<dt id=\"which%20videos%20work%20without%20ffmpeg%3F\"><h3>Which videos work without FFmpeg?<\/h3><\/dt>\n<dd><p>MP4 or WebM files below your provider's size limit (typically 25 MB for hosted providers). MOV and larger files need FFmpeg.<\/p><\/dd>\n<dt id=\"why%20doesn%27t%20the%20plugin%20use%20the%20wordpress%20ai%20client%3F\"><h3>Why doesn't the plugin use the WordPress AI Client?<\/h3><\/dt>\n<dd><p>Captions need accurate segment and word timestamps from a speech-to-text (transcription) model. The AI Client bundled with WordPress 7.x covers text, image, speech-generation, music, video and embedding tasks, but has no transcription capability, so it cannot return timestamped transcripts. The plugin keeps a provider interface (<code>mwcap_transcription_provider<\/code> filter) so a core-based provider can be added once transcription is available.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Automatically turn the spoken audio of your WordPress videos into accurate, synchronized, editable captions.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/381664","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=381664"}],"author":[{"embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mwangip"}],"wp:attachment":[{"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=381664"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=381664"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=381664"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=381664"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=381664"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/su.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=381664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}