日本語音声認識に特化したWhisperである kotoba-whisper-v1.0を早速試してみた

2024.04.17

はじめに

昨日公開された日本語音声認識に特化した「Kotoba-Whisper」のkotoba-whisper-v1.0を試してみました。

本モデルは、OpenAIの「Whisper large-v3」を教師モデルとして使用し、蒸留(大規模な学習モデルから、同機能を持つより小さなモデルを開発する手法)を用いて開発されました。

kotoba-whisper-v1.0は、ReazonSpeechコーパスの一部である日本語音声と文字起こしのペアデータセットを使用して学習されたモデルです。学習データには、日本のテレビ番組の音声と、文字起こしたものが含まれています。具体的には、1,253時間の音声データと16,861,235文字の文字起こしデータが使用されています。

本モデルは、Pythonのライブラリであるtransformersに対応しており、短時間の音声ファイルの文字起こしから、長時間の音声ファイルをシーケンシャルまたはチャンク単位で処理することが可能です。また、プロンプトを用いて文字起こし結果を調整することもできます。

前提

  • 2024年4月17日時点での検証内容です。
  • 音声ファイルの用意
    • 「私の住所が住んでいる住所は、東京都港区西新橋1-1-1 日比谷フォートタワー26階です」と発話した音声。住所は弊社の住所です。
  • 利用PCと環境は以下の通りです。
    • M2 MacBook Pro(macOS 14.2.1)
      • Python 3.11.7

試してみた

ドキュメントに記載されているサンプル音声を利用して試してみます。

まずtransformersなどの必要なモジュールをインストールします。

% python3 --version
Python 3.11.7

%  pip3 install transformers accelerate datasets
~中略~
Installing collected packages: pytz, mpmath, xxhash, tzdata, sympy, safetensors, regex, pyarrow-hotfix, pyarrow, psutil, packaging, networkx, multidict, MarkupSafe, fsspec, frozenlist, filelock, dill, attrs, yarl, pandas, multiprocess, jinja2, huggingface-hub, aiosignal, torch, tokenizers, aiohttp, transformers, accelerate, datasets
Successfully installed MarkupSafe-2.1.5 accelerate-0.29.2 aiohttp-3.9.5 aiosignal-1.3.1 attrs-23.2.0 datasets-2.18.0 dill-0.3.8 filelock-3.13.4 frozenlist-1.4.1 fsspec-2024.2.0 huggingface-hub-0.22.2 jinja2-3.1.3 mpmath-1.3.0 multidict-6.0.5 multiprocess-0.70.16 networkx-3.3 packaging-24.0 pandas-2.2.2 psutil-5.9.8 pyarrow-15.0.2 pyarrow-hotfix-0.6 pytz-2024.1 regex-2024.4.16 safetensors-0.4.3 sympy-1.12 tokenizers-0.15.2 torch-2.2.2 transformers-4.39.3 tzdata-2024.1 xxhash-3.4.1 yarl-1.9.4

私の場合、以下のモジュールも必要だったため、追加でインストールしました。

$ pip3 install librosa soundfile

実行ファイルを作成します。

vim kotoba-whisper-v1-sample.py

コードは、ドキュメント通りです。

import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from datasets import load_dataset, Audio

# config
model_id = "kotoba-tech/kotoba-whisper-v1.0"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
device = "cuda:0" if torch.cuda.is_available() else "cpu"

# load model
model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True)
model.to(device)
processor = AutoProcessor.from_pretrained(model_id)
pipe = pipeline(
    "automatic-speech-recognition",
    model=model,
    tokenizer=processor.tokenizer,
    feature_extractor=processor.feature_extractor,
    max_new_tokens=128,
    torch_dtype=torch_dtype,
    device=device,
)

# load sample audio & downsample to 16kHz
dataset = load_dataset("japanese-asr/ja_asr.reazonspeech_test", split="test")
dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))
sample = dataset[0]["audio"]

# run inference
result = pipe(sample)
print(result["text"])

文字起こしを実行します。

% python3 kotoba-whisper-v1-sample.py

コマンドの出力結果(文字起こし結果)は以下の通りです。

ちょっと見ていきましょう。

20秒で文字起こしが完了しました。

自作の音声ファイル

PCに保存してある音声ファイルの文字起こしをしてみます。

実行ファイルを作成します。

vim kotoba-whisper-v1.py

ドキュメントに記載されている通り、PCに保存してある音声ファイルを文字起こしする場合、音声ファイルのパスを渡すだけです。

ドキュメントではサンプリングレートを16kHzに設定するよう指示がありますが、私は8000Hzのサンプリングレートで文字起こしを試みました。

To transcribe a local audio file, simply pass the path to your audio file when you call the pipeline (make sure the audio is sampled in 16kHz):

import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline

# config
model_id = "kotoba-tech/kotoba-whisper-v1.0"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
device = "cuda:0" if torch.cuda.is_available() else "cpu"

# load model
model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True)
model.to(device)
processor = AutoProcessor.from_pretrained(model_id)

pipe = pipeline(
    "automatic-speech-recognition",
    model=model,
    tokenizer=processor.tokenizer,
    feature_extractor=processor.feature_extractor,
    max_new_tokens=128,
    torch_dtype=torch_dtype,
    device=device,
)

audio_file = "音声ファイルパスとファイル名"

result = pipe(audio_file)
print(result["text"])

audio_fileは、音声ファイルのパスとファイル名を記載ください

それでは文字起こしを実行します。

% python3 kotoba-whisper-v1.py

再掲ですが、音声ファイルは、「私の住所が住んでいる住所は、東京都港区西新橋1-1-1 日比谷フォートタワー26階です」と発話した音声です。

コマンドの出力結果(文字起こし結果)は以下の通りです。

私が住んでいる住所は東京都港区西新橋1-1-1-1の1、日比谷フォートタワー26階です

11秒の音声ファイル(180KB)は、17秒で文字起こしが完了しました。

文字起こしされた内容は、「いちのいちのいち」という音声が「1-1-1-1の1」と誤認識されていた箇所を除き、特に違和感なく文字起こしされており精度が高いと感じます。固有名詞の「日比谷フォートタワー」も正しく認識されています。

ちなみに、今回の音声ファイルは、サンプルレート8000Hzでしたが、ドキュメント推奨の16kHzに変換しても文字起こし速度や精度は変わりませんでした。

最後に

今回は、日本語音声認識に特化したWhisperである kotoba-whisper-v1.0を試してみました。

この精度で無償公開なのはすごいですね。