見出し画像

【難アリ】Pythonで英語のYoutube動画を要約→翻訳するプログラムを作ってみた

Youtube動画をカンタンに要約したい!

Pythonである程度までできました(;'∀')

プログラミング副業挑戦中の そばごろう です。

twitter https://twitter.com/sobagoro1

今回はPythonで英語のYoutube動画を要約→翻訳するプログラムを作成する手順をまとめます。

1.ChatGPTでプログラム作成

今回のプログラムはやや複雑だったので以下の様なステップで分けてChatGPTに作ってもらいました。

1-1.Youtube動画を要約するプログラムを書かせる

Pythonで以下のプログラムを書いて
ーーーーーーーーーーーーーーーー
1.ポップアップからYouTube動画のURLを選択
2.選択した動画を要約(transformersを利用)
3.要約した内容をポップアップで表示

ChatGPTに入力したプロンプト

ChatGPTの返答(要約部分)

本当はChatGPTで要約させたかったのですがAPIトークンの無料分が失効していたので別の要約機能(transformersライブラリ)を使いました。

1-2.英語を翻訳するプログラムを書かせる

transformersライブラリは英語での要約しかできなさそうだったので要約結果を翻訳する処理を書いてもらいました。

Pythonで以下のプログラムを作成して
1.ポップアップに英語の文章を入力
2.googletransで日本語に翻訳
3.ポップアップに日本語で表示(コピーボタンでコピーも可能)
※メッセージとボタンは日本語で
※PySimpleGUIを使用

ChatGPTに入力したプロンプト

ChatGPTの返答(翻訳部分)

上記の2つの返答をくっつけて、さらに何回やり取りしてある程度までプログラムを作りました。

2.プログラムソースの修正

ChatGPTが作成したソースを実行すると、そのままではエラーになる箇所があったので対応しました。

2-1.googletransの4.0.0 をインストール

googletransを使って翻訳する行でエラーが出ていました。

AttributeError("'NoneType' object has no attribute 'group'")

このエラーに関して調べると以下の記事がありました。

こちらにgoogletransの「『Version: 3.0.0』の場合は正常に動作しない可能性がある」との記載があったので『Version: 4.0.0』に入れ直してみることにしました。

入れ直し方は以下のブログにまとめられていました。

fukashi-mo様のブログを引用m(__)m

pip uninstall googletrans
→指定せずにgoogletransをインストールすると3.0.0が入るのでアンインストール(23/08時点)

pip install googletrans==4.0.0-rc1

4.0.0を入れなおした後で再実行するとエラー「AttributeError("'NoneType' object has no attribute 'group'")」は解消しました(^^)/

2-2.機能の制約事項をポップアップに記載

以下2つの制約事項をポップアップに表示するようにしました。

「字幕付き動画のみ要約可能」

「要約には数分掛かります」

修正後のソースはこちらになります。

import PySimpleGUI as sg
from youtube_transcript_api import YouTubeTranscriptApi
from transformers import pipeline
from googletrans import Translator

def summarize_and_translate_video(url):
    video_id = url.split("v=")[1]
    transcript = YouTubeTranscriptApi.get_transcript(video_id)
    
    text = ""
    for entry in transcript:
        text += entry['text'] + " "
    
    summarizer = pipeline("summarization")
    summary = summarizer(text, max_length=100000, min_length=30, do_sample=False)
    
    translator = Translator()
    translation_result = translator.translate(summary[0]['summary_text'], src='en', dest='ja')
    
    if translation_result:
        translated_summary = translation_result.text
    else:
        translated_summary = "翻訳に失敗しました。"
    
    return translated_summary

def main():
    sg.theme('DefaultNoMoreNagging')

    layout = [
        [sg.Text('YouTubeビデオURLを入力してください:')],
        [sg.Text('字幕付き動画のみ要約可能')],
        [sg.Text('要約には数分掛かります')],
        [sg.InputText(key='-URL-')],
        [sg.Button('要約'), sg.Button('終了')],
        [],
    ]

    window = sg.Window('YouTubeビデオ要約ツール', layout, finalize=True)

    while True:
        event, values = window.read()

        if event == sg.WINDOW_CLOSED or event == '終了':
            break
        elif event == '要約':
            url = values['-URL-']
            try:
                translated_summary = summarize_and_translate_video(url)
                sg.clipboard_set(translated_summary)
                sg.popup('要約完了', '要約をクリップボードにコピーしました:', translated_summary)
                window['-URL-'].update('')
                window['-URL-'].Widget.clipboard_clear()
                window['-URL-'].Widget.update()
                sg.Button('再コピー', key='-COPY-')
            except Exception as e:
                sg.popup_error(f"エラーが発生しました: {str(e)}")
        
        elif event == '-COPY-':
            copied_text = sg.clipboard_get()
#            sg.clipboard_set(copied_text)
            sg.clipboard_set(translated_summary)
            sg.popup('要約内容を再コピーしました:', copied_text)

    window.close()

if __name__ == "__main__":
    main()

3.作成したプログラムの動作確認

プログラムを修正できたので動作確認を行います。

3-1.YouTube動画のURLをコピー

今回はこちらの動画を要約します。

英語字幕がついており、あまり再生時間が長くない動画を選びました。

https://www.youtube.com/watch?v=UF8uR6Z6KLc

3-2.VS Codeからプログラムを実行

PySimpleGUIで作られたポップアップが表示されました。

入力欄に先ほどのURLを入力し「要約」ボタンをクリックします。

考え中のモードに入るので待ちます。

しばらくして「要約完了」のポップアップが表示されました。

表示された文字列と同内容のものがクリップボードに保管されていました。

stanford.edu は世界最高の書道プログラムです。それはあなたの人生と点を結びつける素晴らしい方法です。Apple から解雇されていないのであれば、それを見つけることができるでしょう。

クリップボードに保管された文章

要約→翻訳しているので出力結果はやや意味不明な内容になっていますが処理としては動いているので今回はOKとします(;'∀')

「要約完了」を閉じると初期画面に戻りました。

プログラムはエラーなく実行できました。

以上で動作確認は完了です。

4.今回できなかったこと

エラーハンドリング

以下のようなケースでエラーがおきることが分かっています

・字幕のない動画の要約

・英語でない字幕のついた動画の要約

これらのケースでエラー・警告のメッセージを出すロジックが実装できていません。

また、エラー時のポップアップが初期表示のポップアップの裏に出てしまう不具合が起きることもあり、こちらについても対策を考える必要があります。

プログラムのexe化

exe化して実行するとエラーになりました。

エラーログの出力先に関するエラーのようだったので今後改善できればと思います。

まとめ

Pythonで英語のYoutube動画を要約→翻訳するプログラムを作成する手順をまとめました。

うまくいかない部分もありましたが色々調べて学ぶことができました。

同じように勉強中の方の参考になればうれしいです。

私のプロフィール↓

勉強メモ シリーズ↓

ChatGPTを使ったプログラミング↓

最後まで閲覧ありがとうございましたm(__)m

いいなと思ったら応援しよう!