kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

GPUがなくても高速に音声認識ができるwhisper.cppを試してみる

ちょっと前に、かんたんに高精度な音声認識ができるWhisperが話題でしたが、そもそもそんな高性能GPUうちにはなく、盛大に出遅れていたのですが、

GPU不要・CPUでも「高速」に動作するWhisper CPPがあるということで、手元の環境で試してみました。

目次

参考

以下の記事を参考、というかもうほぼ「写経」させていただいただけです。ありがとうございます。

環境

そろそろ買い替えてもなーと思いつつ、普段全然困ってないので買い換えるモチベーションもフトコロもあまりないです。購入時に奮発してほぼフルスペにしたので、今の感じからするとあと2年ぐらいは使えそうだなと思ってます。

  • MacBookPro (15-inch, 2016)
    • CPU: 2.9GHz クアッドコア Intel Core i7
    • メモリ: 16GB
    • グラフィック: Radeon Pro 460 4GB / Intel HD Graphics 530 1536MB
  • OS: macOS Monterey 12.5.1

音声データについて

手頃な音声データがなかったので、とある競馬関連の有料オンラインサロンのトークを収録したものを使いました。

  • 収録時間:1時間20分ほど。
  • ファイルサイズ:約150MB

競馬関連のトークなので、以下のような普段の会話では見ることがない専門用語がちらほら出てきます。

  • 「外枠差し短縮」
  • 「ラチ沿い追走」
  • 「テンの速度」
  • 競走馬名やレース名など

提供されているモデルではこういった用語は学習されていないと思うので、このあたりの誤認識は多くなるだろうという前提で、それ以外の部分の認識を中心に見てみたいと思います。

なお、コンテンツの性質上、解析結果については公開できませんので、ベンチマーク的なものだと思ってください。

手順

クローン

$ git clone https://github.com/ggerganov/whisper.cpp.git
$ cd whisper.cpp

モデルのダウンロード。smallとmediumで試してみます。

$ ./models/download-ggml-model.sh small
$ ./models/download-ggml-model.sh medium

ビルドします。

$ make

オーディオファイルを用意します。Whisper CPPは16KHz WAVファイルしか対応していないので、ffmpegで変換しておきます。my_audio.m4aが今回用意したファイルです。

$ ffmpeg -i my_audio.m4a -ar 16000 -ac 1 -c:a pcm_s16le output.wav

ではWhisper CPPを実行してみます。まずsmallから。

$ ./main -m models/ggml-small.bin -f output.wav -l ja -ovtt

結果

whisper_print_timings:     load time =  1059.17 ms
whisper_print_timings:      mel time = 23004.19 ms
whisper_print_timings:   sample time =  8447.41 ms
whisper_print_timings:   encode time = 1025895.56 ms / 85491.30 ms per layer
whisper_print_timings:   decode time = 802581.25 ms / 66881.77 ms per layer
whisper_print_timings:    total time = 1861537.75 ms

約31分。

次はmedium

$ ./main -m models/ggml-medium.bin -f output.wav -l ja -ovtt

結果

whisper_print_timings:     load time =  3234.83 ms
whisper_print_timings:      mel time = 22352.50 ms
whisper_print_timings:   sample time =  7559.98 ms
whisper_print_timings:   encode time = 3228790.75 ms / 134532.95 ms per layer
whisper_print_timings:   decode time = 2037723.75 ms / 84905.16 ms per layer
whisper_print_timings:    total time = 5300608.00 ms

約1時間30分。

解析結果の所感としてはこんな感じでした。

  • small
    • 専門用語は読みづらいレベルで誤認識する。
    • それ以外の部分はある程度自然に読めるが、そこそこ誤認識もある
  • medium
    • 専門用語は誤認識するも読み替えれば読めるし、部分部分で正しく認識されている場合もある
    • それ以外の部分はsmallでちょろちょろあった誤認識が減っていてとても読みやすい
    • 逆に、数は多くないものの、smallで認識されていたものが、mediumで誤認識になったり

まとめ

今となっては非力なマシンですが、Whisper CPPなら十分速いですね。ちなみに本家WhisperをCPU使ってsmall試してみたのですが、いつ終わるんだろう、というぐらいに時間がかかり(途中で諦めた)、途中の出力もWhisper CPPに比べると精度低い、というように感じました。(それでも十分すぎる感はあります)

また、今回のコンテンツでは、ちょっと専門的な用語がちらほら出てくるので当然誤認識はあるだろうなとは思っていたのですが、mediumなら文字起こしのベースとしてもかなり良い印象です。普通の会話ならsmallで、時間とトレードオフしてでも精度を求めたいならmediumで、という感じです。

幅広い環境で使えそうなので、いろいろなユースケースで活用できそうですね。

ただ、やっぱり高速なCPU/GPUなマシンが欲しくなったのは内緒です