Whisperモデルは文字起こしエンジンとしておそらく世界最強ですが
実際の変換を見てみると、それでも誤変換が目につくことが有ります。
今回実測してみました。
によれば、
Whisperモデルの変換結果のJSONには
- no_speech_prob
- avg_logprob
- compression_ratio
の3種類の失敗に関連しそうな出力があります。
avg_logprob, number
Average logprob of the segment. If the value is lower than -1, consider the logprobs failed.
compression_ratio, number
Compression ratio of the segment. If the value is greater than 2.4, consider the compression failed.
no_speech_prob, number
Probability of no speech in the segment. If the value is higher than 1.0 and the avg_logprob is below -1, consider this segment silent.
no_speech_prob が無音らしさで、
avg_logprob が有音らしさ
compression_ratio が圧縮率(文字数 / セグメントの時間)
のようなのです。
リファレンスにはそれぞれ
no_speech_prob 1
avg_logprob -1
compression_ratio 2.4
というしきい値が書いてありますが、
その前提の上である程度はドロップされたJSON出力がでていると思うんですが、
これ自分でドロップしないといけない??
この閾値のあたいって、実際どんなもんなんってのが今回の課題です。
ちょっと2時間くらいの音声を変換して、
出力結果をヒストグラムにしました。
(1) no_speech_prob
概ね0.3くらいにおさまっています
ただ、0.2くらいでもデタラメに変換されていることもあり、
0.8程度でも正しく文字起こしされているケースも有りました。
0.20024192333221436 もちろん станов木曽明さんさんの思った。
0.20024192333221436 あの19ニW Systemであるくらい書いている。
0.20024192333221436 で、教育委託の 누나 Duke Inouyeさんの世界からの活動をお見せ
0.20024192333221436 いただか н Ramen lnio 分 meg助一郎様と出舌もizi
デタラメの一例。日本語音声なのに、英語ハングルキリル文字ごちゃまぜです。もちろん意味も通らない。
無音らしさ=元音源の音量と考えたほうが良さそうです。
今回変換した音声では0.15未満は流石にOKでした。
(2) avg_logprob
avg_logprobは、概ね−1〜0におさまっていました。
-2.5より小さくなるとデタラメでした。
-3.2664102903554135 それも術ism、
-3.2664102903554135 5籠と去� show では、
-3.2664102903554135 中造型樹脂繃脛 2020.03. sexual assault
雑音をむりやり変換してこうなってしまう場合があります。
術イズムってなんやねん。
(3) compression_ratio
こちらは仕様書の通り2.4より大きなセクションがほとんどありませんでした。
音声データの最後の、30秒単位に足りない端数だけ、圧縮率が5.3くらいになっていました。
結局誤変換をどう落とせばよいか、
- no_speech_probがpythonのデフォルト値0.6(あるいは実測値の0.15)よりおおきく、
かつavg_logprobが-1(あるいは実測値の-2.5)より大きい - compression_ratio が2.4より大きい
の条件でdropするのがまずは良さそうです。
Whisperの精度をチョイ足しであげたい場合にお試しください