{"id":4453,"date":"2016-06-15T01:35:07","date_gmt":"2016-06-15T01:35:07","guid":{"rendered":"http:\/\/www.garysieling.com\/blog\/?p=4453"},"modified":"2016-06-15T01:35:07","modified_gmt":"2016-06-15T01:35:07","slug":"parsing-youtube-subtitles-node-srt-files","status":"publish","type":"post","link":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/","title":{"rendered":"Parsing youtube subtitles in Node (srt files)"},"content":{"rendered":"<p>Modern video sites support a specification known as &#8220;VTT&#8221;, which is a fairly rich format for listing video subtitles. This gives you timings of each segment of text, as well as the ability to highlight words in each segment.<\/p>\n<p>Unfortunately this spec is horribly complex, and there are very few utilities you can run that aren&#8217;t browser oriented. If you want to write a command line application to parse out the text, it is quite painful.<\/p>\n<pre lang=\"xml\">\n00:00:00.320 --> 00:00:01.740 align:start position:0%\n \nthanks<00:00:00.510><c> for<\/c><00:00:00.599><c> joining<\/c><00:00:00.930><c> me<\/c><c.colorCCCCCC><00:00:01.510><c> are<\/c><00:00:01.740><c> my<\/c><\/c>\n\n00:00:01.740 --> 00:00:01.910 align:start position:0%\nthanks for joining me<c.colorCCCCCC> are my\n <\/c>\n\n00:00:01.910 --> 00:00:03.189 align:start position:0%\nthanks for joining me<c.colorCCCCCC> are my<\/c>\nname<c.colorE5E5E5><00:00:02.090><c> is<\/c><\/c><c.colorCCCCCC><00:00:02.620><c> Richard<\/c><00:00:02.929><c> King<\/c><00:00:03.189><c> in<\/c><\/c>\n\n00:00:03.189 --> 00:00:03.580 align:start position:0%\nname<c.colorE5E5E5> is<\/c><c.colorCCCCCC> Richard King in\n <\/c>\n<\/pre>\n<p>As you can see, there are several issues with subtitles: once you allow the UI to highlight words as they are spoken, the text must be replicated. Tools that consume transcripts must de-duplicate overlapping words. Second, there are no breaks for when sentences end, and since this is automatically generated by youtube, every &#8220;um&#8221; is transcribed.<\/p>\n<p>We can make this much easier with an older format, SRT.<\/p>\n<p>The SRT format looks like this:<\/p>\n<pre>\n1\n00:00:00,320 --> 00:00:03,579\nthanks for joining me are my name is\nRichard King in\n\n2\n00:00:03,580 --> 00:00:06,939\nI'm a visual journalist at at 5:38\n<\/pre>\n<p>This is at least something that can be parsed in a tolerable fashion. I expect in the future that VTT libraries will improve, as it is the up-and-coming browser standard for subtitles, but if you just want to get transcripts now, the easiest way to do this is to get an SRT file, and parse it like so:<\/p>\n<pre lang=\"javascript\">\nfunction parseSrt(text) {\n  let lines = text.split(\"\\n\");\n  let matchBreak = \/\\d\\d:\\d\\d:\\d\\d,\\d\\d\\d --> \\d\\d:\\d\\d:\\d\\d,\\d\\d\\d\/i;\n  let transcript = \"\";\n  for (let i: number = 0; i < lines.length; i++) {\n    let line = lines[i];\n    console.log(line);\n\n    if (!line.match(matchBreak)) {\n      transcript += ' ' + line;\n    }\n  }\n\n  return transcript.replace(\/\\s+\/ig, ' ');\n}\n<\/pre>\n<p>A great tool I found to help with this is Google2SRT<sup><a href=\"#footnote_1_4453\" id=\"identifier_1_4453\" class=\"footnote-link footnote-identifier-link\" title=\"http:\/\/google2srt.sourceforge.net\/en\/\">1<\/a><\/sup>.<\/p>\n<ol class=\"footnotes\"><li id=\"footnote_1_4453\" class=\"footnote\">http:\/\/google2srt.sourceforge.net\/en\/<span class=\"footnote-back-link-wrapper\"> [<a href=\"#identifier_1_4453\" class=\"footnote-link footnote-back-link\">&#8617;<\/a>]<\/span><\/li><\/ol>","protected":false},"excerpt":{"rendered":"<p>How to convert subtitle files into video transcripts<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[4],"tags":[302,527,536,569,582,607],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"How to convert subtitle files into video transcripts\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"gary\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Gary Sieling - Software Engineer\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Parsing youtube subtitles in Node (srt files) - Gary Sieling\" \/>\n\t\t<meta property=\"og:description\" content=\"How to convert subtitle files into video transcripts\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2016-06-15T01:35:07+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2016-06-15T01:35:07+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Parsing youtube subtitles in Node (srt files) - Gary Sieling\" \/>\n\t\t<meta name=\"twitter:description\" content=\"How to convert subtitle files into video transcripts\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/parsing-youtube-subtitles-node-srt-files\\\/#blogposting\",\"name\":\"Parsing youtube subtitles in Node (srt files) - Gary Sieling\",\"headline\":\"Parsing youtube subtitles in Node (srt files)\",\"author\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\"},\"datePublished\":\"2016-06-15T01:35:07+00:00\",\"dateModified\":\"2016-06-15T01:35:07+00:00\",\"inLanguage\":\"en-US\",\"commentCount\":1,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/parsing-youtube-subtitles-node-srt-files\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/parsing-youtube-subtitles-node-srt-files\\\/#webpage\"},\"articleSection\":\"Code Examples, javascript, srt, subtitles, video, vtt, youtube\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/parsing-youtube-subtitles-node-srt-files\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.garysieling.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/#listItem\",\"name\":\"Code Examples\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/#listItem\",\"position\":2,\"name\":\"Code Examples\",\"item\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/parsing-youtube-subtitles-node-srt-files\\\/#listItem\",\"name\":\"Parsing youtube subtitles in Node (srt files)\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/parsing-youtube-subtitles-node-srt-files\\\/#listItem\",\"position\":3,\"name\":\"Parsing youtube subtitles in Node (srt files)\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/#listItem\",\"name\":\"Code Examples\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\",\"name\":\"Gary Sieling\",\"description\":\"Software Engineer\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/\",\"name\":\"gary\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/parsing-youtube-subtitles-node-srt-files\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0be925276d848ffe98a6a9dc8cf33e67?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"gary\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/parsing-youtube-subtitles-node-srt-files\\\/#webpage\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/parsing-youtube-subtitles-node-srt-files\\\/\",\"name\":\"Parsing youtube subtitles in Node (srt files) - Gary Sieling\",\"description\":\"How to convert subtitle files into video transcripts\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/parsing-youtube-subtitles-node-srt-files\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"datePublished\":\"2016-06-15T01:35:07+00:00\",\"dateModified\":\"2016-06-15T01:35:07+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/\",\"name\":\"Gary Sieling\",\"description\":\"Software Engineer\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Parsing youtube subtitles in Node (srt files) - Gary Sieling","description":"How to convert subtitle files into video transcripts","canonical_url":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/#blogposting","name":"Parsing youtube subtitles in Node (srt files) - Gary Sieling","headline":"Parsing youtube subtitles in Node (srt files)","author":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"publisher":{"@id":"https:\/\/www.garysieling.com\/blog\/#organization"},"datePublished":"2016-06-15T01:35:07+00:00","dateModified":"2016-06-15T01:35:07+00:00","inLanguage":"en-US","commentCount":1,"mainEntityOfPage":{"@id":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/#webpage"},"isPartOf":{"@id":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/#webpage"},"articleSection":"Code Examples, javascript, srt, subtitles, video, vtt, youtube"},{"@type":"BreadcrumbList","@id":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.garysieling.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/#listItem","name":"Code Examples"}},{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/#listItem","position":2,"name":"Code Examples","item":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/#listItem","name":"Parsing youtube subtitles in Node (srt files)"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/#listItem","position":3,"name":"Parsing youtube subtitles in Node (srt files)","previousItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/#listItem","name":"Code Examples"}}]},{"@type":"Organization","@id":"https:\/\/www.garysieling.com\/blog\/#organization","name":"Gary Sieling","description":"Software Engineer","url":"https:\/\/www.garysieling.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author","url":"https:\/\/www.garysieling.com\/blog\/author\/gary\/","name":"gary","image":{"@type":"ImageObject","@id":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/0be925276d848ffe98a6a9dc8cf33e67?s=96&d=identicon&r=g","width":96,"height":96,"caption":"gary"}},{"@type":"WebPage","@id":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/#webpage","url":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/","name":"Parsing youtube subtitles in Node (srt files) - Gary Sieling","description":"How to convert subtitle files into video transcripts","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.garysieling.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/#breadcrumblist"},"author":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"creator":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"datePublished":"2016-06-15T01:35:07+00:00","dateModified":"2016-06-15T01:35:07+00:00"},{"@type":"WebSite","@id":"https:\/\/www.garysieling.com\/blog\/#website","url":"https:\/\/www.garysieling.com\/blog\/","name":"Gary Sieling","description":"Software Engineer","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.garysieling.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Gary Sieling - Software Engineer","og:type":"article","og:title":"Parsing youtube subtitles in Node (srt files) - Gary Sieling","og:description":"How to convert subtitle files into video transcripts","og:url":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/","article:published_time":"2016-06-15T01:35:07+00:00","article:modified_time":"2016-06-15T01:35:07+00:00","twitter:card":"summary_large_image","twitter:title":"Parsing youtube subtitles in Node (srt files) - Gary Sieling","twitter:description":"How to convert subtitle files into video transcripts"},"aioseo_meta_data":{"post_id":"4453","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"created":"2023-02-04 16:59:07","updated":"2026-07-06 02:03:45","ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.garysieling.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/\" title=\"Code Examples\">Code Examples<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tParsing youtube subtitles in Node (srt files)\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.garysieling.com\/blog"},{"label":"Code Examples","link":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/"},{"label":"Parsing youtube subtitles in Node (srt files)","link":"https:\/\/www.garysieling.com\/blog\/parsing-youtube-subtitles-node-srt-files\/"}],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/4453"}],"collection":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/comments?post=4453"}],"version-history":[{"count":0,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/4453\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/media?parent=4453"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/categories?post=4453"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/tags?post=4453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}