- 本記事は 虎の穴ラボ Advent Calendar 2023 7日目の記事です。
- 6日目はおっくんの「Fresh(Deno)をプラグインで拡張しよう」が投稿されています。
- 次回はiwadyさんのブログが公開されます。ご期待ください!
こんにちは、虎の穴ラボのH.Hです。
今日はOpenAI社が公開している音声から文字起こしをできるツールについて試した結果をまとめていこうと思います。
目次
Whisperとは
WhisperはOpenAI社が公開した音声データからテキストを生成するツールです。
概要はGitHubで公開されており、学習データとして約68万時間の音声データを使用しています。
今回作ったものと環境について
今回はローカル環境で実行し、音声ファイルから文字起こしを行うプログラムを作成しました。
実行にはMacBookとPythonを使用し、対象は日本語の単独話者の音声データを利用します。
インストール
以下の2つのモジュールのインストールが必要です。
1)Pythonのインストール
Python 3.9を使用
brew install python
2)FFmpegのインストール
音声処理のために使用
brew install ffmpeg
ソースコード
以下がソースコードの概要です。
import whisper fileName = "ファイル名" lang = "ja" model = whisper.load_model("モデル名") audio = whisper.load_audio(f"in/{fileName}") result = model.transcribe(audio, verbose=True, language=lang) print(result) with open(f"out/{fileName}.txt", "w") as f: f.write(result["text"])
ディレクトリ構造としては実行するディレクトリ配下にinとoutのディレクトリを作成し、inの中の音声ファイルを読み取り、解析結果をoutに出すというものになります。
処理の流れは以下の通りです。
(1)必要なモジュールのインポート
(2)処理するファイル名の指定
(3)言語の指定
(4)モデルのロード
(5)音声データの読み取り
(6)解析
(7)解析結果がファイルに出力されます
指定するモデルはパラメータによって異なり、tiny, base, small, medium, large, large-v2, large-v3の中から選択できます。英語の場合には特殊なパラメータも存在します。
プログラムはPythonファイルとして保存し、コンソールから実行することで解析ができます。
実行時の注意点
1)初回実行
初回実行時には学習データをダウンロードする必要があり、モデルのサイズによって異なります。tinyなどの小さいモデルは約100MB、largeなどの大きなモデルは約2GB程度となります。
2回目以降の実行ではダウンロードは発生しません。
2)GPUがないPCで実行
GPUがない場合には標準のコードだと最初に以下のメッセージが出る場合があります。
FP16 is not supported on CPU; using FP32 instead
メッセージが出ても実行されるので、そのまま実行をして問題ありません。
実行結果
以下は30秒程度の音声を文字起こしした結果です。
元の音声は過去に個人でマインスイーパーの解説用に作成した音声です。
元の音声のテキスト
なぜ端から1、1が並ぶと隣のマスに隣接する場所が安全地帯なのかですが、端の1に隣接する2つのマスのいずれかがNGになります。さらに隣の1も同じマスを含む3つのマスに1つNGのマスがあります。ということは、1つ目と隣接しないかつ2つ目に隣接するマスには絶対に無いということになります。今回は2と2のそばにNGのマスがあるので、端から1と1が並んだと同じ意味になります。ということはこの場所が安全になります。さらにここに3があるので、この3つの場所がNGになるので、この場所は開けられるとなります。
1)tiny
なぜはしから1。1が並ぶととなりのマスに輪切する場所が安全期待なのかですが、足の1に輪切する2つのマスの、いずれかがエヌジーになります。さらにとなりの1も同じマスを含む3つのマスに、1つへ輪切のマスがあります。という事は、1つめと輪切しないかつ2つ目に輪切するマスには、絶対にないということになります。今回は2とにのそばにエヌジーのマスがあるので、足から1と1が並んだと同じ意味になります。という事はこの場所が安全になります。さらにここに3があるので、この3つの場所がエヌジーになるので、この場所は開けるとなります。
2)base
なぜ橋から1。1が並ぶと隣のマスに輪接する場所が安全自体なのかですが、橋の1に輪接する2つのマスの、イズレカがNGになります。さらに隣の1も同じマスを含む3つのマスに、1つNGのマスがあります。ということは、1つ目と輪接しないかつ2つ目に輪接するマスには、絶対にないということになります。今回は2人のそばにNGのマスがあるので、橋から1と1が並んだと同じ意味になります。ということは、この場所が安全になります。さらに、ここに3があるので、この3つの場所がNGになるので、この場所は明られるとなります。
3)small
なぜ端から1位置が並ぶと隣のマスに隣接する場所が安全地帯なのかですが、端の位置に隣接する2つのマスの、いずれかがNGになります。さらに隣の位置も同じマスを含む3つのマスに、1つNGのマスがあります。ということは、1つ目と隣接しないかつ2つ目に隣接するマスには、絶対にないということになります。今回は2と2のそばにNGのマスがあるので、端から1と1が並んだと同じ意味になります。ということはこの場所が安全になります。さらにここに3があるので、この3つの場所がNGになるので、この場所は開けられるとなります。
4)medium
なぜ端から1、1が並ぶと隣のマスに隣接する場所が安全地帯なのかですが、端の1に隣接する2つのマスの、いずれかがNGになります。さらに隣の1も同じマスを含む3つのマスに、1つNGのマスがあります。ということは、1つ目と隣接しないかつ2つ目に隣接するマスには絶対にないということになります。今回は2と2のそばにNGのマスがあるので、端から1と1が並んだと同じ意味になります。ということはこの場所が安全になります。さらにここに3があるので、この3つの場所がNGになるので、この場所は開けられるとなります。
5)large
なぜ端から1、1が並ぶと隣のマスに隣接する場所が安全地帯なのかですが、端の1に隣接する2つのマスのいずれかがNGになります。さらに隣の1も同じマスを含む3つのマスに1つNGのマスがあります。ということは、1つ目と隣接しないかつ2つ目に隣接するマスには絶対にないということになります。今回は2と2のそばにNGのマスがあるので、端から1と1が並んだと同じ意味になります。ということはこの場所が安全になります。さらにここに3があるので、この3つの場所がNGになるので、この場所は開けられるとなります。
検証結果まとめ
パラメータの多いモデルほど精度が高く、mediumではほぼ完全な文字起こしができました。
数字の位置を漢字の位置と間違えたりミスが現れることが、パラメータの少ないモデルでは確認できます。
実行速度はtinyモデルでは2秒、mediumモデルでは約30秒、largeモデルでは1分程度で解析が完了しました。
活用方法について
Whisperで精度良く文字起こしができることがわかったので動画の文字起こしに使えると感じました。
例えばイベントなどで自分の発表している動画から文章を作成して字幕としてつけるのも容易になるかと思います。
今回の出力は文章全体をつなげていますが、実際の解析結果ではテキストとは別に音声の時間も出てくるので字幕としても利用しやすいと思いました。
以下のような出力がコンソール上に出力されるのに加えて、resultにはjson形式で結果が返されるので利用もしやすいです。
[00:00.000 --> 00:06.880] なぜ端から1、1が並ぶと隣のマスに隣接する場所が安全地帯なのかですが、
またテキスト自体の精度が良いので、以下の流れで議事録の作成も容易になるかと思います。
1)会議を録画する
2)録画した映像から音声のみ抜き出す
3)Whisperで文字起こし
4)ChatGPTに文字起こししたテキストを入れて要約
実際このブログでもコードを書きながらスライドにまとめていき、そのスライドに合わせて喋った映像を会議用のツール(弊社でよく使用しているGoogle meet)で録画してMac標準のQuickTimePlayerから音声を抽出し文字起こしを行いました。
その内容を変換することなくChatGPTに入れて要約をさせています。(「Whisperとは」から「検証結果まとめ」まで)
要約の際に見出し部分は指定やソースコードや実際に出力された結果などは音声に入れていなかったり言い回しや固有名詞の誤りなどの修正など、ChatGPTの内容をそのまま使用することはできませんが、ある程度ブログの骨子を作ることはできると感じました。
採用情報
虎の穴ラボでは一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧ください。