メインコンテンツへスキップ
見出し画像
Photo byia19200102

YouTubeの英語音声をfaster-whisperとLangChainですばやく要約してみる

    whisperによる文字起こしについては高速に文字起こしができるようになったとのこと。というわけで、WhisperとLangChainを組み合わせて長時間の音声の要約に取り組んでみました。

    音声ファイルの準備

    ダウンローダーのインストール

    !pip install yt-dlp

    音声ファイルのダウンロード

    !yt-dlp -x --audio-format mp3 https://youtu.be/35pSeFWWatk -o bard.mp3

    Google I/O 2023でのBardプレゼンの音声で試してみます。
    Sissie Hsiao, Vice President and General Manager, Assistant and Bard, speaks at Google I/O on May 10, 2023 about updates coming to Bard.

    faster-whisperで文字起こし

    faster-whisperのインストール

    !pip install "faster-whisper @ git+https://github.com/guillaumekln/faster-whisper@master#faster-whisper[conversion]"

    英語のまま文字起こしして、テキストファイルにとりあえず保存

    from faster_whisper import WhisperModel
    
    model_path = "whisper-large-v2-ct2/"
    model = WhisperModel(model_path, device="cuda", compute_type="float16")
    
    segments, info = model.transcribe("bard.mp3", beam_size=5)
    
    print("Detected language '%s' with probability %f" % (info.language, info.language_probability))
    
    with open("bard.txt", "w") as f:
        for segment in segments:
            print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
            print(segment.text ,file=f)

    LangChainでテキスト要約

    from langchain.chat_models import ChatOpenAI
    from langchain.text_splitter import CharacterTextSplitter
    from langchain.docstore.document import Document
    from langchain.chains.summarize import load_summarize_chain
    
    llm = ChatOpenAI()
    text_splitter = CharacterTextSplitter()
    
    texts = text_splitter.split_text(text)
    docs = [Document(page_content=t) for t in texts]
    
    chain = load_summarize_chain(llm, chain_type="map_reduce")

    翻訳パイプラインを準備

    from transformers import pipeline
    ej_translator = pipeline("translation", model="staka/fugumt-en-ja")

    英語のまま要約してから、日本語訳してみる

    ej_translator(chain.run(docs))[0]['translation_text']

    'Googleの言語モデルであるBARDは、コード生成やデバッグといったタスクにおいて、数学や論理、推論スキルを改善して開発者とコラボレーションできるようになった。BARDは、コード引用、説明、およびパートナーであるRepl.itによるコードの改善とエクスポートと実行のための提案を提供することができる。さらに、Googleは、GmailとDocsにダークモードと新しいエクスポートアクションを導入する。BARDの待機リストは削除され、180以上の国と地域で利用可能になる。将来、BARDはAdobe Fireflyと提携して、新しいイメージを生成する予定である。'

    定量評価はできませんが、いい感じに要約できた気がします。😄

    Streamlitで自動化

    1時間以上の長いファイルだと、WhisperがCUDA failed whit out of memoryで止まってしまう現象があり、まだ解消できていないのですが、ひとまず、Stereamlitで自動化してみました。

    import streamlit as st
    import subprocess
    
    from faster_whisper import WhisperModel
    
    from langchain.chat_models import ChatOpenAI
    from langchain.text_splitter import CharacterTextSplitter
    from langchain.docstore.document import Document
    from langchain.chains.summarize import load_summarize_chain
    
    from transformers import pipeline
    st.title('Youtube 英語音声の要約アプリ🎤')
    
    model_path = "whisper-large-v2-ct2/"
    model = WhisperModel(model_path, device="cuda", compute_type="float16")
    
    llm = ChatOpenAI()
    text_splitter = CharacterTextSplitter()
    chain = load_summarize_chain(llm, chain_type="map_reduce")
    ej_translator = pipeline("translation", model="staka/fugumt-en-ja")
    
    
    url = st.text_input('要約したい YoutubeのURL')
    
    if st.button('実行', key=0):
        subprocess.run(
            ["yt-dlp", "-x", "--audio-format", "mp3", "-o", "temp/temp.mp3", url], capture_output=True)
    
        with st.spinner('結果を表示しています... '):
            segments, info = model.transcribe("temp/temp.mp3", beam_size=5)
            st.write("言語 : " + str(info.language))
            st.write("推定確率 :" + str(info.language_probability))
    
            with open("temp/out.txt", "w", encoding="utf8") as out:
                for segment in segments:
                    st.write("[%.2fs -> %.2fs] %s" %
                             (segment.start, segment.end, segment.text))
                    out.write(segment.text + "\n")
    
            with open("temp/out.txt", "r", encoding="utf8") as out:
                text = out.read()
                texts = text_splitter.split_text(text)
                docs = [Document(page_content=t) for t in texts]
                output_text = ej_translator(chain.run(docs))[0]['translation_text']
                st.write(output_text)
    

    まとめ

    • 10分45秒の英語音声ファイルを約1分ちょっとで要約できました。

      • 音声ダウンロード 8秒

      • 文字起こし 35秒

      • 日本語要約文の作成 31秒

    • すくなくとも、私の拙い英語ヒアリング力に頼るよりは、短時間でざっと情報を得るのに役立つツールになりそうです。

    • 宿題:WhisperがCUDA failed whit out of memoryで止まってしまう現象の解決

    お読みいただき、ありがとうございました。

    おしまい

     
     
    DXとかいうナウい言葉とは無縁の養殖魚。AIを中心に新しい技術をちょっとづつ試食しています。

    あなたへのおすすめ