Whisper + Python + Colaboratoryでmp4動画を文字起こしする方法と課題

知り合いの獣医師が実施した麻酔セミナーの録画を頂きました。

同世代の獣医師ではトップクラスに麻酔に精通した人物の有益な情報を自分に落とし込むために、音声を文字起こししようと考えています。

そこでずっと敬遠していたOpenAIのオープンソース文字起こしAI”Whisper”をPythonを使ってColaboratory上で動かし、動画から簡単な文字起こしをしてみたいと思います。

openAI/whisperのgithubリンクはこちらから

コードの概要

Colaboratoryにwhisperをpipインストールする

# whiperをpipインストールする
!pip install git+https://github.com/openai/whisper.git

変換前フォルダと変換後フォルダを作成する

osモジュールをインポートして

# osモジュールのインポート
import os

# 指定したフォルダが存在しない場合は作成する
checkContentFolder = os.path.exists("content")
checkDownLoadFolder = os.path.exists("download")
if not checkContentFolder:
  os.mkdir("content")
if not checkDownLoadFolder:
  os.mkdir("download")

whisperをインポートして初期設定する

#@title 文字起こし
import whisper
# ファイルネームの設定
fileName = "sample.m4a"#@param {type:"string"}
# 言語の設定
lang = "ja"#@param ["ja", "en"]
# モデルサイズの設定
model_size = "medium"#@param ["tiny", "base", "small", "medium", "large"]
model = whisper.load_model(model_size)
# オーディオファイル読み込み
audio = whisper.load_audio(f"/content/content/IMG_0949.mp4")
# テキストを挿入するリストを定義
outputTextsArr = []

オーディオを30秒ずつ区切って処理する

#オーディオのサイズが0になるまでループ
while audio.size > 0:
  # オーディオ部分を30秒ずつトリミングする
  tirmedAudio = whisper.pad_or_trim(audio)
  startIdx = tirmedAudio.size
  audio = audio[startIdx:]

  # log-Mel スペクトログラムを作成し、モデルと同じデバイスに移動する。
  mel = whisper.log_mel_spectrogram(tirmedAudio).to(model.device)
  # デコードする
  options = whisper.DecodingOptions(language=lang, without_timestamps=True)
  # 結果の変数定義
  result = whisper.decode(model, mel, options)
  # テキスト部分をリストに加える
  outputTextsArr.append(result.text)

リストになっているテキストをそれぞれつなげる

# リスト化されたテキストをつなげる
outputTexts = ' '.join(outputTextsArr)
print(outputTexts)

あとはテキストが代入された変数outputTextsからdownloadフォルダに.txtをつくるなりして完成です。

問題点・注意点

Google Colaboratoryへのアップロードが極めて遅い

じつはColaboratoryを使うのはほぼ初めてなのですが、ここで作成したディレクトリにファイルをアップロードすると、めちゃくちゃ時間がかかります。

Googleドライブのファイルを直接いじる方法なら行ける気もしますが、今回はネットに落ちてたコードをほぼそのままコピペしてるのでドライブから云々はやめておきました。

簡単にできそうならColaboratoryとドライブを連携させた動きをさせてみたいですが果たして…?

出力したテキストがとんでもなく見にくい

短い動画ならそれほど見にくいことは無いのかもしれませんが、長い動画・音声ファイルをそのまま文字起こしすると、めちゃくちゃ見にくいです。

話者が誰かも正直わかりません。

対策としては、自分が文字起こししたい場面を先に限定してからwhisperに投げるのがよいのかもしれません。

今後のこと

セミナー動画を文字起こししようと思うと、かなり長尺のテキストができあがりそうです。

しかし、それはかなり時間もかかりますし、テキストの羅列も酷く見にくいという問題があるように感じました。

自然言語処理や動画操作の技術と組み合わせればもっと見やすいものが出来上がるのかもしれませんが、僕の技術ではあまりに難しい気がします。

ゆくゆくはdockerやtkinterで簡単に起動できるものを作りたいかも。

コメント

タイトルとURLをコピーしました