Pythonスキルの習得

​Python & Whisper: ローカルで音声文字起こし・翻訳方法を解説

​Python & Whisper: ローカルで音声文字起こし・翻訳方法を解説

こんにちは、Zero-Cheeseです。

  • 「音声データを文字起こししたいけど、オフラインやプロキシの制約で、APIが使えない・・」
  • 機密情報を扱っているので、外部のAPIは使えない・・」

こんな悩み、持っていませんか?

この記事を通して、

  • 音声認識ツールである、Whisperの特徴と認識精度
  • ローカル環境での、Whisperのセットアップ方法
  • Pythonからの利用方法(文字起こしと、英語翻訳)

を解説します。

Whisperとは? 特徴も併せて紹介

Whisperとは?

Whisperは、ChatGPTで有名なOpenAIが開発した、音声認識モデルです。

680,000時間という膨大な多言語・マルチタスクの教師データを用いて、トレーニングされています。

日本語を含む99言語において、高精度な音声認識が実現されています。

Whisperによる、音声認識の精度

Fleursデータセットを使用した際の、WER(Word Error Rate:単語誤り率)は、以下の通りです。(large-v2モデルの結果)

日本語はランキング6位で、WERが5.3%です。

つまり認識精度は95%となり、これは非常に高い水準です。

https://raw.githubusercontent.com/openai/whisper/main/language-breakdown.svg

認識精度の目安

  • 75%の認識精度:大部分の文章が理解できるレベルです。日常の会話やノイズの多い環境で、このレベルが求められます。
  • 85%の認識精度:議会の会議やビジネスミーティングの録音で、必要とされるレベル。
  • 95%の認識精度:アナウンサーやプロのナレーターが明瞭に発話するレベル。95%以上は、ほぼ完璧といえます。

WER(Word Error Rate:単語誤り率)の算出方法:

認識結果と正解テキストとの間で

  • 単語の挿入、削除、置換を考慮して

計算されます。

WER = ( 置換単語数 + 削除単語数 + 挿入単語数)/正解単語数

  • 置換 単語数: 単語のスペルミス数
  • 削除 単語数: 単語の欠落数
  • 挿入 単語数: 誤って認識された単語数

Whisper 各モデル別の特徴と、求められるVRAM量

Whisperには、複数のモデルが提供されています。

これらのモデルごとに、求められるGPUのメモリ量(VRAM量)が、異なってきます。

以下に、各モデルの詳細を記します。

モデル名パラメータ量英語専用
モデル名
多言語
モデル名
必要な
VRAM
相対速度
tiny39 Mtiny.entiny〜 1 GB〜 32x
base74 Mbase.enbase〜 1 GB〜 16x
small244 Msmall.ensmall〜 2 GB〜 6x
medium769 Mmedium.enmedium〜 5 GB〜 2x
large1550 M無しlarge〜 10 GB1x
large-v21550 M無しlarge-v2(〜 10 GB)?(1x)?
※ 多言語モデルは、日本語もサポートしています
※ 相対速度とは、「largeモデル」を基準の 1 とした際の、処理速度の相対指標です

※ large-v2モデルは、largeモデルに対し、2.5倍のエポック数で追加学習され、性能が向上(リンク先論文のP4参照

商用利用は、許可されているのか?

Whisperは、商用利用、改変、再配布、有料販売など、全て許可されています。

これはMITライセンスに基づいています。

ただし、使用の際には「著作権表示」と「MITライセンスの全文」の記載が必要です。

(MITライセンスの全文を直接記載する代わりに、MITライセンスへのリンクを掲載することも可能です。)

WhisperのMITライセンスは、こちら

その他の情報

Whisperをローカル環境で、使用する際の注意点

Whisperはディープラーニングを使用するため、高いマシンスペックが求められます。

CPUだけでも処理は可能ですが、GPUを利用することで処理速度が、大幅に向上します

参考として、RTX3090でのテスト結果と、Mac M2Max(ただしCPUを使用)の結果を表示します。

RTX3090での、テスト結果

条件:

  • モデルは、「large-v2」を使用
  • mp3ファイル(音声の長さは、2分)

結果:

  • 文字起こしに要した時間: 約 43 sec
  • VRAM使用量:約 11.5 GB

「large-v2」を使用する際、12GB以上のVRAMが推奨されます。

最近(2023年9月時点)は、GPUの価格も下がり、お買い得なものが増えてきています。

ディープラーニング用の自作PCを検討している方は、以下の記事で注意点やおすすめパーツを、紹介しています。

ディープラーニング 自作PC に必要なスペックと注意点、おすすめパーツのご紹介
ディープラーニング 自作PC に必要なスペックと注意点、おすすめパーツのご紹介ディープラーニング用の自作PCとして、必要なスペック、注意点、オススメのパーツを紹介した記事です。...

Mac M2MAX(38コア版)での、テスト結果

  • (RTX3090での検証と同じ条件で検証)
  • ただし、MacのGPUは標準でWhisperに対応していないため、CPUを使用

結果:

  • 文字起こしに、要した時間: 約 117 sec
  • cpu使用率:約 1150 % (1コアのフル使用を、100%として計算)
  • メモリ使用量:約8GB

バッテリーでの使用時、目に見えて、減っていくのが分かります・・

インストール方法

Whisperはpipを使用して、GitHubからインストールできます。

また、Whisperの動作にはffmpegも必要ですので、併せてインストールが必要です。

以下のコマンドで、Whisperをインストールします。

GitHubからインストールする場合、「git+」に続けて、URLを指定します。

pip install git+https://github.com/openai/whisper.git

ffmpegのインストール方法は、以下の通りです。

  • Windowsの場合 -> こちらからzipファイルをDL。解凍後、binフォルダのPATHを、システム環境変数に追加して下さい。(詳細は、「FFmpegのダウンロードとインストール手順」サイトで、解説されていました。)
  • Macの場合 -> brewでインストール可能です。(下記コード参照)
  • Linuxの場合 -> Ubuntu等の場合、aptからインストール可能です。(下記コード参照)
# Macに,ffmpegをインストールする場合
brew install ffmpeg

# Linuxに、ffmpegをインストールする場合
apt install ffmpeg

さらに、Pythonからffmpegを利用できるようにするために、次のパッケージもインストールします。

pip install ffmpeg-python

音声ファイルからの文字起こし方法

Whisperが対応しているファイル形式は、以下の通りです。

  • mp3, mp4, mpeg, mpga, m4a, wav, webm

mp4などの動画ファイル形式も、そのまま入力可能です。

基本的な使い方

下記の順番で、コードを記載します。

  • modelをロードする
  • 文字起こし

コード例:

import whisper

# modelのロード(large-v2を選択する場合)
model = whisper.load_model("large-v2")
# 文字起こし
result = model.transcribe("test.mp3")
# 結果表示
print(result['text'])

結果(例):

メルカリで購入した商品が届きました。迅速に対応をしていただき、ありがとうございました。思ったよりも大きいです。機構としては、水平に1軸、上下に1軸のモータが付いています。重量は570gと持ち運びは全然大変ではないです。

resultには、JSON形式のデータが、代入されます。

その中の「’text’」キーに、文字起こしした結果が、格納されています。

このJSONには、

  • 言語情報や、
  • 文字起こしした各単語のトークン情報

等も、格納されています。

transcribe( ) メソッドの引数について

上記コードの6行目、transcribe( )メソッドは、さまざまな引数を指定して、より高度な使い方ができます。

言語の指定

言語を指定すると、言語判定処理がスキップされ、処理が少し高速になります。

result = model.transcribe("test.mp3", language='ja')

途中処理のログ表示

verbose引数をTrueに指定すると、途中処理ログが、表示されます。

result = model.transcribe("test.mp3", verbose=True)

結果(例):

Detecting language using up to the first 30 seconds. Use --language to specify the language
Detected language: Japanese
[00:00.000 –> 00:03.120] メルカリで購入した商品が届きました。
[00:03.620 –> 00:07.360] 迅速に対応をしていただき、ありがとうございました。
[00:07.860 –> 00:09.660] 思ったよりも大きいです。
[00:10.220 –> 00:16.120] 機構としては、水平に1軸、上下に1軸のモータが付いています。
[00:16.620 –> 00:21.820] 重量は570gと持ち運びは全然大変ではないです。

文字起こし内容の翻訳

文字起こしした内容を、英語に翻訳する場合は、task引数を’translate’に指定します。

result = model.transcribe("test.mp3", task='translate')

結果(例):

I received the product purchased at Mercari. Thank you for responding quickly. It is bigger than I expected. As for the mechanism, it has a horizontal axis and a vertical axis motor at the top and bottom. The weight is 570g and it is not difficult to carry.

さいごに

今回のWhisperの使い方は、基本的な内容のみを、取り扱いました。

次回は、リアルタイム(ストリーミング)方式での、whisperの使用方法をご紹介します(完成次第、本記事にリンクを貼り付けます。)

最後まで読んで頂き、ありがとうございました。

また次回、お会いしましょう!