今回はOpenAI の Whisper モデルを再実装した高速音声認識モデルである「Faster Whisper」を使用して、英語のYouTube動画を日本語で文字起こしする方法を紹介します。
Google colabを使用して簡単に実装することができますので、ぜひ最後までご覧ください。
Google Colaboの使い方はこちら
今回の目標
・Faster Whisperとは
・yt-dlpとは
・英語→日本語に翻訳
・英語のYouTube動画を日本語で文字起こし
Whisperとは
「Whisper」は2022年9月にOpenAIが発表した、音声認識モデルです。
インターネット上から収集された合計68万時間におよぶ音声データでトレーニングされており、認識した音声をもとに文字起こしをすることができます。
つまり、例えば「.mp3」などの音声ファイルから文字起こしをして、テキストに保存することができます。
また、これらはMITラインセンスとなっており、誰でも無料で簡単に使用することが可能です。
OpenAIの公式ブログ記事には「早口のセールストーク」「K-POPの曲」「フランス語」「独特なアクセントの会話」といった音声のサンプルが用意されており、「REVEAL TRANSCRIPT」をクリックするとWhisperで文字起こした結果を確認できます。
このモデルは多様な音声の大規模なデータセットでトレーニングされており、多言語の音声認識、音声翻訳、言語識別を実行できるマルチタスク モデルでもあります。
日本語にも対応しているため、日本語のまま使用することができます。
詳細はリンク先からご確認ください。
Github:https://github.com/openai/whisper
論文: https://cdn.openai.com/papers/whisper.pdf
公式サイト:https://openai.com/blog/whisper
公開されているモデルにはいくつか種類があります。
多言語モデルは日本語にも対応しています。
モデルサイズ | パラメータ数 | 英語専用 モデル | 多言語モデル | 必要なVRAM | 相対速度 |
---|---|---|---|---|---|
tiny | 39 M | tiny.en | tiny | ~1GB | ~32x |
base | 74M | base.en | base | ~1GB | ~16x |
small | 244M | small.en | small | ~2GB | ~6x |
medium | 769M | medium.en | medium | ~5GB | ~2x |
large | 1550 M | なし | large | ~10GB | 1x |
Faster Whisperとは
Faster-whisper は、OpenAI の Whisper モデルを再実装した高速推論エンジンで、CTranslate2 という Transformer モデルを活用しています。OpenAI の公式モデルを軽量化し、独自の最適化により最大4倍の高速化が実現されています。また、軽いと評判の Whisper.cpp よりも高速に動作し、GPU による高速化の恩恵を受けることができます。本家のwhisperと比較しても高速度で処理することが可能です。
Implementation | Precision | Beam size | Time | Max. GPU memory | Max. CPU memory |
---|---|---|---|---|---|
openai/whisper | fp16 | 5 | 4m30s | 11325MB | 9439MB |
faster-whisper | fp16 | 5 | 54s | 4755MB | 3244MB |
faster-whisper | int8 | 5 | 59s | 3091MB | 3117MB |
開発元は OpenAI ではなく、あくまで OpenAI のモデルをベースに改良・再実装を行ったものである点に注意してください。Faster-whisperを使用するメリットは以下のようにまとめることができます。
- 外部に音声データを送信したくない場合
- 25MB 以上の音声データを送信したい場合
- 無料で利用したい場合
- 他の処理と組み合わせて使用したい場合(例えばYouTube動画をダウンロードしてから文字起こしするなど)
詳細はリンク先からご確認ください。
yt-dlpとは
yt-dlpは、YouTubeをはじめとするオンライン動画サイトから動画や音声をダウンロードするための便利なツールです。かつては「youtube-dl」という同様のツールが人気を博していましたが、近年は開発が停滞し、ダウンロード速度の低下が問題となっていました。そこで登場したのが、youtube-dlの改良版とも言えるyt-dlpです。
yt-dlpの最大の特徴は、youtube-dlと比較してダウンロード速度が格段に速いことです。この速度向上により、ユーザーは手間なく迅速に動画や音声ファイルを入手することができます。また、動画だけでなく、音声ファイルのみを抽出することも可能であり、用途に合わせて選択できる柔軟性も提供しています。
公式の実装は以下のリンクからご覧ください。
英語→日本語に翻訳
Huggingfaceにあるmodel='staka/fugumt-en-ja'
というモデルを使用することで、簡単に英語から日本語に翻訳することができます。以下の例ではThis is a cat.
という文章を日本語に翻訳します。
text = 'This is a cat.'
from transformers import pipeline
fugu_translator = pipeline('translation', model='staka/fugumt-en-ja')
fugu_translator(text)
実行結果:
[{'translation_text': 'これは猫です。'}]
英語を日本語に翻訳することができました。
詳細は以下の記事をご覧ください。
英語のYouTube動画を日本語で文字起こし
以上の内容を踏まえ、早速文字起こしを実装してみましょう。
今回紹介するコードは以下のリンクからもご覧いただけます。
準備
ここからは、Google colab環境で進めていきます。
はじめに、GPUを使用できるように設定をします。
「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更
必要なライブラリをインストールします。
!pip install faster-whisper transformers sentencepiece
!python -m pip install -U yt-dlp
以上で準備が完了しました。
実装
まずは音声データを用意します。
今回はこちらの動画をお借りして、文字起こしを行ってみましょう。
この音声データのYouTube動画(https://youtu.be/n_aUYrXre18)から音声のみを「audio.mp3」として保存します。
!yt-dlp -x --audio-format mp3 https://www.youtube.com/live/outcGtbnMuQ?feature=share -o audio.mp3
「large-v2」というモデルを使用して、上で保存した音声データから文字起こしを実装します。
# インポートとWhisperモデルの設定
from faster_whisper import WhisperModel
model_size = "large-v2"
# WhisperModelインスタンスの作成
model = WhisperModel(model_size, device="cuda", compute_type="float16")
# 音声ファイルをテキストに変換
segments, info = model.transcribe("audio.mp3", beam_size=5)
text = ''
# 各セグメントからテキストを抽出
for segment in segments:
text +=segment.text + ('\n')
# 関数: 文末までの文章を結合
def join_sentences_until_period(text):
sentences = text.strip().split('\n')
result = []
i = 0
while i < len(sentences):
current_result = []
while i < len(sentences) and not sentences[i].strip().endswith('.'):
current_result.append(sentences[i].strip())
i += 1
if i < len(sentences):
current_result.append(sentences[i].strip())
i += 1
result.append(' '.join(current_result))
return result
# 文末までの文章を結合
output = join_sentences_until_period(text)
# 翻訳モデルのインポートとインスタンス化
from transformers import pipeline
fugu_translator = pipeline('translation', model='staka/fugumt-en-ja')
# 各行について翻訳を実行し、結果を出力
for line in output:
# print(line)
print(fugu_translator(line)[0]['translation_text'])
実行すると、以下のような結果が出力されます。
GPT-4開発者デモのライブストリームです。
正直なところ、私はこの日がここにあると信じがたい。
OpenAIは、私たちが会社を始めて以来、この技術を構築してきました。
しかし、この2年間、私たちは本当にGPT-4の提供に注力してきました。
〜〜以下省略〜〜
英語の音声ファイルから日本語の文字起こしをすることができました。
まとめ
最後までご覧いただき、ありがとうございました。
今回はOpenAI の Whisper モデルを再実装した高速音声認識モデルである「Faster Whisper」を実装する方法を紹介しました。
YouTube動画の文字起こしによる字幕作成の自動化をはじめ、議事録の作成など業務においても、活用が期待できそうです。