{"id":21661,"date":"2018-01-17T18:25:48","date_gmt":"2018-01-17T18:25:48","guid":{"rendered":"http:\/\/with_automatic_video_subtitles_silence_speaks_volumes"},"modified":"2025-03-09T06:58:33","modified_gmt":"2025-03-09T13:58:33","slug":"with_automatic_video_subtitles_silence_speaks_volumes","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes","title":{"rendered":"Auto Generate Subtitles Based on Video Transcript"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>The last time you scrolled through the feed on your favorite social site, chances are that some <a href=\"https:\/\/cloudinary.com\/blog\/optimizing_video_with_cloudinary_and_the_html5_video_player_part_1\">videos<\/a> caught your attention, and chances are, they were playing silently.<\/p>\n<p>On the other hand, what was your reaction the last time you opened a web page and a <a href=\"https:\/\/cloudinary.com\/documentation\/video_manipulation_and_delivery\">video<\/a> unexpectedly began playing with sound? If you are anything like me, the first thing you did was to quickly hunt for the fastest way to pause the video, mute the sound, or close the page entirely, especially if you were in a public place at the time.<\/p>\n<p>If you identify with these scenarios, you are far from alone. A huge proportion of the viewers on social sites and other media-heavy platforms choose to <a href=\"https:\/\/cloudinary.com\/video_api\">view video without sound<\/a>. In fact, 2016 studies show that on Facebook, <a href=\"https:\/\/digiday.com\/media\/silent-world-facebook-video\/\">around 85% of video was viewed with the sound off<\/a>.<\/p>\n<p>But when you are the developer of a website or mobile app with lots of user-generated video content, the consumer expectation for silent video becomes a challenge. All your app users who want to upload their videos of recipes, art projects, makeup tips, travel recommendations, or how to\u2026[anything] are generally very reliant on accompanying explanations to capture and keep attention.<\/p>\n<p>The solution? Subtitles, of-course. Even better? Auto generated subtitles!<\/p>\n<p><a href=\"https:\/\/cloudinary.com\/\">Cloudinary<\/a>, the leader in end-to-end image and video media management, has released the <strong><a href=\"https:\/\/cloudinary.com\/addons#google_speech\">Google AI Video Transcription Add-on<\/a><\/strong>, so you can easily offer automatically generated subtitles for your users\u2019 (or your own) videos.<\/p>\n<p>This is part of a series of articles about <a href=\"https:\/\/cloudinary.com\/guides\/web-performance\/video-optimization-why-you-need-it-and-5-critical-best-practices\">video optimization<\/a>.<\/p>\n<div style=\"text-align:center;\">\n<a href=\"https:\/\/cloudinary.com\/addons#google_speech\" target =\"_blank\"><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_500\/dpr_auto\/Transcription_Add-on.png\" alt=\"Google AI Video Transcription Add-on registration\" title=\"Google AI Video Transcription Add-on registration\" \/><\/a>\n<\/div>\n<h2>Subtitles can speak louder than words<\/h2>\n<p>When people scroll through posts or search results with multiple autoplay videos, a particular video has only a second or two to capture viewers\u2019 attention. And since the video creators can\u2019t rely on sound in most cases, it\u2019s almost mandatory to provide text <a href=\"https:\/\/cloudinary.com\/glossary\/captions\">captions<\/a> to get their viewers interested and to keep them watching, and maybe even to get them interested enough to click on the video and watch (with or without sound) till the end.<\/p>\n<p>The Video Transcription add-on lets you request automatic voice transcription upon upload of any video (or for any video already in your account). The request returns a file containing the full transcript of your video, exactly aligned to the timings of each spoken word.<\/p>\n<p>The auto generated subtitles are created using Google\u2019s <a href=\"https:\/\/cloud.google.com\/speech\/\">Cloud Speech API<\/a>, which applies their continuously advancing artificial intelligence algorithms to maximize the quality of the speech recognition results.<\/p>\n<p>When you deliver the video, you can automatically include its transcript in the form of subtitles.<\/p>\n<h3>The upload request<\/h3>\n<p>To request the transcript of a video upon upload (once you\u2019ve registered for the transcription add-on), just set the <code>raw_convert<\/code> upload parameter to <code>google_speech<\/code>. Since it can sometimes take a while to get the transcript back from Google, you may also want to add a <code>notification_url<\/code> to the request, so you can programmatically check when it\u2019s ready:<\/p>\n<cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;ruby&quot;,&quot;framework&quot;:&quot;ruby&quot;,&quot;language&quot;:&quot;ruby&quot;,&quot;displayName&quot;:&quot;Ruby&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;Cloudinary::Uploader.upload(\\&quot;lincoln.mp4\\&quot;, \\n   :resource_type =&gt; :video, :public_id =&gt;\\&quot;lincoln\\&quot;,  \\n   :notification_url =&gt; \\&quot;https:\\\/\\\/requestb.in\\\/abcd123yz\\&quot;, \\n   :raw_convert =&gt; \\&quot;google_speech\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;Cloudinary::Uploader.upload(\\&quot;lincoln.mp4\\&quot;, \\n   :resource_type =&gt; :video, :public_id =&gt;\\&quot;lincoln\\&quot;,  \\n   :notification_url =&gt; \\&quot;https:\\\/\\\/requestb.in\\\/abcd123yz\\&quot;, \\n   :raw_convert =&gt; \\&quot;google_speech\\&quot;)&quot;},{&quot;sdkId&quot;:&quot;php&quot;,&quot;framework&quot;:&quot;php&quot;,&quot;language&quot;:&quot;php&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;rawCodeSnippet&quot;:&quot;\\\\Cloudinary\\\\Uploader::upload(\\&quot;my_video.mp4\\&quot;, \\n    array(\\&quot;resource_type\\&quot; =&gt; \\&quot;video\\&quot;, \\&quot;public_id\\&quot; =&gt; \\&quot;lincoln\\&quot;,\\n    \\&quot;notification_url\\&quot; =&gt; \\&quot;https:\\\/\\\/requestb.in\\\/abcd123yz\\&quot;, \\n    \\&quot;raw_convert\\&quot; =&gt; \\&quot;google_speech\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;\\\\Cloudinary\\\\Uploader::upload(\\&quot;my_video.mp4\\&quot;, \\n    array(\\&quot;resource_type\\&quot; =&gt; \\&quot;video\\&quot;, \\&quot;public_id\\&quot; =&gt; \\&quot;lincoln\\&quot;,\\n    \\&quot;notification_url\\&quot; =&gt; \\&quot;https:\\\/\\\/requestb.in\\\/abcd123yz\\&quot;, \\n    \\&quot;raw_convert\\&quot; =&gt; \\&quot;google_speech\\&quot;));&quot;},{&quot;sdkId&quot;:&quot;python&quot;,&quot;framework&quot;:&quot;python&quot;,&quot;language&quot;:&quot;python&quot;,&quot;displayName&quot;:&quot;Python&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.uploader.upload(\\&quot;my_video.mp4\\&quot;, \\n    resource_type = \\&quot;video\\&quot;, \\&quot;public_id\\&quot; = \\&quot;lincoln\\&quot;, \\n    \\&quot;notification_url\\&quot; = \\&quot;https:\\\/\\\/requestb.in\\\/abcd123yz\\&quot;, \\n    \\&quot;raw_convert\\&quot; = \\&quot;google_speech\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.uploader.upload(\\&quot;my_video.mp4\\&quot;, \\n    resource_type = \\&quot;video\\&quot;, \\&quot;public_id\\&quot; = \\&quot;lincoln\\&quot;, \\n    \\&quot;notification_url\\&quot; = \\&quot;https:\\\/\\\/requestb.in\\\/abcd123yz\\&quot;, \\n    \\&quot;raw_convert\\&quot; = \\&quot;google_speech\\&quot;)&quot;},{&quot;sdkId&quot;:&quot;nodejs&quot;,&quot;framework&quot;:&quot;nodejs&quot;,&quot;language&quot;:&quot;javascript&quot;,&quot;displayName&quot;:&quot;Node.js&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.v2.uploader.upload(\\&quot;my_video.mp4\\&quot;,\\n   { resource_type: \\&quot;video\\&quot;, public_id: \\&quot;lincoln\\&quot;, \\n    notification_url: \\&quot;https:\\\/\\\/requestb.in\\\/abcd123yz\\&quot;, \\n    raw_convert: \\&quot;google_speech\\&quot; },\\n    function(error, result) { console.log(result); });&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.v2.uploader.upload(\\&quot;my_video.mp4\\&quot;,\\n   { resource_type: \\&quot;video\\&quot;, public_id: \\&quot;lincoln\\&quot;, \\n    notification_url: \\&quot;https:\\\/\\\/requestb.in\\\/abcd123yz\\&quot;, \\n    raw_convert: \\&quot;google_speech\\&quot; },\\n    function(error, result) { console.log(result); });&quot;},{&quot;sdkId&quot;:&quot;java&quot;,&quot;framework&quot;:&quot;java&quot;,&quot;language&quot;:&quot;java&quot;,&quot;displayName&quot;:&quot;Java&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.uploader().upload(\\&quot;my_video.mp4\\&quot;,\\n    ObjectUtils.asMap(\\&quot;resource_type\\&quot;, \\&quot;video\\&quot;, \\&quot;public_id\\&quot;, \\&quot;lincoln\\&quot;,\\n    \\&quot;notification_url\\&quot;, \\&quot;https:\\\/\\\/requestb.in\\\/abcd123yz\\&quot;, \\n    \\&quot;raw_convert\\&quot;, \\&quot;google_speech\\&quot; ));&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.uploader().upload(\\&quot;my_video.mp4\\&quot;,\\n    ObjectUtils.asMap(\\&quot;resource_type\\&quot;, \\&quot;video\\&quot;, \\&quot;public_id\\&quot;, \\&quot;lincoln\\&quot;,\\n    \\&quot;notification_url\\&quot;, \\&quot;https:\\\/\\\/requestb.in\\\/abcd123yz\\&quot;, \\n    \\&quot;raw_convert\\&quot;, \\&quot;google_speech\\&quot; ));&quot;},{&quot;sdkId&quot;:&quot;csharp&quot;,&quot;framework&quot;:&quot;csharp&quot;,&quot;language&quot;:&quot;java&quot;,&quot;displayName&quot;:&quot;.NET&quot;,&quot;packageName&quot;:&quot;CloudinaryDotNet&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;var uploadParams = new VideoUploadParams()\\n{\\n  File = new FileDescription(@\\&quot;dog.mp4\\&quot;),\\n  ResourceType = \\&quot;video\\&quot;,  \\n  PublicID = \\&quot;lincoln\\&quot;,\\n  NotificationUrl = \\&quot;https:\\\/\\\/requestb.in\\\/abcd123yz\\&quot;,\\n  RawConvert = \\&quot;google_speech\\&quot; )); \\n};\\nvar uploadResult = cloudinary.Upload(uploadParams);&quot;,&quot;codeSnippet&quot;:&quot;var uploadParams = new VideoUploadParams()\\n{\\n  File = new FileDescription(@\\&quot;dog.mp4\\&quot;),\\n  ResourceType = \\&quot;video\\&quot;,  \\n  PublicID = \\&quot;lincoln\\&quot;,\\n  NotificationUrl = \\&quot;https:\\\/\\\/requestb.in\\\/abcd123yz\\&quot;,\\n  RawConvert = \\&quot;google_speech\\&quot; )); \\n};\\nvar uploadResult = cloudinary.Upload(uploadParams);&quot;}]\"\n      parsed-url=\"[]\"\n      with-url=\"false\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget>\n<h3>The delivery URL<\/h3>\n<p>Once you\u2019ve verified that the raw <code>.transcript<\/code> file has been generated, you can deliver your video with the subtitles. Just add a <code>subtitles<\/code> overlay with the transcript file name. (It has the same public ID as the video, but with a <strong>.transcript<\/strong> extension.)<\/p>\n<p>If you want to get a little fancier, you can also customize the text color, outline color, and display location (gravity) for the subtitles:<\/p>\n<div style=\"text-align:center;\">\n<video controls loop autoplay muted >\n  <source src=\"https:\/\/res.cloudinary.com\/demo\/video\/upload\/l_subtitles:impact_15:lincoln.transcript,co_khaki,b_rgb:331a00,g_south_west\/w_500\/lincoln.webm\" type=\"video\/webm\" \/>\n  <source src=\"https:\/\/res.cloudinary.com\/demo\/video\/upload\/l_subtitles:impact_15:lincoln.transcript,co_khaki,b_rgb:331a00,g_south_west\/w_500\/lincoln.mp4\" type=\"video\/mp4\" \/>\n  <source src=\"https:\/\/res.cloudinary.com\/demo\/video\/upload\/l_subtitles:impact_15:lincoln.transcript,co_khaki,b_rgb:331a00,g_south_west\/w_500\/lincoln.ogv\" type=\"video\/ogg\" \/>\n  Your browser does not support HTML5 video tags.\n<\/video>\n<\/div>\n<h2>Don\u2019t stop there. Show \u2019em what you got!<\/h2>\n<p>Subtitles are great, but if you\u2019ve already got the transcript file, why not parse it to generate an HTML version that you can show on your web page? This is great for making video content more skimmable and SEO-friendly.<\/p>\n<p>Here\u2019s a really simple Ruby script that does exactly that:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">\nrequire 'json'\n\nclass TranscriptUtil\n\n#function receives the transcript input file, path of HTML output file,\n#max words to include per timestamp (default 40), \n#and line break for longer entries (default 10).\ndef convert(transcript_file, html_file, max_words=40, break_counter=10)\n\n\n    # read and parse the transcript file\n    file =  File.read(transcript_file)\n    data = JSON.parse(file)\n\n\n    index = 0\n    elements = &#91;]\n    elementIndex = 0\n    words_count = 0\n    start_col = \"<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">br<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">td<\/span>&gt;<\/span>\"\n    end_col =\"<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">td<\/span>&gt;<\/span>\"\n\n    elements&#91;elementIndex] = \"<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">tr<\/span>&gt;<\/span>\"\n    data.map do |d|\n      d&#91;'words'].map do |group|\n        if(index % max_words == 0)\n          elementIndex += 1\n\n#define the timestamp string format          Time.at(group&#91;'start_time']).utc.strftime(\"%H:%M:%S\")\n          start_time = \"      --- \" + Time.at(group&#91;'start_time']).utc.strftime(\"%H:%M:%S\").to_s + \" ---\"\n\n#build the html content\n          elements&#91;elementIndex] = \"<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">br<\/span>&gt;<\/span>\" + start_col + start_time + end_col + start_col\n          words_count = 0    \n        end\n        if(words_count == break_counter)\n          elements&#91;elementIndex] += end_col + start_col\n          words_count = 0\n        end\n        elements&#91;elementIndex] += group&#91;'word'].to_s.strip + \" \"        \n        index += 1\n        words_count += 1\n      end\n    end\n    elements&#91;elementIndex+1] = \"<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">tr<\/span>&gt;<\/span>\"\n\n#save the html content in a new html file\n    File.new(html_file, \"w+\")\n    File.open(html_file, \"w+\") do |f|\n      f.puts(elements)\n    end\n  end\nend\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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>You can run the script with the following command:<\/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\">ruby -r <span class=\"hljs-string\">\".\/transcript_to_html.rb\"<\/span> -e <span class=\"hljs-string\">\"TranscriptUtil.new.convert('lincoln.transcript','.\/lincoln_transcript.html',20,10)\"<\/span>\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>This very simple script outputs basic HTML that looks like this:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/bo_2px_solid_dimgrey,w_400,f_auto,q_auto,dpr_auto\/HTML_output_scroll.png\" alt=\"sample generated subtitle HTML output\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"808\" height=\"430\"\/><\/p>\n<p>Of course for a production version, I\u2019m sure you\u2019d generate something that looks much nicer. We\u2019ll leave the creative design to you.<\/p>\n<h2>But if you really want the video content to \u2018sync\u2019 in\u2026<\/h2>\n<p>If you are feeling particularly adventurous, you can even add synchronization capabilities between the textual display of the transcript and the video player, so that your viewers can skim the text and jump to the point in the video that most interests them. You also sync the other way, making the displayed text scroll as the video plays, and even highlight the currently playing excerpt.<\/p>\n<p>Demonstrating these capabilities is beyond the scope of this post, but we challenge you to try it yourself! We\u2019ve given you everything you need:<\/p>\n<p>The <a href=\"https:\/\/cloudinary.com\/documentation\/cloudinary_video_player\">Cloudinary Video Player<\/a> can capture events and trigger operations on a video. Use the player in conjunction with the <a href=\"https:\/\/cloudinary.com\/documentation\/google_ai_video_transcription_addon\">Google-powered AI Video Transcription Add-on<\/a>, add a bit of javascript magic, and you\u2019ll be on your way to an impressive synchronized transcript viewer on par with YouTube and other big players in the video scene.<\/p>\n<h2>The bottom line (or should I say, \u201cThe subtitle\u2026\u201d \ud83d\ude09<\/h2>\n<p>As it becomes more and more commonplace to use videos as a way to share information and experiences, the competition to win viewers\u2019 attention becomes increasingly tough. The <strong><a href=\"https:\/\/cloudinary.com\/addons#google_speech\">Video Transcription add-on<\/a><\/strong> is a great way to offer your users automatic subtitles for their uploaded videos, so they can grab their audience\u2019s attention as soon as their silent video begins to autoplay. Oh, and it\u2019s great for podcasts too.<\/p>\n<p>To watch it in action, jump over to the <a href=\"https:\/\/demo.cloudinary.com\/video\">Cloudinary Video Transcoding Demo<\/a>. Select one of the sample videos or upload your own, and then scroll down to the <strong>Auto Transcription<\/strong> section to see the transcription results. And while you\u2019re there, check out the many cool video transformation examples as well as a demonstration of the Cloudinary Video Tagging add-on.<\/p>\n<p>But the real fun is in trying it yourself! If you don\u2019t have a Cloudinary account yet, <a href=\"https:\/\/cloudinary.com\/users\/register\/free\">sign up for free<\/a>.  We\u2019d love to see your demos of the <strong>sync<\/strong> implementation <a href=\"#but_if_you_really_want_the_video_content_to_sync_in_\">suggested above<\/a>. Please add a link in the comments to show off your results!<\/p>\n<hr \/>\n<h2>Want to Learn More About Video Optimization?<\/h2>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/optimizing_video_with_cloudinary_and_the_html5_video_player_part_1\">Optimizing Video with Cloudinary and the HTML5 Video Player<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/exoplayer_android_tutorial_easy_video_delivery_and_editing\">ExoPlayer Android Tutorial: Easy Video Delivery and Editing<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/how_to_generate_waveform_images_from_audio_files\">How to Generate Waveform Images From Audio Files<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes\">Auto Generate Subtitles Based on Video Transcript<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/auto_generate_video_previews_with_great_results_every_time\">Automated Generation of Intelligent Video Previews on Cloudinary\u2019s Dynamic Video Platform<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/converting_android_videos_to_animated_gif_images_with_cloudinary_a_tutorial\">Converting Android Videos to Animated GIF Images With Cloudinary: A Tutorial<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/guides\/marketing-videos\/tips-for-retaining-audience-through-engaging-videos\">Tips for Retaining Audience Through Engaging Videos<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/guides\/marketing-videos\/product-videos-101-what-makes-them-great\">Product Videos 101: What Makes Them Great?<\/a>\n<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":21662,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[305,311,304],"class_list":["post-21661","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-video-api","tag-video-transcoding","tag-video-transformation"],"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>Auto Generate Subtitles Based on Video Transcript<\/title>\n<meta name=\"description\" content=\"These days, muted autoplay videos are the norm. Learn how to auto generate subtitles based on video transcript using Cloudinary&#039;s video transcript add-on\" \/>\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\/with_automatic_video_subtitles_silence_speaks_volumes\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Auto Generate Subtitles Based on Video Transcript\" \/>\n<meta property=\"og:description\" content=\"These days, muted autoplay videos are the norm. Learn how to auto generate subtitles based on video transcript using Cloudinary&#039;s video transcript add-on\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-01-17T18:25:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-09T13:58:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649723334\/Web_Assets\/blog\/SilentMovie\/SilentMovie-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"870\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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\/with_automatic_video_subtitles_silence_speaks_volumes#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Auto Generate Subtitles Based on Video Transcript\",\"datePublished\":\"2018-01-17T18:25:48+00:00\",\"dateModified\":\"2025-03-09T13:58:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes\"},\"wordCount\":7,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723334\/Web_Assets\/blog\/SilentMovie\/SilentMovie.jpg?_i=AA\",\"keywords\":[\"Video API\",\"Video Transcoding\",\"Video Transformation\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2018\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes\",\"url\":\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes\",\"name\":\"Auto Generate Subtitles Based on Video Transcript\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723334\/Web_Assets\/blog\/SilentMovie\/SilentMovie.jpg?_i=AA\",\"datePublished\":\"2018-01-17T18:25:48+00:00\",\"dateModified\":\"2025-03-09T13:58:33+00:00\",\"description\":\"These days, muted autoplay videos are the norm. Learn how to auto generate subtitles based on video transcript using Cloudinary's video transcript add-on\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723334\/Web_Assets\/blog\/SilentMovie\/SilentMovie.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723334\/Web_Assets\/blog\/SilentMovie\/SilentMovie.jpg?_i=AA\",\"width\":1540,\"height\":870},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Auto Generate Subtitles Based on Video Transcript\"}]},{\"@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\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Auto Generate Subtitles Based on Video Transcript","description":"These days, muted autoplay videos are the norm. Learn how to auto generate subtitles based on video transcript using Cloudinary's video transcript add-on","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\/with_automatic_video_subtitles_silence_speaks_volumes","og_locale":"en_US","og_type":"article","og_title":"Auto Generate Subtitles Based on Video Transcript","og_description":"These days, muted autoplay videos are the norm. Learn how to auto generate subtitles based on video transcript using Cloudinary's video transcript add-on","og_url":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes","og_site_name":"Cloudinary Blog","article_published_time":"2018-01-17T18:25:48+00:00","article_modified_time":"2025-03-09T13:58:33+00:00","og_image":[{"width":1540,"height":870,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649723334\/Web_Assets\/blog\/SilentMovie\/SilentMovie-jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes"},"author":{"name":"","@id":""},"headline":"Auto Generate Subtitles Based on Video Transcript","datePublished":"2018-01-17T18:25:48+00:00","dateModified":"2025-03-09T13:58:33+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes"},"wordCount":7,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723334\/Web_Assets\/blog\/SilentMovie\/SilentMovie.jpg?_i=AA","keywords":["Video API","Video Transcoding","Video Transformation"],"inLanguage":"en-US","copyrightYear":"2018","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes","url":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes","name":"Auto Generate Subtitles Based on Video Transcript","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723334\/Web_Assets\/blog\/SilentMovie\/SilentMovie.jpg?_i=AA","datePublished":"2018-01-17T18:25:48+00:00","dateModified":"2025-03-09T13:58:33+00:00","description":"These days, muted autoplay videos are the norm. Learn how to auto generate subtitles based on video transcript using Cloudinary's video transcript add-on","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723334\/Web_Assets\/blog\/SilentMovie\/SilentMovie.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723334\/Web_Assets\/blog\/SilentMovie\/SilentMovie.jpg?_i=AA","width":1540,"height":870},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Auto Generate Subtitles Based on Video Transcript"}]},{"@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":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723334\/Web_Assets\/blog\/SilentMovie\/SilentMovie.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21661","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\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=21661"}],"version-history":[{"count":10,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21661\/revisions"}],"predecessor-version":[{"id":37174,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21661\/revisions\/37174"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21662"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21661"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21661"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21661"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}