音声認識モデルWhisperを投機的デコーディングで高速化する

こんにちは、イノベーションセンターの加藤です。この記事では、Transformerベースの言語モデルで利用可能な高速化技術である投機的デコーディング(speculative decoding)を用いて、音声認識モデルのWhisperの高速化を検証したのでその結果を紹介します。

投機的デコーディングとは

大規模言語モデル(LLM)をはじめとするTransformerベースの言語モデルは、これまでの単語列から次に現れそうな単語を予測することを繰り返して文章生成を行なっています。 これに対し、元のモデルよりも軽量な言語モデルの出力を下書きとして利用することで、元のモデルの出力を完全に再現しながら文章生成を高速化する投機的デコーディング(speculative decoding)と呼ばれる手法があります。これは下図のように、軽量なモデルで数単語先まで予測してから元の大きなモデルでその予測を検証することで、元の大きなモデルの推論回数を節約しながら文章を生成する手法です。ちょうど人間が予測変換を活用しながら文章を入力するのと似た流れになっているのがわかると思います。

投機的デコーディングの詳細は過去の記事を参照してください。

下書きとして利用される言語モデルはLLMのようなTransformerベースである必要はなく、これまでの単語列から次に現れそうな単語をなんらかの形で予測できれば十分です。 投機的デコーディングでよく使われる下書きモデルは元モデルの蒸留モデルであったり、同じアーキテクチャでパラメータ数の少ないLLMであったりしますが、要約タスクやRetrieval Augmented Generation (RAG)などプロンプトから文言を抜き出すことの多いユースケースでは、プロンプトから収集したN-gramを参照して次に現れそうな単語を予測するPrompt Lookupが活用されることもあります。今回の実験ではこのPrompt Lookupの実装を少し変更して採用しています。

Whisperとは

WhisperはTransformerベースの音声認識モデルであり、音声から特徴を抽出するEncoderと、対応するテキストを出力するDecoderからなります。 このDecoderでは文章生成タスク用の言語モデルと似た動作をしており、音声の特徴とこれまで出力したテキストから次に現れそうな単語を予測することを繰り返しています。そのため、投機的デコーディングをWhisperのDecoder部分にも適用できます。また、一般的な文章生成タスクと異なり出力文章の正解が大体決まっているため、下書きを作成する際に元モデルの途中までの出力を参照しなくても十分な正確性が期待できます。

そこで、性能が高いがモデルサイズの大きいWhisperモデルに対してまず軽量な音声認識モデルで文章を出力し、これを下書きとして参照することで、精度を維持したまま高速化する手法を実装してみました。推論の流れを下図に示します。

各時点での書き起こしの続きを下書きから抜き出す際はPrompt Lookupと同様の手法を使い、下書きのN-gramから一致度の高いものを選択しています。例えば上図の例ではThe man workedの時点で元モデルの予測が下書きから乖離していますが、下書きからaに続く文字列であるsecurity guard.を抜き出し、先読みに再度成功しています。

実験

今回は元モデルとしてwhisper-large-v3を使い、軽量モデルとしてwhisper-tinyを使いました。評価データセットは英語音声のLibriSpeech ASRコーパスと日本語音声のCommon Voice 17.0 日本語サブセットの2つを用意しました。音声認識の精度は認識に失敗した単語数と関連が深いWord Error Rate (WER)を用いて評価し、その際日本語データに対してはMeCabで単語分割を行なっています。 処理速度はReal Time Factor (RTF)で算出します。これは1秒のデータを処理するのにかかった秒数を表し、小さいほど良い結果であることを示しています。

結果は以下の表のようになりました。

英語音声 (LibriSpeech) の結果

モデル WER RTF
tiny (参考) 0.089 0.013
large-v3 0.032 0.085
large-v3 + tiny下書き 0.032 0.072

参考としてtinyモデル単体で音声認識した結果も示していますが、large-v3よりも6.5倍速い代わりにWERが悪化していることがわかります。 また、speculative decodingは元モデルの出力を完璧に再現するため、large-v3単体で動かした時と先読みをつけた時どちらもWERが0.032となっています。 そして先読みをつけた場合は実行速度が18%向上しました。参考として各モデルの書き起こし例を以下に示しますが、large-v3とtinyの出力の一致率が高く、うまく先読みを当てられていることがわかります。

Ground Truth (原稿) large-v3 tiny
HURSTWOOD WALKED THE FLOOR MENTALLY ARRANGING THE CHIEF POINTS OF HIS SITUATION Hurstwood walked the floor, mentally arranging the chief points of his situation. First would walk to the floor mentally arranging the chief points of his situation.
HE ALSO THOUGHT OF HIS MANAGERIAL POSITION He also thought of his managerial position. He also thought of his managerial position.
FORTUNATELY THERE WAS NOTHING FROM HIS WIFE EITHER Fortunately, there was nothing from his wife, either. Fortunately, there was nothing from his wife either.
HE AROSE FROM HIS CHAIR AND WENT AND LOOKED OUT INTO THE STREET He arose from his chair and went and looked out into the street. He rose from his chair and went and looked out into the street.
HURSTWOOD ALMOST EXCLAIMED OUT LOUD AT THE INSISTENCY OF THIS THING Hurstwood almost exclaimed out loud at the insistency of this thing. Herstwood almost explained out loud at the insistence of this thing.

日本語音声 (Common Voice 17.0 日本語サブセット) の結果

モデル WER RTF
tiny (参考) 0.844 0.017
large-v3 0.143 0.108
large-v3 + tiny下書き 0.143 0.120

一方で日本語音声では実行速度が改善せず、元のlarge-v3単体で動かした方が速いという結果になりました。そもそも全体的にWERが高く音声認識に苦戦していることもあり、品質の高い先読みを提供できていないようです。 各モデルの書き起こし例を以下に示します。

Ground Truth (原稿) large-v3 tiny
セリヌンティウスは、縄打たれた。メロスは、すぐに出発した。初夏、満天の星である。 セリノンティウスは縄打たれた ネラスはすぐに出発した 初夏満天の星である セリナンティーズは奪われたネラズはすぐにしようっぱいずした、そこは満転の押すである。
僕らは何かを求めてゴミの山を漁っていた 僕らは何かを求めてゴミの山を漁っていた。 僕らは何かを求めて説明をさっていた
ブラシを板の上に置くや否や、 ブラシを板の上に置くや否や では、教えておいては、お家に行きたいな。
私はポピュラー音楽を聞きたい。 私はポピュレア音楽を聴きたい 私はポフリアーを仲置きたい
大事なものじゃないの?と君はきいた 大事なものじゃないの?と君は聞いた 大事なものじゃないの?と、君が聞いた

まとめ

本稿ではLLMの文章生成に使われている高速化手法のspeculative decodingを音声認識モデルに適用するとどれくらい高速化できるのか検証しました。 結果、一部の条件下では速くなることがわかりましたが万能ではなく、認識精度が確保できないケースでは先読みの恩恵が受けられないようでした。 また、Whisperはturboモデルというlargeモデルの軽量化版を提供しており、こちらはlargeとほぼ同じ性能で8倍の高速化をうたっています。このように学習時に工夫を入れ込んだ方がより高速な推論を期待でき、リソースが十分にある場合は学習部分の改善も視野に入れた方が良さそうです。