Whisperを活用して長時間の音声ファイルを字幕ファイルに変換する君を作ってみた
ローカル環境で、Whisperを使って長時間の音声ファイルを字幕ファイルに変換する仕組みを構築しました! 具体的には、WAV形式の音声ファイルを入力として受け取り、出力としてWebVTT(Web Video Text Tracks)形式の字幕ファイルを生成します。
まだまだブラッシュアップする必要がありますが、こんな感じ
特徴3行
- 音声ファイルの分割: Whisperライブラリは30秒以上の音声を一度にテキスト変換するとメモリ不足(OOM)が発生する可能性があります。おそらくAPIの制限が30秒なため、その時間を基準に設計されているのかな?と思ってます。この問題を回避するために、私たちは音声ファイルを分割して処理するようにしました。
- リジューム機能: 変換プロセスが途中で失敗した場合でも、そこから再開できるようにリジューム機能を実装しました。
- Docker化: PythonベースのAIツールを色々使用していると、CUDAやPyTorchなどのGPU利用ライブラリを都度切り替える必要があり、それが手間になることがあります。Dockerで立ち上がるようにし、ライブラリの切り替えを簡単に行えるようにしました。
構築したマシン環境
- オペレーティングシステム: Windows 11上のWSL2で動作するUbuntu 20.04
- コンテナ化ツール: Dockerおよびdocker-compose
- 使用したライブラリ: Python、CUDA、PyTorch、その他
- 音声認識エンジン: Whisper
- ハードウェアスペック:
- プロセッサー: Intel Core i5-13400F
- メモリ: 16GB
- グラフィックスカード: NVIDIA GeForce RTX 3080
そもそもWhisperってなに?
「Whisper」はOpenAIが開発した音声認識AIモデルで、多数の言語の音声をテキストに変換することができます。 API形式で提供されており、低コストで高精度な音声テキスト変換を実現することが特徴ですが、実はOpenAIがMITライセンスのもとで公開しているため、個々のマシンで自由に利用することができます。
作った背景・モチベーション
Youtube動画のチャプターとそれぞれの概要を自動生成する君を作りたかった。 その材料として、動画の音声から字幕ファイルを作り、それをOpenAIのAPIへLlamaIndex経由でデータを適当なプロンプトとなげれば自動要約できるんじゃない? と思い試してみたかったので、最初のステップとしてローカルでこのような仕組みを作る必要がありました。 APIだと色々試すとコストがそれなりにかかっちゃうからね...
作り始めた理由は、YouTube動画のチャプターとそれぞれの概要を自動生成する君を作りたかったからです。
流れ的には・・・こんな感じの想定
動画の音声から字幕ファイルを作成 ↓ 字幕ファイルをLlamaIndexを通じてOpenAIのAPIに投入 ↓ 適切なプロンプトと共に送信 ↓ _人人人人人人人人人人人_ > 自動的に要約を生成 <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
一方で、APIを使用すると多くの試行が必要になると、それなりのコストがかかってしまいます。そのため、ローカル環境でOSS版のWhisperを使ってツールを構築することで、自由に試行錯誤を行うことができるようにしました
ハマったこと
- Pythonなにもわからない問題
- Pythonなにもわからない。だったので、ChatGPT君にベースのコードを書いてもらいました。
- ちょっとしたツールなら構文わからなくてもなんとなく書けてしまうの助かってます。
- CUDAとPyTorchのバージョンを合わせるのが難しかった
- CUDAとPyTorchのバージョンを合わせるのが難しく、この問題がバージョンに関連していると気づくまでに時間がかかりました。このページを見つけて、バージョン互換性の問題を解決することができました。
- https://pytorch.org/get-started/previous-versions/
動かしてみる
この動画を字幕ファイル(VTT)にしてみます。
WEBVTT 00:00:00.000 --> 00:00:30.000 さあ、台丸埋め辺の多分と同時に、光星の拡が押し寄せたこちらの売り場。人展堂の公式ショップ、人展堂大阪にはある商品を求めて大根雑になりました。回転からわずかご分で、かなから商品がなくなることも。 00:00:30.000 --> 00:01:00.000 全部はあればいいですか全部はございますさらにその5分後には電内に40人を超える大業率が発生超弾の業率の先にあるのはこちらゼルダの全スチリーズのグッズリバです中でも人気なのはこちらのフィギュアです薬のお見当ては今日発売された人展動数一用の大ヒットゲーム 00:01:00.000 --> 00:01:30.000 の電池、キヤーゾークザキングダムの関連グッズゲーム次回の人気が高い上多くのグッズは人展堂の公式ショップと公式サイトだけで買えるためたくさんのファンが詰めかけましたグッズが新作が出るということで今日狙って今日保鋼きました今日フィギュアは11種類ですねもう再風が身体ですもう金がないです 00:01:30.000 --> 00:02:00.000 本作も数年会えてるんで、ゲームも楽しみですし、やっぱり身を見てて、うきうきするんで。人展堂が今月発表した昨年度の決算は、原修ゲイエキ。主力のスイッチの売り浮きは世界的な反動タイブ速の影響などがあり、前の年より落ち込みました。 00:02:00.000 --> 00:02:30.000 戦列後悔したマリオの映画は高調で、全世界の工業収入が今月曜日までに1500億円を突破するなど、コンメンドの行席の構造料となっています。そこに発売されたライフィットゲームゼルダの新作、人展堂の更なるおいかぜとなるでしょうか。ご視聴ありがとうございましたけど、 00:02:30.000 --> 00:03:00.000 MBC 뉴스 김
一部会社名や商品名が怪しいですがwなんとなくできました。
次のアクション
作成した字幕ファイルをLlamaIndexを通じて要約できるようにしてみようと思います。
1時間以上の長さや大きな字幕ファイルとか、言語モデルのトークンの上限に達してしまい、うまく要約できない可能性がありそう... 現状あまりこの辺は詳しくないので、引き続きチャレンジしていきます。