音声認識モデルwhisperの全モデル文字起こし比較

OpenAIの音声認識モデルWhiper、いやー、まじですごすぎて感動しました。

配信中のpodcast番組 白金鉱業.FMを頑張って文字起こしするために、この記事とか、この記事とかでかなり真面目に既存文字起こしAPIの精度などを比較していましたが、もう今回は比べるまでもなく本当に雲泥の差です。ほぼ一言一句正確に文字起こしできます。GCP, AWS, Azureの文字起こしAPIは文字起こし精度が体感30~60%くらいでしたが、whisperは90%超えている印象です。もう笑うしかないです。

最初に結論

whisperは異なるモデルサイズが5種が利用可能であり、文字起こし精度と処理時間の両方を考慮するとどれ使うのがベストかということについては、文字起こしの目的に寄るかなという感じです。

【ニーズ1】 ざっとどんな話してるのかの概要さえつかめれば良い、見た目の綺麗さとか問わない。細かい文字起こしミスも気にしない。なんらかの事情で早く文字起こし結果が欲しい → デフォルトの small モデルを使えば良さそう

【ニーズ2】 数時間単位で時間かかっても良い、句読点等も含めできるだけ見た目もキレイに文字起こしして欲しい → large モデルを使いましょう

他のモデルは品質と処理時間がどっちつかずなので選択肢に入らない印象です。small or largeの2択ですね。

それぞれ、正確にどれくらいのクオリティーがあるのかを知りたいかたは続きをお読みください。

インストール

基本的にはpip一発で入ります

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

実行方法

実行もとても簡単。

whisper コマンドが使えるようになっているので、python以外にコマンドラインでも試せます。ファイル形式はm4aなども可です。

whisper hoge.mp3 --language Japanese --model base

特に languageを指定しなくても自動で言語が識別されるのもすごいところ。

利用できる学習済みmodelサイズは tiny, base, small, medium, largeの順に5種類があり、largeに近いほどダウンロードされるファイルを大きく、認識にかかる時間は長く、認識精度は良くなります。

特にモデルを指定しない場合はデフォルトでは small モデルが使用されます。

コマンドラインでの結果は以下のような見やすい形式で表示されます。

[00:00.000 --> 00:04.260] では今回のお題は最近話題の
[00:04.260 --> 00:06.500] ステーブルディフィュージョンに並んでというか
[00:06.500 --> 00:09.000] 続きてというかで話題の
[00:09.000 --> 00:13.500] ビスパーさんのお話の技術解析を同じく
[00:13.500 --> 00:16.000] 広化先生からお願いしたいと思います
[00:16.000 --> 00:17.800] よろしくお願いします
[00:17.800 --> 00:18.100] そうですね
[00:18.100 --> 00:20.160] ちょうどステーブルディフィージョンとが
[00:20.160 --> 00:24.560] 早ったその週とか次の週とかに

ちなみに、 --task translate オプションを付けると文字起こしした日本語をそのまま英訳変換もしてくれます。便利。

pythonインターフェースでは以下のように3行書くだけ。簡単過ぎる。ここまで来るとAWSなどの文字起こしクラウドAPIを使うよりも逆に簡単なんですよね。(API認証とか、指定のファイルをクラウドにアップロードするところが手間と思えてくるため)

import whisper
model = whisper.load_model("base")
result = model.transcribe('hoge.mp3', verbose=True, language='ja')

返してくれる結果 result には、dict形式で textsegments という情報が格納されており、text は認識されたテキスト全文、segments は何分から何分まで何を話したかという詳細情報が入っています。 発話位置まで正確に知りたいなら segments の情報を使い、とにかくテキスト全文が欲しいだけという場合は text だけ取ってくれば良いです。

結果

5つのモデルの出力結果を比べながら、文字起こし品質の差分はどういったところに現れるか、驚いたところを紹介していきます。

ちなみに、whisperはいまのところ話者分離(AさんとBさんのどっちが何を喋ったか)は行えないので、話者の区別なく音声内容をひたすら文字起こしするということをしています。

今回は白金fmの第60回、まさに今回の主題であるwhisperの論文について解説した回を対象に文字起こししました。podcast用に音声は編集してけっこう綺麗にしているつもりです。これだけクリアにして下駄を履かせているのだから流石に頑張ってほしいという期待を込めて。

open.spotify.com

音源自体の長さは31m5s。ちょうどmtg一回分の長さといったところです。

先に処理時間についてまとめた結果が以下。M1MacローカルのCPUで計算しています。マシンスペックによって処理時間は変わりますが、モデル間の相対関係は変わらないはずなので参考値として。

(CPUでの)処理時間だけでみると、smallモデルまではインプットする音源長よりも短い時間で文字起こし処理が完了するようです。一方、mediumとlargeはそれぞれ2倍、5倍の時間を要します。かけた時間に比例してどれだけ文字起こし品質が向上するかが見どころです。

では肝心の文字起こし品質について各モデルごとの結果です。

tinyモデルの結果

31minの音源に対して3minという爆速で処理が終わっています。(ちなみに、GCPAWSの文字起こしAPIも同じくらいの処理時間でした)

実際の文字起こし結果はこちら。

https://raw.githubusercontent.com/shirokane-kougyou/shirokane-kougyou.github.io/master/materials/060_whisper_tidy.txt

一瞬、「イケるか?」という気持ちになりますが、ちょっと読み進めると全然意味がわかりませんね。体感としては半分も合ってないような気がします。

また、論文内でも課題として指摘されていた意味のない繰り返しが出現したりする箇所も見つかります

よく音声系の人たちが画像出してるあの納み歌、模様模様模様みたいな画像を見せて

(ちなみにこれでもAWSGCPの文字起こしAPIよりも全然良い結果だとは感じます)

baseモデルの結果

tinyに続き7minという爆速で処理完了させるbaseモデルです。

文字起こし結果は以下。

https://raw.githubusercontent.com/shirokane-kougyou/shirokane-kougyou.github.io/master/materials/060_whisper_base.txt

結果としては、tinyモデルとどんぐりの背比べという感じです。tinyよりも正確に単語認識できる箇所もあれば、逆にtinyで合っていたのにbaseで間違うという単語も散見されます。

音源にない語が挿入されたり繰り返されたりする加減はtinyよりも悪いような気すらします。

カンマーのウムだったり全て面白い面白い面白い面白い面白い面白い面白い面白い面白い面白い面白い面白い面白い面白い面白い面白い面白い面白い面白い個別の笑顔 笑顔手キストその feelings cons靈魂騎郷審柱カンetes本申し抜けてその個人個人階打電気エ practiced特定敵批判ietまたハマ樋木岩馬五花近小浟vi configurations越が同いってこれによって

普通にtinyとbaseは品質が悪すぎて日本語文字起こしでは使えんなぁという印象ですが、敢えて使いみちを考えるのであれば、例えば音源が膨大にあって、「雰囲気だけでもいいからこれらの膨大な音源から名詞wordcloudをサクッと作ってくれ〜」というときは使えるかもしれません。(そもそもwordcloudは何か有益なものを見ている気持ちになるだけの情報量ほぼ無の可視化なので合ってようが間違ってようが比較的どうでもいいやつなので)

smallモデルの結果

インプット音源のだいたい半分くらいの時間で処理を終わらせてくれたsmallモデルです。whisperのデフォルトではsmallモデルが使われているので、見せてくれよデフォルトのチカラってやつを!

文字起こし結果は以下。

https://raw.githubusercontent.com/shirokane-kougyou/shirokane-kougyou.github.io/master/materials/060_whisper_small.txt

これはいい感じです!頭から読んでいっても意味わかるなーという気がしてきます。句読点が無いので読みにくいのは間違いないですが、なんの話をしているかは大分わかってくるのではないでしょうか。さすがデフォルトモデルいいぞデフォルトモデル。

ここは間違ってるだろうなと感じるところもかなりまだありますが人間が脳内補正可能な範囲かなと。この品質がインプット音源のだいたい半分くらいの時間でサッと自動で出てくるのなら使い方にも寄りますが御の字ではないでしょうか。

そしてtinyやbaseで見られた意味不明の繰り返しなども見つかりません。

処理時間と文字起こし品質の両方を考えたときに、このモデルをwhisperのデフォルトに指定されているのもとても納得感があります。

mediumモデルの結果

いやー、これまでの文字起こしAPIたちと比較してもうsmallモデル見せてもらっただけで胸がいっぱいですよ…という気持ちを持ちつつ、まだ見てみたいその先を。

mediumからは音源時間よりも長く処理時間を食うので完全に精度を追い求める旅です。smallとの差分としてどこが変わってくるのか。

文字起こし結果は以下。

https://raw.githubusercontent.com/shirokane-kougyou/shirokane-kougyou.github.io/master/materials/060_whisper_medium.txt

いやー、もうここからは日本語文字起こしの新世界です。発音した音は全部文字起こしされているレベルです。マジか。感動です。

句読点がないので読みにくさは残りますが、個々の単語認識精度が着実に上がっている印象です。

small, medium
ステーブルディフュージョン → stable diffusion
オープンAI → Open AI
シークエンス2シークエンス → Sequence to Sequence

カタカナ英語発音を英語と認識してくれるようになっています。スゴイ。

もうlargeの結果を見るのが怖くなってきました、まだ上があるの?

largeモデルの結果

もう笑ってしまう結果です。綺麗すぎて嘘でしょ?って思ったのでlargeモデルの結果は音声と聴き比べながら一言一句確認してみました。

赤マークがwhisperの間違い箇所です。もう間違いを探すほうが難しいレベルです。体感的には95%以上合ってるのでは?という感じです。これがAIってやつか。

docs.google.com

largeモデルからはなんと句読点も付与されます。おかげで圧倒的に読みやすくなりました。これを見ちゃうと5倍時間がかかったとしてもlargeで文字起こしして欲しいとなりそうです。そしてこの処理時間はもちろんGPUを使うともっと短くなるはずです。

以下はちゃんと認識されててびっくりした文字列たち

Stable Diffusion
Whisper
OpenAI
Automatic Speech Recognition
BigSSL
Sequence to Sequence

BigSSL, OpenAIなどは固有名詞認識されるようになりました。そして "Whisper"も英語表記になりました。

また、日本語会話で無意識に口走る「ええっと」「まぁ」「あのー」「へー」「あっ」「うん」などを見事なまでに”よしなに”消しています。かつ、過剰に消しすぎている印象もない。そのおかげもあり文字起こしテキストが極めて自然に”読める”ようになっています。
改めて細かく見比べてみると、smallモデルにはまだそのままこれらの語が文字起こしされており、mediumで減り、largeでほぼ完全によしなに消えているという印象です。

「じかんかけるしゅうはすう」の発音を「時間×周波数」に文字起こししているのも賢すぎます。 句読点を打つ位置も自然すぎる。ちょっと区切りながら「this, is, a...」と話したところも正確に句読点打ってくるので笑ってしまいました。人間より正しく句読点打ててそう。

ここまでくるとスーパーヒューマンレベル(人間超え)という宣伝文句も納得ですね。ふつうにこの結果を「頑張って全文文字起こししましたー」と人間に渡されても気づかないんじゃないですかね。

話者分離はいまのところできないようですが、最近だとzoomなどでも話者個々の音声ファイルを別々に保存できるので、別々に音声認識かけて、会話自体は後からガッチャンコして復元すれば良さそうです。そのように話者分離自体はモデル外で工夫の余地があるので、むしろ句読点等を高精度に付与可能になったのが嬉しいですね

まとめ

日本語音源の文字起こしはwhisper 一択、とりあえず脳死でこれを使っておけという時代がやってきました。

最初に【ニーズ1】の人はsmallモデル、【ニーズ2】の人はlargeモデルを使おうと書きましたが、largeの品質が圧倒的に高いのでコスパ度返しで何でもかんでもlargeで文字起こししたいという気持ちになりますねわかります。

パッと思いつく利活用として、社内の議事録などこれで文字起こしすれば?というのがありますが、今回のlargeの文字起こし結果と実際の音源を聞いてもらうととわかる通り、今回の話者のように淀みなく論理的に話を進めている印象の会話ででも、それでも書き言葉としては読みにくく、口語と書き言葉にはかなり差があることが改めてわかります。whisperは聞こえている音を片っ端から文字起こしし、要約的なことは一切しないので当たり前といえば当たり前ですが。

podcast大好き人間として、高品質な日本語音声文字起こしをかなりの低コストで実現する技術ができたことで、podcastの全文文字化・全文検索・類似番組の検索 などが技術的かつ実用的に可能になりました。検索が可能になったことで番組内容に合致する音声広告なども検討しやすくなると思うので、更にpodcastの市場性は広がるのではないでしょうか。そちらの方向も楽しみです。

高精度文字起こし・発話位置・句読点付与がwhisperによってほぼ解決したのだとしたら、あと残りの日本語音声認識に対する技術ニーズってなんですかね(詳しくない)。ぱっと思いつくのは、

  • ノイズが多い音源での認識
  • 話者分離
  • リアルタイム文字起こし
  • 感情推定(日本語はangry以外の推定がまだまだ弱いらしい)
  • 好みの声の推定系(可愛い声、イケボ的な)

とかでしょうか?アツいですね。

追記

こういう高精度なモデルがでるとエンジニアは意地悪したくなるもの…

この記事を公開後に、社内から寄せられた「おれもこういう実験やってみた」という面白事例が届いたので紹介です

カタカナ英語 完全制覇 whisperくん

実験者が作成した低クオリティーな英作文をカタカナ英語(俗に言うJapanese English)で朗読してwhisperで文字起こし。

languageを非明示にすると日本語と判定され上手く文字起こしできなかったが、language="en" にするとなんと原稿との一致率は驚異の100%

おそらく、英語データセットにはいろんな国の人が話す"綺麗ではない英語"もたくさん含まれており、それを学習しているから堅牢性が高いのではと想像します。カタカナ英語なんてAIからするとただのノイズであって「本質情報を学習しているワイには簡単に識別できまっせ」という感じなんでしょう。

せんでんせんでん

機械学習/AI、データサイエンスビジネスについて話すニッチなpodcast番組「白金鉱業.FM」をやっています。フォローよろしくおねがいします。

twitter.com