🎤

WhisperとGoogle Colaboratoryで音声の文字起こしをやってみた

Kazuki Yonemoto2022/09/23に公開3件のコメント

AI 業界の進化が著しい昨今、AI の研究開発企業として名高い OpenAI から Whisper というとんでもない自動音声認識モデルの発表がありました。(2022/09/22)Whisper は 68 万時間かけてトレーニングされた自動音声認識モデルでなんとオープンソース化されています。
https://openai.com/blog/whisper/
https://github.com/openai/whisper

公開されているサンプルでは早口や K-POP、フランス語、アクセントのある会話などを問題なく処理できることが示されています。また日本語に関しても高い精度を保持していることがグラフから見て取れます。

Whisper
Whisper の GitHub リポジトリより引用

この記事で行うこと

この記事では Whisper を Google が提供する Colaboratory で利用し、文字起こしツールを作成していきたいと思います。
今回やりたいことは以下の 3 つになります。

  • 音声データから文字起こしができる
  • 文字起こしする言語が指定でき、自動翻訳が行える
  • 文字起こししたデータをテキストデータとして出力し、ダウンロードできる

この時点ですぐに試してみたいと思われてる方は実行環境を以下に作っているのでコピーして利用してみてください。

https://colab.research.google.com/gist/Kazuki-tam/04e85708e4fd1c4b8af180d317977f4d/whisper-mock-en.ipynb

Google Colaboratory の用意

まずは Google Colaboratory の環境を用意したいと思います。Google ドライブのメニューから「Google Colaboratory」を選択してください。
Google Drive

Colaboratory の編集 > ノートブックの設定を展開し、ハードウェアアクセラレータに GPU を選択します。
Colaboratoryメニュー

試しに以下のコードを実行してみてください。GPU のスペックが表示されれば OK です。

!nvidia-smi

パッケージのインストール

以下コードを実行し、このプロジェクトで必要なパッケージをインストールします。

# Install packages
!pip install git+https://github.com/openai/whisper.git

フォルダーの作成

音声ファイルをアップロードするフォルダーとダウンロード用のフォルダーを作成します。
手動で作成してもいいのですが、せっかくなのでコードベースでフォルダーを作成する処理を記載します。

import os

# Add folders
checkContentFolder = os.path.exists("content")
checkDownLoadFolder = os.path.exists("download")
if not checkContentFolder:
  os.mkdir("content")
if not checkDownLoadFolder:
  os.mkdir("download")

記載できればこちらの処理も実行しておきます。

音声ファイルのアップロード

「フォルダーの作成」まで処理を実行できていれば左ナビのフォルダーにcontentdownloadフォルダーが作成されているはずです。
フォルダーの作成

音声ファイルを用意し、contentフォルダーへアップロードしてください。ファイルはドラッグ&ドロップでもアップロードできます。

文字起こし処理

fileNameにアップロードしたファイル名を記載し、langには出力時の言語を指定してください。
ここではsample.m4aという音声ファイル名を指定し、言語をenに指定しています。この場合、日本語の音声ファイルを読み込ませると英語に翻訳されて出力されます。もうお分かりかと思いますが、日本語出力の場合はjaを指定します。

import whisper

fileName = "sample.m4a"
lang = "en"
model = whisper.load_model("base")

# Load audio
audio = whisper.load_audio(f"content/{fileName}")
audio = whisper.pad_or_trim(audio)

mel = whisper.log_mel_spectrogram(audio).to(model.device)

# Output the recognized text
options = whisper.DecodingOptions(language=lang, without_timestamps=True)
result = whisper.decode(model, mel, options)
print(result.text)

# Write into a text file
with open(f"download/{fileName}.txt", "w") as f:
  f.write(f"▼ Transcription of {fileName}\n")
  f.write(result.text)

準備ができれば試しに実行してみましょう。
文字起こしテキストが出力され、ダウンロードフォルダーにテキストファイルが作成されていれば OK です。

テキストファイルのダウンロード

最後に文字起こししたテキストファイルがダウンロードできる処理を記載してみましょう。
以下を実行すると Zip 形式でダウンロードされるはずです。

from google.colab import files
!zip -r download.zip download
files.download("download.zip")

以上でチュートリアルは完了です。もし途中で詰まったという方は以下を参考にしてみてください。
https://gist.github.com/Kazuki-tam/04e85708e4fd1c4b8af180d317977f4d

Tips

Google Colabratory では次のようにテキスト入力フォームやセレクトボックスなど UI 要素を表示できます。GUI で操作できるようになるので、非エンジニアの方にも使ってもらい易くなります。
Colaboratory

入力フォーム

#@param {type:"string"}で文字列型の入力値を受け付けます。

fileName = "sample.m4a"#@param {type:"string"}

セレクトボックス

#@param ["en", "ja"]で選択肢を表示できます。

lang = "en"#@param ["en", "ja"]

https://qiita.com/john-rocky/items/e5802cdd15dc2e34cb84

まとめ

2022 年は Stable Diffusion や Whisper の発表など AI 業界で凄まじい変化が起こってますね。
新しい情報についていくのは大変ですが、今後もできる限りキャッチアップしていきたいと思います。

TAM

お客さまと共に新しい価値を創る。パートナー型デジタル・エージェンシーTAMのテックブログです。 採用情報:https://wantedly.com/companies/tam/

Discussion

とても有益な投稿で助かりました!
すばらしい情報ありがとうございます!

さっそく使用してみて恐縮ですが、最後のファイルにした際のテキストを、
文字列ごとに改行することは可能なのでしょうか?
現状、全てつながっている状況です。

プログラミング無知なためご教授いただけると幸いです。

ありがとうございます!

早速試してみたいと思います。

ログインするとコメントできます