{"id":39251,"date":"2025-11-10T14:41:24","date_gmt":"2025-11-10T22:41:24","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=39251"},"modified":"2025-11-10T14:44:21","modified_gmt":"2025-11-10T22:44:21","slug":"how-to-automate-video-subtitles-and-captions","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/","title":{"rendered":"How to automate video subtitles and captions?"},"content":{"rendered":"\n<p>Teams are shipping more video than ever, and manual subtitling does not scale. In a typical week, you might edit a batch of clips, export deliverables for multiple platforms, and then scramble to produce subtitles and captions in several languages. This is a perfect use case for an automated pipeline.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Question:<\/h2>\n\n\n\n<p><em>I\u2019m building a workflow for my team and want to minimize manual work on accessibility. How to automate video subtitles and captions? Ideally I want to generate text from audio, create SRT and VTT, optionally translate, and then either ship sidecar tracks or embed them in the video. I\u2019m looking for a vendor-neutral approach using common tools like FFmpeg, plus tips for hosting and delivery. Any examples for batch processing would be great.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Answer:<\/h2>\n\n\n\n<p>You can automate captions using a three-stage pipeline: transcribe, format, and deliver. Start with speech-to-text, convert results to subtitle formats, then attach them to your videos for players and platforms that support closed captions. Here is a battle-tested approach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1) Transcribe audio to text with timestamps<\/h2>\n\n\n\n<p>Use an automatic speech recognition engine to generate time-coded text. Many teams use local or cloud ASR. A lightweight example with the open source Whisper CLI:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\"># 1. Install whisper (example: pip install openai-whisper ffmpeg-python)<\/span>\n<span class=\"hljs-comment\"># 2. Generate SRT and VTT for a single video<\/span>\nwhisper input.mp4 --task transcribe --language en --model small --output_format srt,vtt --output_dir subs\n\n<span class=\"hljs-comment\"># Batch process all MP4s in a folder<\/span>\n<span class=\"hljs-keyword\">for<\/span> f in *.mp4; <span class=\"hljs-keyword\">do<\/span>\n\u00a0 whisper <span class=\"hljs-string\">\"$f\"<\/span> --task transcribe --language en --model small --output_format srt,vtt --output_dir subs\ndone<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Tips:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Preprocess audio for accuracy by downmixing to mono, normalize levels, and remove silence.<\/li>\n\n\n\n<li>Keep line length under 42 characters and target reading speed around 15 cps.<\/li>\n\n\n\n<li>Choose captions for accessibility with non-speech cues vs subtitles for dialog only.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2) Convert and validate subtitle formats<\/h2>\n\n\n\n<p>You will primarily use SRT and <a href=\"https:\/\/cloudinary.com\/glossary\/webvtt\">WebVTT<\/a>. SRT is widely supported, while VTT is the native format for HTML5 tracks. If your ASR outputs only one format, convert as needed. You can use FFmpeg and text tools in your scripts.&nbsp;<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\"># Example: ensure UTF-8 without BOM and Unix line endings<\/span>\ndos2unix subs\/input.en.srt\niconv -f utf<span class=\"hljs-number\">-8<\/span> -t utf<span class=\"hljs-number\">-8<\/span> -c subs\/input.en.srt &gt; subs\/input.en.clean.srt\n\n<span class=\"hljs-comment\"># Optional: translate subtitles in your pipeline, then output per-locale files<\/span>\n<span class=\"hljs-comment\"># subs\/input.es.vtt, subs\/input.fr.vtt, etc.<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3) Attach captions: sidecar or embedded<\/h2>\n\n\n\n<p>Most distribution stacks prefer sidecar VTT because it enables on-off toggling and keeps the video master clean. For web playback, use HTML5 tracks:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">video<\/span> <span class=\"hljs-attr\">controls<\/span> <span class=\"hljs-attr\">crossorigin<\/span>=<span class=\"hljs-string\">\"anonymous\"<\/span> <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"800\"<\/span>&gt;<\/span>\n\u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"videos\/intro.mp4\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"video\/mp4\"<\/span>&gt;<\/span>\n\u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">track<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"subs\/intro.en.vtt\"<\/span> <span class=\"hljs-attr\">kind<\/span>=<span class=\"hljs-string\">\"subtitles\"<\/span> <span class=\"hljs-attr\">srclang<\/span>=<span class=\"hljs-string\">\"en\"<\/span> <span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"English\"<\/span> <span class=\"hljs-attr\">default<\/span>&gt;<\/span>\n\u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">track<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"subs\/intro.es.vtt\"<\/span> <span class=\"hljs-attr\">kind<\/span>=<span class=\"hljs-string\">\"subtitles\"<\/span> <span class=\"hljs-attr\">srclang<\/span>=<span class=\"hljs-string\">\"es\"<\/span> <span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"Espa\u00f1ol\"<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">video<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If you must embed captions in MP4, use FFmpeg with mov_text:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\"># Embed SRT as a subtitle track in MP4<\/span>\nffmpeg -i input.mp4 -i subs\/input.en.srt -c copy -c:s mov_text output-with-cc.mp4<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>MP4 is widely supported across devices. If you are delivering HLS or DASH, keep captions as WebVTT sidecars to align with streaming best practices described in <a href=\"https:\/\/cloudinary.com\/guides\/web-performance\/video-encoding-how-it-works-formats-best-practices\">video encoding best practices<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4) QA and automation tips<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Run a linter check for SRT numbering and overlapping cues.<\/li>\n\n\n\n<li>Normalize punctuation, fix capitalization, and label speakers where needed.<\/li>\n\n\n\n<li>Store per-locale files using a consistent pattern.<\/li>\n\n\n\n<li>Treat subtitle files as build artifacts and publish them alongside the video.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Enhance or host the workflow with Cloudinary<\/h2>\n\n\n\n<p>After you generate SRT and VTT, you can upload and deliver everything from a single place. For example, upload your video and subtitles, then play them with standard HTML5 tracks using Cloudinary delivery URLs.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Node.js example<\/span>\nimport { v2 <span class=\"hljs-keyword\">as<\/span> cloudinary } from <span class=\"hljs-string\">\"cloudinary\"<\/span>;\n\ncloudinary.config({\n\u00a0 cloud_name: <span class=\"hljs-string\">\"&lt;cloud_name&gt;\"<\/span>,\n\u00a0 api_key: <span class=\"hljs-string\">\"&lt;api_key&gt;\"<\/span>,\n\u00a0 api_secret: <span class=\"hljs-string\">\"&lt;api_secret&gt;\"<\/span>\n});\n\n<span class=\"hljs-comment\">\/\/ Upload video<\/span>\nawait cloudinary.uploader.upload(<span class=\"hljs-string\">\"input.mp4\"<\/span>, {\n\u00a0 resource_type: <span class=\"hljs-string\">\"video\"<\/span>,\n\u00a0 public_id: <span class=\"hljs-string\">\"demos\/intro\"<\/span>\n});\n\n<span class=\"hljs-comment\">\/\/ Upload VTT as raw<\/span>\nawait cloudinary.uploader.upload(<span class=\"hljs-string\">\"subs\/input.en.vtt\"<\/span>, {\n\u00a0 resource_type: <span class=\"hljs-string\">\"raw\"<\/span>,\n\u00a0 public_id: <span class=\"hljs-string\">\"demos\/intro.en\"<\/span>\n});\n\n&lt;video controls width=<span class=\"hljs-string\">\"800\"<\/span>&gt;\n\u00a0 &lt;source src=<span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/&lt;cloud_name&gt;\/video\/upload\/demos\/intro.mp4\"<\/span> type=<span class=\"hljs-string\">\"video\/mp4\"<\/span>&gt;\n\u00a0 &lt;track src=<span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/&lt;cloud_name&gt;\/raw\/upload\/demos\/intro.en.vtt\"<\/span>\n\u00a0 \u00a0 \u00a0 \u00a0 kind=<span class=\"hljs-string\">\"subtitles\"<\/span> srclang=<span class=\"hljs-string\">\"en\"<\/span> label=<span class=\"hljs-string\">\"English\"<\/span> <span class=\"hljs-keyword\">default<\/span>&gt;\n&lt;\/video&gt;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If you need format conversions in your toolchain, Cloudinary\u2019s <a href=\"https:\/\/cloudinary.com\/tools\">tools<\/a> can speed up quick tests and one-off conversions while your pipeline handles batch work.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>No captions in MP4 after embed:<\/strong> Ensure <code>-c:s mov_text<\/code>.<\/li>\n\n\n\n<li><strong>Subtitles out of sync:<\/strong> Align the ASR timestamps or re-time with offsets.<\/li>\n\n\n\n<li><strong>Tracks not showing in HTML5:<\/strong> Confirm <code>srclang<\/code> and file encoding is UTF-8.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR<\/h2>\n\n\n\n<p>Automate captions with an ASR step, output SRT and VTT, then deliver as sidecar tracks for HTML5 or embed them with FFmpeg where required. Validate cues, store per-locale files consistently, and host both video and subtitles from a single origin for reliable delivery.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Learn More<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/cloudinary.com\/guides\/video\/video-as-a-service\">Video as a Service<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/guides\/video\/video-engineering\">Video Engineering<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/tools\/mkv-to-mp4\">MKV to MP4<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/tools\/webm-to-mp4\">WEBM to MP4<\/a><\/li>\n<\/ul>\n\n\n\n<p>Ready to streamline captioning and delivery across your stack? <a href=\"https:\/\/cloudinary.com\/users\/register_free\">Sign up for Cloudinary free<\/a> and start managing your videos and subtitle tracks in one place.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Teams are shipping more video than ever, and manual subtitling does not scale. In a typical week, you might edit a batch of clips, export deliverables for multiple platforms, and then scramble to produce subtitles and captions in several languages. This is a perfect use case for an automated pipeline. Question: I\u2019m building a workflow [&hellip;]<\/p>\n","protected":false},"author":88,"featured_media":39253,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[423],"class_list":["post-39251","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-questions"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How to automate video subtitles and captions?<\/title>\n<meta name=\"description\" content=\"Teams are shipping more video than ever, and manual subtitling does not scale. In a typical week, you might edit a batch of clips, export deliverables for\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to automate video subtitles and captions?\" \/>\n<meta property=\"og:description\" content=\"Teams are shipping more video than ever, and manual subtitling does not scale. In a typical week, you might edit a batch of clips, export deliverables for\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-10T22:41:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-10T22:44:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814644\/how_to_automate_video_subtitles_and_captions_featured_image\/how_to_automate_video_subtitles_and_captions_featured_image.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"damjanantevski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/\"},\"author\":{\"name\":\"damjanantevski\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e\"},\"headline\":\"How to automate video subtitles and captions?\",\"datePublished\":\"2025-11-10T22:41:24+00:00\",\"dateModified\":\"2025-11-10T22:44:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/\"},\"wordCount\":581,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814644\/how_to_automate_video_subtitles_and_captions_featured_image\/how_to_automate_video_subtitles_and_captions_featured_image.jpg?_i=AA\",\"keywords\":[\"Questions\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/\",\"name\":\"How to automate video subtitles and captions?\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814644\/how_to_automate_video_subtitles_and_captions_featured_image\/how_to_automate_video_subtitles_and_captions_featured_image.jpg?_i=AA\",\"datePublished\":\"2025-11-10T22:41:24+00:00\",\"dateModified\":\"2025-11-10T22:44:21+00:00\",\"description\":\"Teams are shipping more video than ever, and manual subtitling does not scale. In a typical week, you might edit a batch of clips, export deliverables for\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814644\/how_to_automate_video_subtitles_and_captions_featured_image\/how_to_automate_video_subtitles_and_captions_featured_image.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814644\/how_to_automate_video_subtitles_and_captions_featured_image\/how_to_automate_video_subtitles_and_captions_featured_image.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to automate video subtitles and captions?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e\",\"name\":\"damjanantevski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g\",\"caption\":\"damjanantevski\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to automate video subtitles and captions?","description":"Teams are shipping more video than ever, and manual subtitling does not scale. In a typical week, you might edit a batch of clips, export deliverables for","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/","og_locale":"en_US","og_type":"article","og_title":"How to automate video subtitles and captions?","og_description":"Teams are shipping more video than ever, and manual subtitling does not scale. In a typical week, you might edit a batch of clips, export deliverables for","og_url":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/","og_site_name":"Cloudinary Blog","article_published_time":"2025-11-10T22:41:24+00:00","article_modified_time":"2025-11-10T22:44:21+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814644\/how_to_automate_video_subtitles_and_captions_featured_image\/how_to_automate_video_subtitles_and_captions_featured_image.jpg?_i=AA","type":"image\/jpeg"}],"author":"damjanantevski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/"},"author":{"name":"damjanantevski","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e"},"headline":"How to automate video subtitles and captions?","datePublished":"2025-11-10T22:41:24+00:00","dateModified":"2025-11-10T22:44:21+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/"},"wordCount":581,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814644\/how_to_automate_video_subtitles_and_captions_featured_image\/how_to_automate_video_subtitles_and_captions_featured_image.jpg?_i=AA","keywords":["Questions"],"inLanguage":"en-US","copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/","url":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/","name":"How to automate video subtitles and captions?","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814644\/how_to_automate_video_subtitles_and_captions_featured_image\/how_to_automate_video_subtitles_and_captions_featured_image.jpg?_i=AA","datePublished":"2025-11-10T22:41:24+00:00","dateModified":"2025-11-10T22:44:21+00:00","description":"Teams are shipping more video than ever, and manual subtitling does not scale. In a typical week, you might edit a batch of clips, export deliverables for","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814644\/how_to_automate_video_subtitles_and_captions_featured_image\/how_to_automate_video_subtitles_and_captions_featured_image.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814644\/how_to_automate_video_subtitles_and_captions_featured_image\/how_to_automate_video_subtitles_and_captions_featured_image.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-automate-video-subtitles-and-captions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to automate video subtitles and captions?"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e","name":"damjanantevski","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g","caption":"damjanantevski"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814644\/how_to_automate_video_subtitles_and_captions_featured_image\/how_to_automate_video_subtitles_and_captions_featured_image.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39251","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/88"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=39251"}],"version-history":[{"count":1,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39251\/revisions"}],"predecessor-version":[{"id":39252,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39251\/revisions\/39252"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/39253"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=39251"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=39251"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=39251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}