注目キーワード

【YMM4】動画の字幕をテキストファイルに出力する方法【Python講座】

注意

本記事の内容は、以前私が投稿したnoteの記事と同一です。こちらも併せてご覧ください:
https://note.com/lemon_slime/n/n8cdc43e05a03


1,はじめに

Youtubeは、情報収集においてはもちろん、情報発信においても、大きな力を発揮するSNSです。Youtube上では、日々、多くのクリエイターによって情報発信が続けられています。
しかし、この形式には些か問題点があると思うのです。
というのも、得たい情報を得るために、その動画の全体を視聴する必要が往々にしてあるからです。特に、動画の長さが長い場合や、情報が散在している場合、目的の情報にたどり着くまでに時間がかかってしまうことは言うまでもありません。

さらに、動画形式では情報のテキスト検索が難しく、特定の情報を素早く見つけることが困難です。テキストベースの情報の場合、検索機能を使うことで瞬時に必要な情報にアクセスできるのとは対照的です。例えば、ブログや記事の場合、キーワード検索を利用して直接的に目的の内容にジャンプすることができます。このページ上でCtrl+Fキーを押してみてください。瞬時に検索を行って得たい情報を得ることができるでしょう。こんなことはYoutubeの動画上では成しえません。

もう一つ、問題点があります。即ち、動画の内容が視覚と聴覚に依存するため、視聴環境によっては情報の受け取りが困難になるのです。例えば、図書館や講義中の教室など、音を出せない状況でヘッドフォンがない場合、音の出る動画を視聴するのが憚れます。こんな時に、音声ベースの動画の内容をどうやって理解すればよいのでしょうか?
こういった問題は、テキストベースの情報であれば問題になりません。単に読めばいいのですから。こうした問題は、動画形式で発信された情報の持つ短所と言うことができます。

動画投稿者側には、こうした側面に考慮して、積極的にタイムスタンプを設置したり、字幕をつけて情報の伝達を容易にしたりするなどの配慮が求められます。このように様々な具体策は考えられますが、根本的に問題するなら、動画とは別にテキストベースの情報を用意するのが適切でしょう。本記事では、動画内の字幕を基にテキストを生成する方法について、プログラミング(python)を用いながら解説します。動画編集ソフト「YMM4」の使用が前提となる点にご留意ください。

1章のまとめ

YouTubeは情報収集や発信に強力なSNSですが、長い動画全体を視聴しないと必要な情報が得られないことが問題です。動画形式ではテキストのように簡単に検索できず、視聴環境に依存するため情報の受け取りが難しい場合があります。図書館や教室など音を出せない場所では特に不便です。動画投稿者はタイムスタンプや字幕を使って情報伝達を容易にする配慮が必要であり、動画と別にテキストベースの情報を提供することが望ましいです。本記事では、動画内の字幕からテキストを生成する方法をPythonを用いて解説します。


【余談】
一応私も動画投稿者の端くれですので、上記に留意した情報発信を心がけていますが、これを強く意識するようになったきっかけがあります。
それは、推しのYoutuber(匿名)がなんと4時間ものvoiceroid解説動画を投稿したときです。総集編ではありません、なんとこれが一本の動画なのです。内容は非常に興味深く、見入ってしまうものなのですが、流石にこれだけの長さがある動画を全部見るのは厳しいところがあります。また、特定の情報や部分的な説明をもう一度確認したいときに、その長い動画の中から該当箇所を探し出すのが非常に困難であることは言うまでもありません。情報を効率的に得られるように工夫するのが如何に大切であるかに気づかされました。


2,本題

まずは、YMM4で普通に動画を作成します。

普通の動画

このとき、字幕を作成するのを忘れないでください。ゆっくり音声で動画を作成する場合、特別なことをしなければ自動で字幕が生成されるかと思います。voiceroidやA.I.VOICEの場合は、VoiceroidUtilなどの外部ソフトを使って字幕を生成するのが簡単です。

https://ruche-home.net/download#voiceroid-util

完成したら、動画を出力します。この時に、字幕ファイルを一緒に出力するよう設定してください。

赤枠部分をオン

すると、動画ファイルとは別にsubファイルが出力されます。
subファイルをテキストエディターで開くと下のような感じになります。
これで良いという場合はここでおしまいにしても良いのですが、何やら空白の行や動画時間の情報など、余分なものが含まれていますね…

subファイルの中身

これらを処理し、字幕の部分だけを抜き出すことを目指します。手作業でやってもいいのですが、機械的な作業になりそうなので、ここはプログラミングを活用することにしましょう。
言語は何でもいいですが、今回は王道のpythonを使います。
MicrosoftStoreでpythonのインストールができます。無料です。

https://apps.microsoft.com/detail/9ncvdn91xzqp?hl=ja-jp&gl=JP

最低限搭載するべき機能:

  • 空白の行を除去

  • 動画時間の情報(今回は便宜上「00」から始まる行)を除去

  • テキストファイルとして出力

を満たすようなソースコードは以下のようになるでしょうか。
テキストエディター(VSCodeなど。なければメモ帳でもOK。)上に以下をコピーして、「generateText.py」のようにpyファイルとして保存すればOKです。file_nameやoutput_fileはお好みで変えてください。

def write_string_to_txt_file(output_string, file_name):
    with open(file_name, 'w',encoding="utf-8") as file:
        file.write(output_string)

#ここにファイルの名前を入力してください
file_name = "./sample.sub" 

#ここに出力するファイルの名前を入力してください
output_file = "./sample.txt"

with open(file_name,encoding="utf-8") as file:
    file_content = file.read()

file_contents = file_content.split("\n")

# 文字列を出力
for i in range(0,len(file_contents),1):
    if not file_contents[i].startswith("00"):
        if file_contents[i] != "":
            result = result + file_contents[i] + "\n"

write_string_to_txt_file(result, output_file)

これを実行(「プログラムから開く」→「Python 3.12」を選択、またはcmdを開いてcdコマンドで作業フォルダに移動し、pythonコマンドを実行)することで、最低限字幕の部分だけを抜き出すことができますが、些か改善の余地があると思います。
例えば、ファイルの名前は実行する度に変更する必要があり、手間がかかります。

file_name = input("ファイル名を入力してください")

のように、input()関数を用いてソースコードの変更を最低限に抑える方法も考えられますが、ファイル名を定義する手間がかかることには変わりません。こうした手間を極力排除するために、更新日時が最新のファイルを取得する方法が考えられます。その場合は、上記のコードに加えて、

import os

def get_latest_file(directory):
    try:
        # ディレクトリ内のすべてのファイルを取得
        files = [os.path.join(directory, f) for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]

        #pyファイルを除外
        files = [f for f in files if not f.endswith(".py")]
        
        if not files:
            print("ディレクトリ内にファイルがありません。")
            return None
        
        # 更新日時が最も新しいファイルを見つける
        latest_file = max(files, key=os.path.getmtime)
        
        # ファイル名を表示
        print("更新日時が最も新しいファイルは:", os.path.basename(latest_file))
        return latest_file
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        return None

のようにディレクトリ内で最新のファイルを出力する関数を定義して、

file_name = get_latest_file("C:\動画字幕")   #ディレクトリを指定

のように関数を実行すればよいですね。関数get_latest_fileは字幕ファイルがあるディレクトリを引数とします。ディレクトリはご自身の環境に合わせて指定してください。

3,おしまい

お疲れさまでした。これで、字幕を簡単にテキストファイルとして保存することができます。そして、この作業は思わぬメリットをもたらします。というのも、Youtube動画の字幕を基に、ブログやツイートを量産することができるのです。

「字幕は話し言葉で書いてるから、あまり意味ないかなぁ。」

とお思いの方へ。そんな方のためにchatGPTを始めとするAIというものが存在するのです。
AIにテキストを読み込ませて「要約してください」と一言加えるだけで、簡単に動画の内容をまとめてくれます。そして要約された文章は、ここnoteやあなたのサイト内へ簡単にコピー&ペーストで移すことができます。あなたの解説動画が動画ベースではなくテキストベースだからこそできる技です。

「AIに読み込ませるのが面倒くさいなぁ。」

とお思いの方へ。何のためのpythonでしょうか
いまこそchatGPTのAPIを活用するチャンスです!
cmd上で

pip install openai

とコマンドを打ち込んだ後、

from openai import OpenAI

def generate_summary(text):
  completion = client.chat.completions.create(
      model="gpt-3.5-turbo",
      messages=[{
          "role": "system",
          "content": """
        ユーザーの入力文を要約してください
        """
      }, {
          "role":
          "user",
          "content": text 
      }],
  )
  return completion.choices[0].message.content

のようにchatGPTを呼び出す関数を定義し、

print(generate_summary(result)) #このresultは2章のコードの変数です。2章のコードと併せてご使用ください。

のように関数を実行すればOKです。
コピーも面倒ならば、

pip install pyperclip

のようにpyperclipをインストールし、関数generate_summaryを宣言した後

pyperclip.copy(generate_summary(result))

のように実行すればOKですね。
可能性は無限大です。
あなたの解説動画が、多くの人の目に留まりますように。

最後になりますが、本記事に「スキ」をしていただきますと、今後の記事執筆のモチベーションとなりますので、是非お願い申し上げます。

person holding apple magic mouse
最新情報をチェックしよう!