{"id":910,"date":"2024-03-29T00:18:56","date_gmt":"2024-03-28T15:18:56","guid":{"rendered":"https:\/\/blog.peddals.com\/?p=910"},"modified":"2024-04-03T23:29:48","modified_gmt":"2024-04-03T14:29:48","slug":"intro-to-speech-plus-subtitles-player-flet-app","status":"publish","type":"post","link":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/","title":{"rendered":"Speech + Subtitles (SRT) Player app made with Flet"},"content":{"rendered":"\n<p>If you have not, try OpenAI&#8217;s Whisper, speech-to-text AI. It&#8217;s free and works on a personal computer without sending data to the cloud. With my M1 mac mini 16GB RAM, it takes about 90% of the actual length of audio file to complete the transcription, and the accuracy\/quality is also about 90% in Japanese or even better in English. After transcribing multiple types of speeches, I researched and tried various parameter changes to increase the accuracy, but it turned out to be nearly impossible, at least for now. So, I changed my mind and started building an app that I can edit subtitles easily while playing speech audio file simultaneously. In this post, I&#8217;m going to introduce the standalone desktop app that I built with Flet, GUI application development framework for Python. l&#8217;m going to write another post to share more about the code. For the time being, you can read my code that I added comments as many as I could (<a href=\"https:\/\/github.com\/tokyohandsome\/Speech-plus-Subtitles-Player\/blob\/main\/main.py\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>I call the app <strong>Speech plus Subtitles Player<\/strong> (<strong>SPSP<\/strong> or <strong>SPS Player<\/strong>) in English. I named it <strong>Jimaku Gokuraku Maru<\/strong> in Japanese (&#8220;jimaku&#8221; means subtitles), named after an old console game for Famicom, Jigoku Gokuraku Maru (&#8220;jigoku&#8221; means hell. haha). As my app is an open source software it really does not matter, but I also created a cool logo using a free Japanese font <a href=\"https:\/\/flopdesign.com\/blog\/font\/5146\/\" target=\"_blank\" rel=\"noreferrer noopener\">Gen Kai Min Cho<\/a> from Flop Design. Anyways, with SPSP, you can play audio file and edit subtitles (SRT file) generated by Whisper or any other speech-to-text tool quite easily. Subtitles scroll in sync with the audio, and the UI is intuitive.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"862\" src=\"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/03\/screenshot_en-1024x862.png\" alt=\"\" class=\"wp-image-912\" srcset=\"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/03\/screenshot_en-1024x862.png 1024w, https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/03\/screenshot_en-300x252.png 300w, https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/03\/screenshot_en-768x646.png 768w, https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/03\/screenshot_en-1536x1292.png 1536w, https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/03\/screenshot_en-2048x1723.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption class=\"wp-element-caption\">Needed features are all included. Subtitles above are actual Whisper output of a famous speech by Steve Jobs.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How to use SPSP<\/h2>\n\n\n\n<p>(See &#8220;<a href=\"#How_to_run_SPSP\">How to run SPSP<\/a>&#8221; below to run the app.) When you load an audio file using the Open Speech File button, if a subtitle file (extension .srt) or text (extension .txt) with the same name exists in the same folder, it will be automatically opened. The Play button plays\/pauses the audio and the subtitles (SRT file) scroll along with the audio. Click on the timestamp to cue there. Click on the subtitle area to edit the text.&nbsp;The edited texts will be overwritten in the same file by clicking on the Save button. The SRT and TXT buttons will exported as separate files.&nbsp; The 1.5x and Auto scroll switches allow you to turn on\/off 1.5x faster playback speed and automatic scrolling of subtitles (auto scrolling is only available for SRT format). There is&nbsp;currently&nbsp;<strong>a known issue<\/strong> where clicking the Open\/Export as button does not open the dialog and the entire app stops working sometimes for some reason. Please be sure to click Save frequently when you&#8217;re editing.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">When exporting as <strong>TXT<\/strong>, it does not include timestamps, so auto-scrolling within the app is not possible, but it is useful for various purposes such as meeting minutes and reports. <strong>SRT<\/strong> is a popular subtitles format (<a href=\"https:\/\/en.wikipedia.org\/wiki\/SubRip\" target=\"_blank\" rel=\"noreferrer noopener\">Wikipedia<\/a>), and if the original audio data is a video, it can be imported as subtitles data using video editor software such as <a href=\"https:\/\/www.blackmagicdesign.com\/products\/davinciresolve\" target=\"_blank\" rel=\"noreferrer noopener\">DaVinci Resolve<\/a>.<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Target users and use cases<\/h2>\n\n\n\n<p>The main target users are those who want to embed subtitles in own videos, typically YouTubers. Also, SPSP is useful for engineers who verify the accuracy of transcription AI, including Whisper, and operators who write conversation reports at call centers. In addition, it can be useful for meeting minutes, or for learning foreign languages (despite the accuracy varies, Whisper supports quite a few languages:&nbsp;<a href=\"https:\/\/platform.openai.com\/docs\/guides\/speech-to-text\/supported-languages\" target=\"_blank\" rel=\"noreferrer noopener\">Supported languages<\/a>&nbsp;\u200b\u200b).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to run SPSP<\/h2>\n\n\n\n<p><s>Although I say it&#8217;s an &#8220;app,&#8221; it is currently not possible to build as executable that opens by double-click. You need to set up an environment and run a command to launch SPSP.<\/s> I figured out how to avoid crashing and errors to build this app. <a href=\"https:\/\/blog.peddals.com\/en\/flet-successful-building-app-with-audio\/\">Please see my another post if you wan to build.<\/a> If you are using Windows or Linux, you may need to take additional steps, so please refer to the <a href=\"https:\/\/flet.dev\/docs\/guides\/python\/getting-started\" target=\"_blank\" rel=\"noreferrer noopener\">Flet official documentation<\/a>. The code of SPSP is on GitHub:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/tokyohandsome\/Speech-plus-Subtitles-Player\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/tokyohandsome\/Speech-plus-Subtitles-Player<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Clone the code, create a Python virtual environment, and install Flet and Numpy<\/h3>\n\n\n\n<p>Python version has to be 3.8 or newer (mine is 3.11.7)&nbsp;The example below specifies python 3.11 and uses&nbsp;<code>pipenv<\/code>, but any virtual environment is fine.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-zsh\" data-lang=\"ZSH\"><code>git clone https:\/\/github.com\/tokyohandsome\/Speech-plus-Subtitles-Player.git\ncd Speech-plus-Subtitles-Player\npipenv --python 3.11\npipenv shell\npip install flet\npip install numpy<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Run the app<\/h3>\n\n\n\n<p>Once the environment is created, you can run the app SPSP with the command below.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-zsh\" data-lang=\"ZSH\"><code>python main.py<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Select audio file<\/h3>\n\n\n\n<p>After launching, click the Open Speech File button and select an audio file such as MP3 or WAV. The first time on macOS, you will be asked if you want to give access to your Documents folder, so please approve. If there is a file with the same file name and .srt (or .txt) extension in the same folder, it will be loaded automatically. You can also manually load subtitles file after loading an audio file.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Known issues and limitations<\/h2>\n\n\n\n<p>I don&#8217;t think there are any critical issues, but just in case, you might want to keep copy of subtitles file in a different location before opening in SPSP. Here are some known issues and limitations:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If there are many subtitle buttons, it will stutter when moving or resizing the window.<\/li>\n\n\n\n<li><s>When you build app by <code>flet build macos --include-packages flet_audio<\/code>, built app crashes (Flet version == 0.21.2). If you want an executable and don&#8217;t need auto-scroll, comment out the line <code>import numpy as np<\/code>.<\/s> &#8211;> This is now resolved by <a href=\"https:\/\/blog.peddals.com\/en\/flet-successful-building-app-with-audio\/\">eliminating NumPy<\/a>. <\/li>\n\n\n\n<li>Sometimes when you click the Open or Export button, the dialog will not open and you are unable to do anything other than closing the app. We are currently investigating the cause. Please save frequently.<\/li>\n\n\n\n<li>It seems that the sample rate of MP3 that can be played on macOS is up to 44.1KHz. If it is higher than that, please convert by using Audacity etc.<\/li>\n\n\n\n<li>Add audio file extension to the&nbsp;<code>pick_speech_file<\/code>&nbsp;method if it&#8217;s grayed out.<\/li>\n\n\n\n<li>SRT format originally seems to allow multiple-subtitle lines per block, but this app only expects 1 line. There should be no problem with SRT files exported with Whisper.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Bonus<\/h2>\n\n\n\n<p>I won&#8217;t go into details, but here are how to download online videos such as YouTube as audio files, and how to transcribe to SRT using mlx version of Whisper, which Apple has optimized for macOS.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Download online video as m4a audio file<\/h3>\n\n\n\n<p><code>ffmpeg<\/code> will be installed system-wide. You better create a dedicated virtual environment.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-zsh\" data-lang=\"ZSH\"><code>brew install ffmpeg\npip install yt_dlp\npython -m yt_dlp -f 140 &quot;url_of_online_video&quot;<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Python script to transcribe audio file to SRT with Whisper<\/h3>\n\n\n\n<p>For macOS, create an environment where&nbsp;<a href=\"https:\/\/github.com\/ml-explore\/mlx-examples\/tree\/main\/whisper\" target=\"_blank\" rel=\"noreferrer noopener\">MLX version of Whisper<\/a> can run, download <a href=\"https:\/\/huggingface.co\/mlx-community\/whisper-large-v3-mlx\/tree\/main\">whisper-large-v3-mlx from Hugging Face<\/a>, and place <code>json<\/code> and <code>npz<\/code> files in <code>mlx_models\/whisper-large-v3-mlx<\/code> folder. Then create the <code>speech2srt.py<\/code> file (below). Edit <code>path_to_the_folder<\/code>, <code>audio_file_name<\/code> and <code>language='en'<\/code> to meet your file\/language. If you set a different language like <code>ja<\/code>, Whisper tries to transcribe and translate into Japanese, but quality is not good.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-python\" data-file=\"speech2srt.py\" data-lang=\"Python\" data-line=\"5-6\"><code>import whisper\nimport time\nimport os\n\nbase_dir = &quot;path_to_the_folder&quot;\nspeech_file_name = &quot;audio_file_name&quot;\n\nstart_time = time.time()\nspeech_file = base_dir + speech_file_name\nmodel = &quot;mlx_models\/whisper-large-v3-mlx&quot; \n\nresult = whisper.transcribe(\n                            speech_file, \n                            #language=&#39;ja&#39;, \n                            language=&#39;en&#39;, \n                            path_or_hf_repo=model, \n                            verbose=True,\n                            #fp16=True,\n                            word_timestamps=True,\n                            condition_on_previous_text=False,\n                            #response_format=&#39;srt&#39;,\n                            append_punctuations=&quot;&quot;&#39;.\u3002,\uff0c!\uff01?\uff1f:\uff1a\u201d)]}\u3001&quot;,\n                            temperature=(0.0, 0.2, 0.4, 0.6, 0.8, 1.0),\n                            )\n\nend_time = time.time()\nelapsed_time = round(end_time - start_time, 1)\n\nprint(&#39;############################&#39;)\nprint(f&quot;Time elapsed: {elapsed_time} seconds&quot;)\nprint(&#39;############################&#39;)\n\ndef ms_to_srt_time(milliseconds):\n    seconds = int(milliseconds \/ 1000)\n    h = seconds \/\/ 3600\n    m = (seconds - h * 3600) \/\/ 60\n    s = seconds - h * 3600 - m * 60\n    n = round(milliseconds % 1000)\n    return f&quot;{h:02}:{m:02}:{s:02},{n:03}&quot;\n\nsubs = []\nsub = []\nfor i in range(len(result[&quot;segments&quot;])):\n    start_time = ms_to_srt_time(result[&quot;segments&quot;][i][&quot;start&quot;]*1000)\n    end_time = ms_to_srt_time(result[&quot;segments&quot;][i][&quot;end&quot;]*1000)\n    text = result[&quot;segments&quot;][i][&quot;text&quot;]\n\n    sub = [str(i+1), start_time+&#39; --&gt; &#39;+end_time, text+&#39;n&#39;]\n    subs.append(sub)\n\ntext_file = base_dir + os.path.splitext(os.path.basename(speech_file_name))[0] + &quot;.srt&quot;\n\n# Overwrites file if exists.\nwith open(text_file, &#39;w&#39;) as txt:\n    for i in subs:\n        for j in range(len(i)):\n            txt.write(&#39;%sn&#39; % i[j])<\/code><\/pre><\/div>\n\n\n\n<p>Now run as below and an SRT file will be created in the same folder as the audio file. Please note that existing SRT file will be overwritten.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-zsh\" data-lang=\"ZSH\"><code>python speech2srt.py<\/code><\/pre><\/div>\n\n\n\n<p>MLX Whisper uses GPU. My M2 Max Mac Studio (30 core GPU) completes transcription about 1\/6 of the audio length.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Image by Stable Diffusion<\/h2>\n\n\n\n<p>Increasing steps didn&#8217;t help fix scary fingers, also the good taste of both lady&#8217;s good faces focusing on speeches to transcribe couldn&#8217;t be kept. Larger steps does not always mean better quality or taste.<\/p>\n\n\n\n<p>Date:<br>March 24, 2024 23:45:42<\/p>\n\n\n\n<p>Model:<br>realisticVision-v20_split-einsum<\/p>\n\n\n\n<p>Size:<br>512 x 512<\/p>\n\n\n\n<p>Include in Image:<br>realistic, masterpiece, best quality, retro future, office ladies transcribing audio from record player<\/p>\n\n\n\n<p>Exclude from Image:<\/p>\n\n\n\n<p>Seed:<br>2389164678<\/p>\n\n\n\n<p>Steps:<br>20<\/p>\n\n\n\n<p>Guidance Scale:<br>20.0<\/p>\n\n\n\n<p>Scheduler:<br>DPM-Solver++<\/p>\n\n\n\n<p>ML Compute Unit:<br>CPU &amp; Neural Engine<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you have not, try OpenAI&#8217;s Whisper, speech-to-text AI. It&#8217;s free and works on a personal comput &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Speech + Subtitles (SRT) Player app made with Flet&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":886,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_locale":"en_US","_original_post":"https:\/\/blog.peddals.com\/?p=882","footnotes":""},"categories":[24,8,4],"tags":[12,18],"class_list":["post-910","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-flet","category-macos","category-python","tag-mac","tag-python","en-US"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Speech + Subtitles (SRT) Player app made with Flet | Peddals Blog<\/title>\n<meta name=\"description\" content=\"Flet \u3067\u4f5c\u3063\u305f\u3001\u97f3\u58f0\u3068\u5b57\u5e55 (SRT) \u306e\u540c\u6642\u518d\u751f\u30fb\u5b57\u5e55\u7de8\u96c6\u30a2\u30d7\u30ea\u300e\u5b57\u5e55\u6975\u697d\u4e38\u300f\u306e\u3054\u7d39\u4ecb\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Speech + Subtitles (SRT) Player app made with Flet | Peddals Blog\" \/>\n<meta property=\"og:description\" content=\"Flet \u3067\u4f5c\u3063\u305f\u3001\u97f3\u58f0\u3068\u5b57\u5e55 (SRT) \u306e\u540c\u6642\u518d\u751f\u30fb\u5b57\u5e55\u7de8\u96c6\u30a2\u30d7\u30ea\u300e\u5b57\u5e55\u6975\u697d\u4e38\u300f\u306e\u3054\u7d39\u4ecb\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/\" \/>\n<meta property=\"og:site_name\" content=\"Peddals Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-28T15:18:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-03T14:29:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/03\/realistic-masterpiece-best-quality-retro-future-office-ladies-tran.411.2389164678.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"512\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Handsome\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Handsome\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/\"},\"author\":{\"name\":\"Handsome\",\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/#\\\/schema\\\/person\\\/81b2dabca748c3d11a45722f02d9d994\"},\"headline\":\"Speech + Subtitles (SRT) Player app made with Flet\",\"datePublished\":\"2024-03-28T15:18:56+00:00\",\"dateModified\":\"2024-04-03T14:29:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/\"},\"wordCount\":1227,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/#\\\/schema\\\/person\\\/81b2dabca748c3d11a45722f02d9d994\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.peddals.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/realistic-masterpiece-best-quality-retro-future-office-ladies-tran.411.2389164678.jpg\",\"keywords\":[\"mac\",\"Python\"],\"articleSection\":[\"Flet\",\"macOS\",\"Python\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/\",\"url\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/\",\"name\":\"Speech + Subtitles (SRT) Player app made with Flet | Peddals Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.peddals.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/realistic-masterpiece-best-quality-retro-future-office-ladies-tran.411.2389164678.jpg\",\"datePublished\":\"2024-03-28T15:18:56+00:00\",\"dateModified\":\"2024-04-03T14:29:48+00:00\",\"description\":\"Flet \u3067\u4f5c\u3063\u305f\u3001\u97f3\u58f0\u3068\u5b57\u5e55 (SRT) \u306e\u540c\u6642\u518d\u751f\u30fb\u5b57\u5e55\u7de8\u96c6\u30a2\u30d7\u30ea\u300e\u5b57\u5e55\u6975\u697d\u4e38\u300f\u306e\u3054\u7d39\u4ecb\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blog.peddals.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/realistic-masterpiece-best-quality-retro-future-office-ladies-tran.411.2389164678.jpg\",\"contentUrl\":\"https:\\\/\\\/blog.peddals.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/realistic-masterpiece-best-quality-retro-future-office-ladies-tran.411.2389164678.jpg\",\"width\":512,\"height\":512},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/intro-to-speech-plus-subtitles-player-flet-app\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/blog.peddals.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Speech + Subtitles (SRT) Player app made with Flet\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/#website\",\"url\":\"https:\\\/\\\/blog.peddals.com\\\/\",\"name\":\"Peddals Blog\",\"description\":\"AI, LLM, Python, Mac, Pythonista3, iOS, etc. in Japanese and English\",\"publisher\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/#\\\/schema\\\/person\\\/81b2dabca748c3d11a45722f02d9d994\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blog.peddals.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/#\\\/schema\\\/person\\\/81b2dabca748c3d11a45722f02d9d994\",\"name\":\"Handsome\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g\",\"caption\":\"Handsome\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Speech + Subtitles (SRT) Player app made with Flet | Peddals Blog","description":"Flet \u3067\u4f5c\u3063\u305f\u3001\u97f3\u58f0\u3068\u5b57\u5e55 (SRT) \u306e\u540c\u6642\u518d\u751f\u30fb\u5b57\u5e55\u7de8\u96c6\u30a2\u30d7\u30ea\u300e\u5b57\u5e55\u6975\u697d\u4e38\u300f\u306e\u3054\u7d39\u4ecb","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:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/","og_locale":"en_US","og_type":"article","og_title":"Speech + Subtitles (SRT) Player app made with Flet | Peddals Blog","og_description":"Flet \u3067\u4f5c\u3063\u305f\u3001\u97f3\u58f0\u3068\u5b57\u5e55 (SRT) \u306e\u540c\u6642\u518d\u751f\u30fb\u5b57\u5e55\u7de8\u96c6\u30a2\u30d7\u30ea\u300e\u5b57\u5e55\u6975\u697d\u4e38\u300f\u306e\u3054\u7d39\u4ecb","og_url":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/","og_site_name":"Peddals Blog","article_published_time":"2024-03-28T15:18:56+00:00","article_modified_time":"2024-04-03T14:29:48+00:00","og_image":[{"width":512,"height":512,"url":"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/03\/realistic-masterpiece-best-quality-retro-future-office-ladies-tran.411.2389164678.jpg","type":"image\/jpeg"}],"author":"Handsome","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Handsome","Est. reading time":"22 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/#article","isPartOf":{"@id":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/"},"author":{"name":"Handsome","@id":"https:\/\/blog.peddals.com\/#\/schema\/person\/81b2dabca748c3d11a45722f02d9d994"},"headline":"Speech + Subtitles (SRT) Player app made with Flet","datePublished":"2024-03-28T15:18:56+00:00","dateModified":"2024-04-03T14:29:48+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/"},"wordCount":1227,"commentCount":0,"publisher":{"@id":"https:\/\/blog.peddals.com\/#\/schema\/person\/81b2dabca748c3d11a45722f02d9d994"},"image":{"@id":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/03\/realistic-masterpiece-best-quality-retro-future-office-ladies-tran.411.2389164678.jpg","keywords":["mac","Python"],"articleSection":["Flet","macOS","Python"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/","url":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/","name":"Speech + Subtitles (SRT) Player app made with Flet | Peddals Blog","isPartOf":{"@id":"https:\/\/blog.peddals.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/#primaryimage"},"image":{"@id":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/03\/realistic-masterpiece-best-quality-retro-future-office-ladies-tran.411.2389164678.jpg","datePublished":"2024-03-28T15:18:56+00:00","dateModified":"2024-04-03T14:29:48+00:00","description":"Flet \u3067\u4f5c\u3063\u305f\u3001\u97f3\u58f0\u3068\u5b57\u5e55 (SRT) \u306e\u540c\u6642\u518d\u751f\u30fb\u5b57\u5e55\u7de8\u96c6\u30a2\u30d7\u30ea\u300e\u5b57\u5e55\u6975\u697d\u4e38\u300f\u306e\u3054\u7d39\u4ecb","breadcrumb":{"@id":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/#primaryimage","url":"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/03\/realistic-masterpiece-best-quality-retro-future-office-ladies-tran.411.2389164678.jpg","contentUrl":"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/03\/realistic-masterpiece-best-quality-retro-future-office-ladies-tran.411.2389164678.jpg","width":512,"height":512},{"@type":"BreadcrumbList","@id":"https:\/\/blog.peddals.com\/en\/intro-to-speech-plus-subtitles-player-flet-app\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/blog.peddals.com\/"},{"@type":"ListItem","position":2,"name":"Speech + Subtitles (SRT) Player app made with Flet"}]},{"@type":"WebSite","@id":"https:\/\/blog.peddals.com\/#website","url":"https:\/\/blog.peddals.com\/","name":"Peddals Blog","description":"AI, LLM, Python, Mac, Pythonista3, iOS, etc. in Japanese and English","publisher":{"@id":"https:\/\/blog.peddals.com\/#\/schema\/person\/81b2dabca748c3d11a45722f02d9d994"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.peddals.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/blog.peddals.com\/#\/schema\/person\/81b2dabca748c3d11a45722f02d9d994","name":"Handsome","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g","caption":"Handsome"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g"}}]}},"_links":{"self":[{"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/posts\/910","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/comments?post=910"}],"version-history":[{"count":39,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/posts\/910\/revisions"}],"predecessor-version":[{"id":1095,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/posts\/910\/revisions\/1095"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/media\/886"}],"wp:attachment":[{"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/media?parent=910"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/categories?post=910"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/tags?post=910"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}