😎

音声認識でダジャレを極める (ついでに3KB〜数百KBで精度100%の高速な読み方解析器を作った)

2021/12/26に公開

つよつよエンジニアと言えばダジャレ。つよつよになるためには日々ダジャレの練習が必要ですが、よわよわにはダジャレのキレを確認できる相手がいません。そこで音声認識の手を借り、ダジャレの採点をしてもらいながらダジャレを極める、ダジャレ音読 というアプリを作りました。
(本当は小さな子のためのネタアプリとして作りました。他に 早口言葉の音読 とかも作ったけど、今回は真面目にダジャレだけを話します。)

https://marmooo.github.io/dajare-ondoku/

音声認識の難しさ=表記揺れ

ダジャレを音読し「きちんとダジャレているか」を音声認識でチェックするのは、意外と大変です。最近の音声認識は漢字変換までやってくれるのですが、逆にそこが課題になります。例えば以下のような問題が発生します。

  1. 「布団が吹っ飛んだ」の気分で音声入力しても、AI は気まぐれなので「布団がふっとんだ」や「フトンがふっ飛んだ」のように、様々な認識結果を返す可能性があります。
  2. 純粋な表記揺れに加えて、早口で話すと区切りが曖昧になるため、変換結果にズレが生じやすくなりそうです。おかしな漢字変換もある程度は許容する必要があります。
  3. 今回は音声認識に Speech Recognition API を利用します。今のところ Chrome しか動かないのですが、他のブラウザが対応した時、認識結果が同じになるとは限らないので、ある程度の表記揺れに耐えられるようにしておく必要があります。
  4. 音声認識のバージョンが変わると、漢字とひらがなの変換具合が変わる可能性もあります。

以上を踏まえて、表記揺れするダジャレの読み方を見極める程度の技術が求められます。

コンパクトな読み方解析器を作った

真っ先に思いつく解決策は既存の形態素解析器による読み方解析でしょう。しかし読み方を調べて採点するだけなら、形態素解析のような大掛かりな仕組みは必要ありません。そこでコンパクトな読み方解析器を自作しました。自作した読み方解析器には以下のような利点があります。

  1. 問題文にマッチする可能性のある読みを事前に列挙しチェックするだけなので実装が簡単です。
  2. 読みデータは使うぶんだけをまとめておけば良いので、メンテが簡単です。
  3. 読みが一致すればいいので、生起コストや品詞情報などほとんどの情報は不要です。
  4. 読みは形態素のデータよりずっとコンパクトに保存できます。
  5. 読みは短いビーム幅で決定できるので、形態素解析器より解析速度も早いです。
  6. N-Best 問題として解く必要がないので、精度の問題と無縁です。

理屈的にはとてもわかりやすいですが、そのような解析器を見たことがなかったので、作りました。実装は雑ですが、テストはそれなりにしてます。動いているからヨシ?

既存手法との比較

巷の形態素解析器 (Mecab + IPADic) で読み方解析器を作ろうとすると、一般的には 20MB くらいの辞書が必要です。読み方解析に機能を絞り簡単な最適化を施せば 6MB にできます。これは作ったこともあります。さらに頑張ってデータ構造をこねくり回せば、たぶん 2MB にできます。でも頑張るのは嫌だし、どんなに頑張ってもサイズが大きいですよね。TinySegmenter (25KB, 分かち書き精度 95%) をベースに読み方を割り振るのは、一見センス良く見えますが、実際には精度不足でうまくいきませんでした。形態素解析に基づく方法も、当然ながら精度的な問題は残ります。今回作った読み方解析器は、対象となる文章が少なければ TinySegmenter よりコンパクトですし、多くても TinySegmenter と大差ないサイズで動作します。

まとめ

コンパクトな読み方解析器を作って、音声認識でダジャレを極めるアプリを作りました。ダジャレを極めてつよつよになろう。仕組みはコードを見てもらうとしても、コードではわかりにくい部分も結構あるので、そのへんの技術的な話は ブログにまとめておきました

https://marmooo.github.io/dajare-ondoku/

Discussion