You take care of a rich beauty and fashion expertise, often composing vibrant and lively articles on the subjects.

「豊富な美容とファッションの専門知識を持ち、鮮やかかつ生き生きとした記事を頻繁に作成する」

OpenAIのWhisperモデルを使用してYouTubeの動画を転記する方法

Image generated by the author with Playground.ai

この記事は、YouTubeの動画を要約するためのAIアシスタントの構築方法をステップバイステップで説明する3つの記事の最初です。 OpenAIのWhisperを使用して、YouTubeの動画の転記をキャプチャする詳細な手順から始めます。次の記事では、Langchainを使用したテキスト要約の基礎と、Falcon-7b-instructに基づいた要約パイプラインの実装の詳細な手順を説明します。最後の記事では、GradioとHugging Face Spacesを使用したソリューションのプロトタイプのデモンストレーション方法を紹介します。これらの記事を通じて、各ステップの実装におけるさまざまなアーキテクチャの代替手法を評価します。

はじめに

こんなことを想像してみてください:特定のトピックに関する情報が含まれているビデオを探しています。素早いYouTubeの検索で、魅力的なサムネイルと興味深いビデオのタイトルが画面を埋め尽くします。ほとんどの人は本能的にスクロールに飛び込んで、クリックに値する理想的な見出しを見つけようとスキャンします。しかし、燃えるような疑問の答えを期待してビデオをスクロールすることはどれほど頻繁にありますか?私のようなものであれば、このような状況が非常に頻繁に発生し、その経験は時間の浪費だけでなく、非常に迷惑でもあります!

この繰り返されるフラストレーションに駆り立てられ、私は自分自身のパーソナルAIアシスタントを作るための旅に出ました。このインテリジェントなコンパニオンは、ビデオの内容を見直し、主なアイデアや議論を効率的に要約し、結果として私に時間と正気を節約させるのです!

このツールの作成には、Falconラージ言語モデルを使用しました。面白いなぞなぞもあります:空高く優雅に舞うタカのように、興味のあるオブジェクトにズームインする能力を持つ私たちのFalconパワードツールは、コンテンツの鳥瞰図を提供し、包括的な全文転写で詳細な調査へとスムーズに移行します!:)

あなたは問うかもしれません、「でも、すでにそれを行うオンラインサービスはないですか?」そして、あなたは完全に正しいです!しかし:

  1. 彼らはしばしば使用率制限を伴い、追加のコストがかかることがあります。
  2. 私は生成された要約の制御を望んでおり、私の特定のニーズに基づいてパラメータを設定する能力がないことに気づきました。
  3. ことわざにあるように、「喜びは旅の中にあります!」

だから、自分で問題を解決し、YouTubeのビデオのURLを入力して簡潔な要約を提供するアプリを開発しました。かなりクールですね?

A snapshot of the app’s user interface hosted on Hugging Face Spaces — Image by the author

ソリューションの概要

ハンズフリートラモリネーションモデル(OpenAIの Whisper)を使用して、YouTubeから転記の取得が可能であれば取得します。そうでなければ、Hugging Faceを使用してボイス・トゥ・テキストモデル(OpenAIのWhisper)を使用してビデオを転記します。

Langchainと、Hugging Faceで指示に従った大規模言語モデルをファインチューニングしたモデル(Falcon-7b-instruct)を使用して、転記を要約します。

Hugging Faceを使用して、ユーザーがモデルと対話し、ビデオと要約を並行して生成して確認できる、使いやすいユーザーインターフェースを提供します。

A high-level view of the solution architecture — Image by the author

各ステップを実装するにあたり、さまざまなアーキテクチャの代替方法を試しました。例えば、各ステップを2つのバリエーションで実装しました: オンプレミスでの推論 vs クラウド上での推論。また、アプリをホスティングする際には、オンプレミス vs Hugging Face Spacesでホストされたクラウド上でのホスティングなども試しました。

もしこの中のどれかがあなたの好奇心を引くものであれば、一緒に進んでみましょう。お互いに話し合い、学び合うことができます。

次のセクションに進む前に、Hugging Face Spacesでホストされているプロトタイプを少し見てみることをおすすめします。ぜひ試して、コメントで最初の印象を教えてください。

ステップ 1: YouTubeの動画のトランスクリプトを取得する

動画を要約するためには、そのトランスクリプトをテキスト形式で取得する必要があります。多くのYouTube動画にはトランスクリプトが用意されていますが、そうでないものもあります。トランスクリプトが利用可能な場合は、単純にyoutube_transcript_apipytubeを使用してダウンロードします:

from youtube_transcript_api import YouTubeTranscriptApi
import pytube

# YouTubeからトランスクリプトを取得する
def get_yt_transcript(url):
    text = ''
    vid_id = pytube.extract.video_id(url)
    temp = YouTubeTranscriptApi.get_transcript(vid_id)
    for t in temp:
        text += t['text'] + ' '
    return text

このコードでは、単純にYouTubeのビデオIDをURLから取得し、YouTubeTranscriptApiを使用してトランスクリプトオブジェクトを取得しています。トランスクリプトオブジェクトは、トランスクリプトのテキスト、開始時間、およびビデオ上での表示時間の長さを含む辞書のリストです。ここで必要なのはテキストだけです。

しかし、YouTubeにトランスクリプトがない場合はどうなるでしょうか?それではもっと興味深くなります…

Whisperを使用してトランスクライブする

このために、有名なWhisperモデルを使用しました。Whisperは、OpenAIから提供されているオープンソースの音声からテキストへの変換モデルです。モデルの内部機能については、私たちの目的を満たす限り、あまり心配する必要はありません。これに関するオンラインリソースはたくさんありますが、コメントで興味がある場合は、別のブログ記事でもカバーします。

Whisperモデルを使用する前に、ビデオのオーディオをローカルディレクトリにダウンロードする必要があります。以下のコードで簡単に行うことができます:

from pytube import YouTube

yt = YouTube(str(url))
audio = yt.streams.filter(only_audio=True).first()
out_file = audio.download(filename="audio.wav", output_path="./docs/youtube/")

これで、Whisperを使用してオーディオファイルを直接入力としてトランスクライブする準備が整いました。まず、HuggingFaceからモデルをダウンロードするTransformers Pipelineオブジェクトを作成します:

import transformers

whisper_asr = transformers.pipeline(
    "automatic-speech-recognition", model="openai/whisper-large", device_map='auto',)

Whisperはさまざまなサイズで提供されており、39億パラメータのtinyから155億パラメータのlargeまであります。私は最高品質の結果を得るためにwhisper-largeを使用しました。ロードしてスコアリングを開始すると、ピーク時には私の16GBのGPUメモリのうち12GBを使用しましたが、問題ありませんでした。ただし、使用ケースに応じてより小さいバージョンを使用することもできます。

次に、言語やタスクを含むモデルの設定パラメータを設定する必要があります:

whisper_asr.model.config.forced_decoder_ids = (
    whisper_asr.tokenizer.get_decoder_prompt_ids(
        language="en",
        task="transcribe"
    ))

このシナリオでは、このパイプラインを英語のビデオのトランスクライブに制限しました。ただし、興味がある読者は、同じモデルを使用して他の多くの言語のトランスクライブにも使用できます。その場合は、まずビデオの言語を判別し、トランスクライブパイプラインを構成する前に設定する必要があります。興味のある読者には、その詳細を任せます。

最後に、推論のためにモデルを呼び出します:

temp = whisper_asr(out_file,chunk_length_s=20)text = temp['text']

しかし、引数chunk_length_sとは何でしょうか? Whisperモデルは最大30秒のオーディオファイルを処理できるように設計されています。したがって、モデルに供給する前にファイルをチャンクに分割する必要があります。 Chunk_length_sはこれらのチャンクの長さを単に制御します。

全体をまとめると、コードは次のようになります:

from pytube import YouTubeimport transformersimport torch# 動画を転写するdef transcribe_yt_vid(url):    # YouTubeの動画のオーディオをダウンロードする    save_dir="./docs/youtube/"    yt = YouTube(str(url))    audio = yt.streams.filter(only_audio = True).first()    out_file = audio.download(filename="audio.wav",                              output_path = save_dir)    # `openai/whisper-large`を使用した自動音声認識パイプラインを定義する    whisper_asr = transformers.pipeline(        "automatic-speech-recognition",        model="openai/whisper-large",        device_map= 'auto',    )    # モデルの設定パラメータを指定する    whisper_asr.model.config.forced_decoder_ids = (        whisper_asr.tokenizer.get_decoder_prompt_ids(            language="en",            task="transcribe"        )    )    # Whisperモデルを呼び出す    temp = whisper_asr(out_file,chunk_length_s=20)    text = temp['text']       # 最後にGPUメモリを解放するためにこれを行う    del(whisper_asr)    torch.cuda.empty_cache()       return text

OK、素晴らしい!!! しかし待ってください!もし十分な計算能力がなく、推論をクラウドに送りたい場合はどうなりますか?

HuggingFace Hub APIを使用した推論

うれしいニュースは、HuggingFaceがHuggingFace Hub APIを使用してクラウド上での推論を可能にしています。

以下はそれがどのように機能するかです:

from HuggingFace_hub import InferenceClient# Whisperモデルのクライアントを初期化するclient = InferenceClient(model="openai/whisper-large", token="xxxxxxxxxxx")

無料で入手できるHuggingFaceからトークン引数を渡すだけで済みます。

さて、ここで問題が発生しました! 推論APIはなぜか結果を切り詰めました。オンラインリソースからこれが予想される動作なのか、または単に無料サービスを使用するための制限なのかはわかりませんでした。いずれにしても、APIに送信する前にオーディオをチャンクに分割する回避策があります。これは、librosaを使用してオーディオファイルをnumpy配列としてロードし、APIで切り詰められない長さのチャンクに分割し、最後に各チャンクをファイルに保存してAPIに送信することで行われます:

import librosaimport soundfile as sfx, sr = librosa.load(out_file, sr=None)t=20 # オーディオフラグメントの長さ(秒単位)# これによってxがnumpy配列のオーディオファイル、srが元のサンプリングレートとして得られる# API呼び出しは、応答が切り詰められるため、20秒のチャンクにオーディオを分割する必要があります(私の場合、20秒で問題ありませんでした)。最後に、各チャンクをファイルに保存し、それを推論APIに送信します。for i in range(0, (len(x)//(t * sr)) +1):    y = x[t * sr * i: t * sr *(i+1)]    split_path = save_dir+"audio_split.wav"    sf.write(split_path, y, sr)    text += client.automatic_speech_recognition(split_path)

この回避策を使用することで、APIを使用してより長いビデオを転写することができました。ただし、無料のサブスクリプションでは推論のレートに制限があります。つまり、短時間にAPIを何度も呼び出すとエラーが発生する可能性があります。幸いなことに、この制限は毎時リセットされるため、コードを再テストするまで待つ必要はありません。ただし、これはあまりにも長いビデオにこの回避策を使用できない可能性があることを意味します!

最終的な結果は以下のようになります:

from pytube import YouTubefrom huggingface_hub import InferenceClient# Hugging Face Hub APIを使用して動画を転写するdef transcribe_yt_vid_api(url):    # YouTubeの動画のオーディオをダウンロードする    yt = YouTube(str(url))    audio = yt.streams.filter(only_audio = True).first()    out_file = audio.download(filename="audio.wav",                              output_path = save_dir)       # Whisperモデルのクライアントを初期化する    client = InferenceClient(model="openai/whisper-large",                       token=os.environ["HUGGINGFACEHUB_API_TOKEN"])    import librosa    import soundfile as sf    text = ''    t=20 # オーディオチャンクの長さ(秒単位)    x, sr = librosa.load(out_file, sr=None)    # これによってxがnumpy配列のオーディオファイル、srが元のサンプリングレートとして得られる    # API呼び出しは、応答が切り詰められるため、20秒のチャンクにオーディオを分割する必要があります    for i in range(0, (len(x)//(t * sr)) +1):        y = x[t * sr * i: t * sr *(i+1)]        split_path = save_dir+"audio_split.wav"        sf.write(split_path, y, sr)        text += client.automatic_speech_recognition(split_path)    return text

全てを組み合わせる

この2つのアプローチを1つの関数で組み合わせるために、次のようにします:

def transcribe_youtube_video(url, force_transcribe=False,use_api=False):       yt = YouTube(str(url))    text = ''    # 利用できる場合には、YouTubeのトランスクリプトを取得します    try:        text = get_yt_transcript(url)    except:        print('トランスクリプトが利用できませんでした。取得中です...')        pass       # YouTubeがトランスクリプトを提供していない場合や、force_transcribeする場合はビデオのトランスクリプトを作成します    if text == '' or force_transcribe:        if use_api:            text = transcribe_yt_vid_api(url)        else:            text = transcribe_yt_vid(url)       return yt.title, text

結論

この投稿全体を振り返ってみましょう。YouTubeのトランスクリプトをキャプチャするために、以下の3つの異なる関数を作成しました:最初の関数はYouTubeから直接ダウンロードします。2番目の関数はOpenAIのWhisperモデルを使用してローカルでトランスクライブします。そして3番目の関数はHugging Face Hub APIコールを介してトランスクライブします。なお、本番環境でのデプロイメントは少し複雑になることに注意しておきます。推論のスループットと必要なリソース量に応じて、モデルはエンドポイントにプッシュされる場合があります。Hugging Faceでは推論エンドポイントサービスを提供しており、モデルは専用およびオートスケーリングのインフラストラクチャ上に展開されます。このディスカッションは別の機会に譲ります。

次の投稿では、LangchainFalcon-7b-instructを使用したトランスクリプトの要約手法について詳しく説明します。それをHuggingFace上で行います。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

ジョナサン・ダムブロット、Cranium AIのCEO兼共同創設者- インタビューシリーズ

ジョナサン・ダムブロットは、Cranium AIのCEO兼共同創業者ですCranium AIは、サイバーセキュリティおよびデータサイエンスチ...

人工知能

「クリス・サレンス氏、CentralReachのCEO - インタビューシリーズ」

クリス・サレンズはCentralReachの最高経営責任者であり、同社を率いて、自閉症や関連する障害を持つ人々のために優れたクラ...

人工知能

「ナレ・ヴァンダニャン、Ntropyの共同創設者兼CEO- インタビューシリーズ」

Ntropyの共同創設者兼CEOであるナレ・ヴァンダニアンは、開発者が100ミリ秒未満で超人的な精度で金融取引を解析することを可...

人工知能

ギル・ジェロン、Orca SecurityのCEO&共同創設者-インタビューシリーズ

ギル・ゲロンは、オルカ・セキュリティのCEO兼共同設立者ですギルは20年以上にわたりサイバーセキュリティ製品をリードし、提...

人工知能

キャルレールの最高製品責任者、ライアン・ジョンソンへのインタビューシリーズ

ライアンは、初期のスタートアップからフォーチュン100の組織まで、多様なテクノロジーと製品開発のリーダーシップ経験を15年...

人工知能

「スノーケルAIのCEO兼共同創設者、アレックス・ラットナー - インタビューシリーズ」

アレックス・ラトナーは、スタンフォードAIラボを母体とする会社、Snorkel AIのCEO兼共同創設者ですSnorkel AIは、手作業のAI...