見出し画像

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で止まってしまう現象の解決

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

おしまい

この記事が気に入ったらサポートをしてみませんか?