{"id":38449,"date":"2025-09-10T07:00:00","date_gmt":"2025-09-10T14:00:00","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=38449"},"modified":"2025-09-05T11:56:30","modified_gmt":"2025-09-05T18:56:30","slug":"making-videos-accessible-at-scale-using-ai","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai","title":{"rendered":"Making Videos Accessible at Scale Using AI"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>I\u2019ve recently been learning about web accessibility in order to write the <a href=\"https:\/\/cloudinary.com\/documentation\/accessible_media\">Accessible Media guide<\/a> in the Cloudinary docs. The guide focuses on how to make use of Cloudinary functionality to help make the images and videos on your website accessible to everyone. This means adding alternative text to images, captions to videos, considering the use of colors, animations, and much more.<\/p>\n<p>In our docs, we have well over 100 video tutorials, with more being added at an unrelenting pace. A few of these already had captions, but most didn\u2019t, so it was about time we practiced what we preached and made our own videos accessible.<\/p>\n<p>Cloudinary\u2019s AI-powered features make video accessibility achievable at scale. The <a href=\"https:\/\/cloudinary.com\/documentation\/video_transcription#requesting_transcription\">Cloudinary transcription service<\/a> automatically creates transcripts from videos using advanced AI, which can be used for captions, and has the added benefit of offering AI-powered translations and enabling auto-chaptering. Translations are great for engaging wider, global audiences, and chaptering can help viewers and screen readers navigate through your videos more easily. So, in addition to adding captions, I decided to leverage these AI capabilities to add these features at the same time.<\/p>\n<p>Due to the number of videos, manual processing wasn\u2019t feasible. Fortunately, Cloudinary\u2019s AI automation made it possible to process our entire video library efficiently.<\/p>\n<h2>A Scripted Approach<\/h2>\n<p>To leverage Cloudinary\u2019s AI-powered accessibility features across our video library, I needed to create a solution that would invoke transcription, translation, and auto-chaptering on a list of videos, referenced by their public IDs. The implementation called for transcription and translation in multiple languages, including different flavors of French and Portuguese, Spanish, German, Hindi, Japanese, Chinese, and Vietnamese.<\/p>\n<p>The solution, a vibe-coded node.js script, processes multiple videos efficiently and can be found here: <a href=\"https:\/\/github.com\/cloudinary-devs\/video-tutorial-accessibility\">https:\/\/github.com\/cloudinary-devs\/video-tutorial-accessibility<\/a>.<\/p>\n<p>The key part is the call to the <code>explicit<\/code> method of the Upload API to trigger Cloudinary\u2019s AI processing:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">const<\/span> result = <span class=\"hljs-keyword\">await<\/span> cloudinary.uploader.explicit(publicId, explicitOptions);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Where the explicitOptions are defined as:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">   <span class=\"hljs-keyword\">const<\/span> explicitOptions = {\n      <span class=\"hljs-attr\">resource_type<\/span>: <span class=\"hljs-string\">'video'<\/span>,\n      <span class=\"hljs-attr\">type<\/span>: options.type || <span class=\"hljs-string\">'upload'<\/span>,\n      \n      <span class=\"hljs-comment\">\/\/ Enable automatic chaptering<\/span>\n      <span class=\"hljs-attr\">auto_chaptering<\/span>: <span class=\"hljs-literal\">true<\/span>,\n      \n      <span class=\"hljs-comment\">\/\/ Enable automatic transcription with translations<\/span>\n      <span class=\"hljs-attr\">auto_transcription<\/span>: {\n        <span class=\"hljs-attr\">translate<\/span>: TRANSLATION_LANGUAGES\n      },\n      \n      <span class=\"hljs-comment\">\/\/ Optional: Invalidate cached versions<\/span>\n      <span class=\"hljs-attr\">invalidate<\/span>: options.invalidate || <span class=\"hljs-literal\">false<\/span>,\n      \n      <span class=\"hljs-comment\">\/\/ Optional: Notification URL for completion webhook<\/span>\n      ...(options.notification_url &amp;&amp; { <span class=\"hljs-attr\">notification_url<\/span>: options.notification_url })\n    };\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Auto-chaptering is activated simply by setting the <code>auto_chaptering<\/code> parameter to <code>true<\/code>. The AI analyzes the video content to automatically identify natural break points and create meaningful chapter divisions.<\/p>\n<p>Auto-transcription and translation is invoked by setting the translate parameter of the <code>auto_transcription<\/code> option to an array of languages, defined as follows:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Translation languages as specified<\/span>\n<span class=\"hljs-keyword\">const<\/span> TRANSLATION_LANGUAGES = &#91;\n  <span class=\"hljs-string\">'fr-FR'<\/span>,  <span class=\"hljs-comment\">\/\/ French (France)<\/span>\n  <span class=\"hljs-string\">'fr-CA'<\/span>,  <span class=\"hljs-comment\">\/\/ French (Canada) <\/span>\n  <span class=\"hljs-string\">'es'<\/span>,     <span class=\"hljs-comment\">\/\/ Spanish<\/span>\n  <span class=\"hljs-string\">'de'<\/span>,     <span class=\"hljs-comment\">\/\/ German<\/span>\n  <span class=\"hljs-string\">'pt-PT'<\/span>,  <span class=\"hljs-comment\">\/\/ Portuguese (Portugal)<\/span>\n  <span class=\"hljs-string\">'pt-BR'<\/span>,  <span class=\"hljs-comment\">\/\/ Portuguese (Brazil)<\/span>\n  <span class=\"hljs-string\">'hi'<\/span>,     <span class=\"hljs-comment\">\/\/ Hindi<\/span>\n  <span class=\"hljs-string\">'ja'<\/span>,     <span class=\"hljs-comment\">\/\/ Japanese<\/span>\n  <span class=\"hljs-string\">'zh-CN'<\/span>,  <span class=\"hljs-comment\">\/\/ Chinese (Simplified)<\/span>\n  <span class=\"hljs-string\">'vi'<\/span>      <span class=\"hljs-comment\">\/\/ Vietnamese<\/span>\n];\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>If you only want transcription, without translation, just set <code>auto_transcription<\/code> to <code>true<\/code>.<\/p>\n<p>Translation requires you to have a subscription to the <a href=\"https:\/\/cloudinary.com\/documentation\/translation_addons\">Google Translation add-on<\/a>. You can <a href=\"https:\/\/console.cloudinary.com\/app\/settings\/addons\">register for the free tier<\/a> in the Cloudinary Console.<\/p>\n<p>So, with the script set up, I simply had to specify the public IDs of the videos I wanted to process in <a href=\"https:\/\/github.com\/cloudinary-devs\/video-tutorial-accessibility\/blob\/main\/video-ids.txt\">video-ids.txt<\/a>.<\/p>\n<p>After running the script, each video now had a set of files associated with it:<\/p>\n<ul>\n<li>\n<strong>{video-id}-chapters.vtt<\/strong>. Video chapters\/timestamps.<\/li>\n<li>\n<strong>{video-id}.transcript<\/strong>. Main transcript (original language).<\/li>\n<li>\n<strong>{video-id}.{language}.transcript<\/strong>. Translated transcripts (one for each language).<\/li>\n<\/ul>\n<h2>Tuning the Player<\/h2>\n<p>For each of the video tutorials in the docs, I needed to configure the Video Player to display the AI-generated chapters, captions, and subtitles created by Cloudinary\u2019s transcription and translation services.<\/p>\n<p>Here\u2019s how it looks:<\/p>\n<p>First, there\u2019s the HTML element that the Video Player renders in:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" 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\">div<\/span> <span class=\"hljs-attr\">style<\/span>=<span class=\"hljs-string\">\"text-align:center; max-width: 800px; display: block; margin: 0 auto;\"<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">video<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"media\"<\/span> <span class=\"hljs-attr\">controls<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"cld-video-player cld-fluid\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">video<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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<p>Then there\u2019s the JavaScript configuration:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-comment\">&lt;!-- The Video Player scripts--&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link<\/span> <span class=\"hljs-attr\">rel<\/span>=<span class=\"hljs-string\">\"stylesheet\"<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"https:\/\/cdn.jsdelivr.net\/npm\/cloudinary-video-player@3.3.0\/dist\/cld-video-player.min.css\"<\/span> <span class=\"hljs-attr\">crossorigin<\/span>=<span class=\"hljs-string\">\"anonymous\"<\/span> <span class=\"hljs-attr\">referrerpolicy<\/span>=<span class=\"hljs-string\">\"no-referrer\"<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/cdn.jsdelivr.net\/npm\/cloudinary-video-player@3.3.0\/dist\/cld-video-player.min.js\"<\/span> <span class=\"hljs-attr\">crossorigin<\/span>=<span class=\"hljs-string\">\"anonymous\"<\/span> <span class=\"hljs-attr\">referrerpolicy<\/span>=<span class=\"hljs-string\">\"no-referrer\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"actionscript\">\n<span class=\"hljs-keyword\">var<\/span> media = cloudinary.videoPlayer(<span class=\"hljs-string\">'media'<\/span>, { \n  cloudName: <span class=\"hljs-string\">'cloudinary'<\/span>,\n  chaptersButton: <span class=\"hljs-literal\">true<\/span>,\n  posterOptions: { publicId: <span class=\"hljs-string\">\"training\/Upload_Videos\"<\/span>, start_offset: <span class=\"hljs-number\">14<\/span>, format:<span class=\"hljs-string\">\"jpg\"<\/span>, resource_type: <span class=\"hljs-string\">\"video\"<\/span>, transformation: { transformation: <span class=\"hljs-string\">\"black_border\"<\/span> } }, \n  playbackRates: &#91;<span class=\"hljs-number\">0.5<\/span>, <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">1.25<\/span>, <span class=\"hljs-number\">1.5<\/span>, <span class=\"hljs-number\">2<\/span>] });\n\nmedia.source(\n  <span class=\"hljs-string\">'training\/Upload_Videos'<\/span>,\n  {\n    chapters: <span class=\"hljs-literal\">true<\/span>,\n    textTracks: {\n      captions: {\n        label: <span class=\"hljs-string\">'English (Original)'<\/span>,\n        <span class=\"hljs-keyword\">default<\/span>: <span class=\"hljs-literal\">true<\/span>,\n      },\n      options: {\n        theme: <span class=\"hljs-string\">'videojs-default'<\/span>,\n      },\n      subtitles: &#91;\n        {\n          label: <span class=\"hljs-string\">'French (France)'<\/span>,\n          language: <span class=\"hljs-string\">'fr-FR'<\/span>,\n        },\n        {\n          label: <span class=\"hljs-string\">'French (Canada)'<\/span>,\n          language: <span class=\"hljs-string\">'fr-CA'<\/span>,\n        },\n        {\n          label: <span class=\"hljs-string\">'Spanish'<\/span>,\n          language: <span class=\"hljs-string\">'es'<\/span>,\n        },\n        {\n          label: <span class=\"hljs-string\">'German'<\/span>,\n          language: <span class=\"hljs-string\">'de'<\/span>,\n        },\n        {\n          label: <span class=\"hljs-string\">'Portuguese (Portugal)'<\/span>,\n          language: <span class=\"hljs-string\">'pt-PT'<\/span>,\n        },\n        {\n          label: <span class=\"hljs-string\">'Portuguese (Brazil)'<\/span>,\n          language: <span class=\"hljs-string\">'pt-BR'<\/span>,\n        },\n        {\n          label: <span class=\"hljs-string\">'Hindi'<\/span>,\n          language: <span class=\"hljs-string\">'hi'<\/span>,\n        },\n        {\n          label: <span class=\"hljs-string\">'Japanese'<\/span>,\n          language: <span class=\"hljs-string\">'ja'<\/span>,\n        },\n        {\n          label: <span class=\"hljs-string\">'Chinese'<\/span>,\n          language: <span class=\"hljs-string\">'zh-CN'<\/span>,\n        },\n        {\n          label: <span class=\"hljs-string\">'Vietnamese'<\/span>,\n          language: <span class=\"hljs-string\">'vi'<\/span>,\n        },\n      ]\n    },\n    transformation: {\n      <span class=\"hljs-string\">\"border\"<\/span>: <span class=\"hljs-string\">\"15px_solid_black\"<\/span>,\n      <span class=\"hljs-string\">\"audio_frequency\"<\/span>: <span class=\"hljs-number\">44100<\/span>\n    }\n  });\n\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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<p>The <code>videojs-default<\/code> theme ensures that the captions and subtitles are displayed with a high contrast background \u2014 another accessibility consideration.<\/p>\n<p>The configuration was then applied to all the video tutorials in the docs automatically (thanks to Cursor) to display Cloudinary\u2019s AI-generated accessibility features.<\/p>\n<p>And here\u2019s an example of how our video tutorials now look.  Feel free to try out different languages in the control panel and jump to different chapters.<\/p>\n<\/div>\n\n<div class=\"wp-block-cloudinary-markdown \"><link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/cloudinary-video-player@3.3.0\/dist\/cld-video-player.min.css\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\" \/>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/cloudinary-video-player@3.3.0\/dist\/cld-video-player.min.js\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"><\/script>\n<div style=\"text-align:center; max-width: 800px; display: block; margin: 0 auto;\">\n<video id=\"media\"  controls  class=\"cld-video-player cld-fluid\"><\/video>\n<\/div>\n<script>\nvar media = cloudinary.videoPlayer('media', { \n  cloudName: 'cloudinary',\n  chaptersButton: true,\n  posterOptions: { publicId: \"training\/Upload_Videos\", start_offset: 14, format:\"jpg\", resource_type: \"video\", transformation: { transformation: \"black_border\" } }, \n  playbackRates: [0.5, 1, 1.25, 1.5, 2] });\n\nmedia.source(\n  'training\/Upload_Videos',\n  {\n    chapters: true,\n    textTracks: {\n      captions: {\n        label: 'English (Original)',\n        default: true,\n      },\n      options: {\n        theme: 'videojs-default',\n      },\n      subtitles: [\n        {\n          label: 'French (France)',\n          language: 'fr-FR',\n        },\n        {\n          label: 'French (Canada)',\n          language: 'fr-CA',\n        },\n        {\n          label: 'Spanish',\n          language: 'es',\n        },\n        {\n          label: 'German',\n          language: 'de',\n        },\n        {\n          label: 'Portuguese (Portugal)',\n          language: 'pt-PT',\n        },\n        {\n          label: 'Portuguese (Brazil)',\n          language: 'pt-BR',\n        },\n        {\n          label: 'Hindi',\n          language: 'hi',\n        },\n        {\n          label: 'Japanese',\n          language: 'ja',\n        },\n        {\n          label: 'Chinese',\n          language: 'zh-CN',\n        },\n        {\n          label: 'Vietnamese',\n          language: 'vi',\n        },\n      ]\n    },\n    transformation: {\n      \"border\": \"15px_solid_black\",\n      \"audio_frequency\": 44100\n    }\n  });\n\n<\/script>\n<\/div>\n\n<div class=\"wp-block-cloudinary-markdown \"><p>Remember that both the transcription and translations are automatically generated using AI, so they may not be perfect.  You can always edit the files if needed, using the Transcript Editor in the <a href=\"https:\/\/console.cloudinary.com\/app\/video\/player-studio\">Video Player Studio<\/a>.<\/p>\n<p><a class=\"c-image-link\" href=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/bo_2px_solid_gray\/f_auto\/q_auto\/v1\/docs\/upload_videos_transcript_editor.png\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/bo_2px_solid_gray\/f_auto\/q_auto\/c_scale,w_700\/dpr_2.0\/docs\/upload_videos_transcript_editor.png\" alt=\"Cloudinary transcript editor\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"700\" height=\"360\"\/><\/a><\/p>\n<p>If you update the original transcription, you can regenerate the translations by deleting the <code>{video-id}.{language}.transcript<\/code> files, and requesting for them to be regenerated.  It\u2019s worth noting though, that if you know how to fix the translations too, then it\u2019s more cost-effective to manually edit them yourself.<\/p>\n<\/div>\n\n<div class=\"wp-block-cloudinary-markdown \"><h2>Future-Proofing With Presets<\/h2>\n<p>Having addressed all the existing videos, I needed to ensure that transcription, translation and chapters would be automatically generated for future uploads. The easiest way to do this was by using an <a href=\"https:\/\/cloudinary.com\/documentation\/upload_presets\">upload preset<\/a> configured with Cloudinary\u2019s AI features. Here\u2019s the upload preset configuration applied in the <a href=\"https:\/\/console.cloudinary.com\/app\/settings\/upload\/presets\">Console Settings<\/a>:<\/p>\n<p><a class=\"c-image-link\" href=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/bo_2px_solid_gray\/f_auto\/q_auto\/v1\/docs\/upload_preset_settings_auto_transcription_chaptering.png\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/bo_2px_solid_gray\/f_auto\/q_auto\/c_scale,w_700\/dpr_2.0\/docs\/upload_preset_settings_auto_transcription_chaptering.png\" alt=\"Upload preset settings\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"700\" height=\"169.5\"\/><\/a><\/p>\n<p>This upload preset can be selected when using the upload widget in the Media Library, automatically applying Cloudinary\u2019s AI-powered accessibility features to new videos. To streamline the process further, I\u2019ve also created a simple webpage containing the Cloudinary <a href=\"https:\/\/cloudinary.com\/documentation\/upload_widget\">Upload widget<\/a>, which uses the upload preset.<\/p>\n<p><a class=\"c-image-link\" href=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/bo_2px_solid_gray\/f_auto\/q_auto\/v1\/docs\/tutorial_uploads_page.png\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/bo_2px_solid_gray\/f_auto\/q_auto\/c_scale,w_700\/dpr_2.0\/docs\/tutorial_uploads_page.png\" alt=\"Tutorial uploads page\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"700\" height=\"669.5\"\/><\/a><\/p>\n<h2>Latest Developments<\/h2>\n<p>Since implementing this solution for our docs, our Video team has been busy making it even easier to add chapters, captions and subtitles.  Now, you just need to add the Cloudinary Video Player JavaScript configuration as shown above, and if the chapters, captions and subtitles don\u2019t exist, Cloudinary will automatically generate them (<a href=\"https:\/\/cloudinary.com\/documentation\/video_player_customization#ai_generation\">see the docs for more information<\/a>).<\/p>\n<h2>Wrapping It Up<\/h2>\n<p>Making video content accessible doesn\u2019t have to be an overwhelming task. Cloudinary\u2019s AI-powered transcription, translation, and chaptering capabilities transformed our library of tutorials into resources that are inclusive, engaging, and easier to navigate \u2014 all without manual intervention. The AI automatically generates accurate transcripts, translates them into multiple languages, and creates meaningful chapter divisions, making accessibility achievable at scale.<\/p>\n<p>As Cloudinary\u2019s AI capabilities continue to evolve, so does the opportunity to make accessibility a default part of video publishing, ensuring that every video uploaded can automatically become more inclusive and accessible to diverse global audiences.<\/p>\n<p>Want to dive deeper? Check out our <a href=\"https:\/\/cloudinary.com\/documentation\/accessible_media\">Accessible Media guide<\/a> to see how Cloudinary\u2019s AI-powered features can help make all your visual media more inclusive.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":51,"featured_media":38450,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[337,336,303],"class_list":["post-38449","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-accessibility","tag-ai","tag-video"],"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>Making Videos Accessible at Scale Using AI<\/title>\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\/making-videos-accessible-at-scale-using-ai\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Making Videos Accessible at Scale Using AI\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-10T14:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1757024459\/Blog_The_AI_Approach_to_Making_Videos_Accessible\/Blog_The_AI_Approach_to_Making_Videos_Accessible.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=\"carolinelevison\" \/>\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\/making-videos-accessible-at-scale-using-ai#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai\"},\"author\":{\"name\":\"carolinelevison\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/3aa69a111d568040952bbae297d8c8fb\"},\"headline\":\"Making Videos Accessible at Scale Using AI\",\"datePublished\":\"2025-09-10T14:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai\"},\"wordCount\":7,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1757024459\/Blog_The_AI_Approach_to_Making_Videos_Accessible\/Blog_The_AI_Approach_to_Making_Videos_Accessible.jpg?_i=AA\",\"keywords\":[\"Accessibility\",\"AI\",\"Video\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai\",\"url\":\"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai\",\"name\":\"Making Videos Accessible at Scale Using AI\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1757024459\/Blog_The_AI_Approach_to_Making_Videos_Accessible\/Blog_The_AI_Approach_to_Making_Videos_Accessible.jpg?_i=AA\",\"datePublished\":\"2025-09-10T14:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1757024459\/Blog_The_AI_Approach_to_Making_Videos_Accessible\/Blog_The_AI_Approach_to_Making_Videos_Accessible.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1757024459\/Blog_The_AI_Approach_to_Making_Videos_Accessible\/Blog_The_AI_Approach_to_Making_Videos_Accessible.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Making Videos Accessible at Scale Using AI\"}]},{\"@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\/3aa69a111d568040952bbae297d8c8fb\",\"name\":\"carolinelevison\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/84ac4e7f81e08358ca4d375889c0a8ffff006b90ba8a469d27d206229f779912?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/84ac4e7f81e08358ca4d375889c0a8ffff006b90ba8a469d27d206229f779912?s=96&d=mm&r=g\",\"caption\":\"carolinelevison\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Making Videos Accessible at Scale Using AI","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\/making-videos-accessible-at-scale-using-ai","og_locale":"en_US","og_type":"article","og_title":"Making Videos Accessible at Scale Using AI","og_url":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai","og_site_name":"Cloudinary Blog","article_published_time":"2025-09-10T14:00:00+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1757024459\/Blog_The_AI_Approach_to_Making_Videos_Accessible\/Blog_The_AI_Approach_to_Making_Videos_Accessible.jpg?_i=AA","type":"image\/jpeg"}],"author":"carolinelevison","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai"},"author":{"name":"carolinelevison","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/3aa69a111d568040952bbae297d8c8fb"},"headline":"Making Videos Accessible at Scale Using AI","datePublished":"2025-09-10T14:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai"},"wordCount":7,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1757024459\/Blog_The_AI_Approach_to_Making_Videos_Accessible\/Blog_The_AI_Approach_to_Making_Videos_Accessible.jpg?_i=AA","keywords":["Accessibility","AI","Video"],"inLanguage":"en-US","copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai","url":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai","name":"Making Videos Accessible at Scale Using AI","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1757024459\/Blog_The_AI_Approach_to_Making_Videos_Accessible\/Blog_The_AI_Approach_to_Making_Videos_Accessible.jpg?_i=AA","datePublished":"2025-09-10T14:00:00+00:00","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1757024459\/Blog_The_AI_Approach_to_Making_Videos_Accessible\/Blog_The_AI_Approach_to_Making_Videos_Accessible.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1757024459\/Blog_The_AI_Approach_to_Making_Videos_Accessible\/Blog_The_AI_Approach_to_Making_Videos_Accessible.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/making-videos-accessible-at-scale-using-ai#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Making Videos Accessible at Scale Using AI"}]},{"@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\/3aa69a111d568040952bbae297d8c8fb","name":"carolinelevison","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/84ac4e7f81e08358ca4d375889c0a8ffff006b90ba8a469d27d206229f779912?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/84ac4e7f81e08358ca4d375889c0a8ffff006b90ba8a469d27d206229f779912?s=96&d=mm&r=g","caption":"carolinelevison"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1757024459\/Blog_The_AI_Approach_to_Making_Videos_Accessible\/Blog_The_AI_Approach_to_Making_Videos_Accessible.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38449","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\/51"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=38449"}],"version-history":[{"count":11,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38449\/revisions"}],"predecessor-version":[{"id":38467,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38449\/revisions\/38467"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/38450"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=38449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=38449"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=38449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}