2021年12月26日日曜日

早口音読とダジャレ音読を作った

早口音読ダジャレ音読 を作りました。 小学校でよく宿題になる音読ですが、 短文を少し読むだけのケースも多い気がしてます。 それだったら面白い音読をたくさんしてもいいのでは、と思いました。 という訳で、早口言葉とダジャレを音読練習しましょう。



使い道はわかりやすいですが、難点があるとすれば、 早口言葉は小〜1小2の子には漢字や言葉がすこし難しいことでしょうか。 小2ならギリギリいけそうかな…。小さな子はダジャレのほうが良さそうです。

ダジャレ成分が高いので、ひさびさに Zenn にもネタ記事を投稿してみました。 紹介する方法では非常にコンパクトなデータ構造を使い、総当たりに近い形で読みを探索することで、音声認識の表記揺れに対応します。 実装上の改善ポイントはいろいろあって、読み辞書の生成はもっときちんと解析すれば、さらにコンパクトにできそうです。

技術的な話 (長音符)

Zenn には書いてない技術的な補足記事も書いてみます。 総当たりで解析しても、それでも解析が難しいところもあります。 それは「あー」「ああ」「あぁ」の違いです。 無理そうなので除外したりしている例をいくつかリストアップすると以下。
土星が驚いた。ドシェー!,どせい が おどろいた。ドシェー!
エイがイェーイ,えい が イェーイ
栄養は体にえーよー,えいよう は からだ に えーよー
英和辞典はええわー,えいわ じてん は ええわー
エースでえーっすか?,エース で えーっすか?
あの歌の歌詞ははずかしー,あの うた の かし は はずかしー
キタねえやつが来たねえ,キタねえ やつ が きたねえ
キタねーやつが来たねー,キタねー やつ が きたねー
交代するなんてなんてこうったい,こうたい する なんて なんて こうったい
高知にいるからこうっちに来い
コート来ておこーっと,コート きて おこーっと
屋根はやーねー,やね は やーねー
Google の音声認識だと、良い候補がなかった時には「よくわからんから一番近い言葉に変えてしまおう」という感じで動きます。 「えーよー」は「えいよう」になります。「ー」は置換される傾向があります。 「おこーっと」は「おこうと」となります。「っ」は消滅する傾向があります。 「やーねー」のような綺麗な文章で存在しない言葉は「やね」に丸められます。 これらの変換に音声認識側でルールはないように見えます。 ちなみに 長音符 「ー」 に文法的ルールはあって、 現代語ではひらがなに長音符は使わないように教育されます。 音声認識にも一定量は反映されていると思います。

上記を踏まえると、ダジャレは丁寧な文法で作る必要があります。 「っ」と「ー」「ぁぃぅぇぉ」が出てきたら、認識チェックは必須です。 「は」と「わ」も注意が必要です。 「だぜー」「いたいよー」「だぜっ」と言った口語特有の表現は、Google の音声認識では、ほぼ長音符なしに変換されます。 なので文末の一文字だけ削除してチェックすると案外ちんと動くことがあります。 ただ「うめー」「だお」のように長音符ありに変換されやすいものもあります。 このへんの違いは何とも言えないんですが、日本語は語尾が小さくなるように話されるので、最後の一文字が長音符なら判定はゆるくて良いのかなと思ってます。

ちなみに「っ」と「ー」「ぁぃぅぇぉ」が同時に二つ出てきたら、まず認識できないと思ってます。 たとえば「イェーイ」ですが、これは人間でも文字起こしが厳しいですよね。 解析側で処理しようとしても「お」が「う」に変わったり、「え」が「い」に変わったして大変です。 他にもダジャレ特有の、微妙に音韻がズレているもの (ex: おっかしいなあ→おっかりーなあ) を一緒と判定する機能は作ってません。 今回は対象がオジサンではなく小さな子なので、綺麗な文法のダジャレだけに限定して良いと思ってます。 今回は実装していませんが、長音符に起因する表記揺れはもう少し対応できるようにしても良いかも知れません。

技術的な話 (連濁)

人間には簡単に認識できても、妙に音声認識率が悪い言葉もあります。 例えば「勉強好き」の「ず」のように濁音になるケースの処理が難しいです。 こういうのは「連濁」と呼ばれるらしいです。 ちなみに「べんきょうすき」と言わないと認識してくれません。 理由を考えると「づき」「ずき」のように、同じ発音にひらがなが複数あるため、発音が一緒の熟語が出てきてしまうからだと思います。 読み解析側ではサポートしてますが、音声認識側の精度によって読み方を指定しないと苦しいダジャレがいくつかあります。 STT はこういった細かい部分を全部チェックしないと不安が残る精度なので、バリエーションは増やしにくいです。

音声認識の課題

作ってみて一番気になったのは既存の音声認識の、非言語的フレーズへの弱さの問題です。 たとえば九九の音読も作ろうと試みたのですが、 Google の音声認識は文章的なものの認識率はすごい一方、それ以外の精度は低くてうまく認識しません。 その原因は、認識結果を見る限り、統計的に起きやすい文章と発音に無理やり解釈してまう (ように見える) からです。 現時点では細かな部分は聞き取りミスしやすいものをすべて登録するような荒業以外に解決策がないです。 九九などはそれでも対処できないくらい正解から外れたものばかりなので、頑張っても苦労が増えるだけです。 音声認識の精度がもっと上がるか、文章以外も認識できるモデルが出るまでは待ちですね。

形態素解析の課題

形態素解析辞書についても、普通の形態素解析では見つからない細かな問題が見つかり、なかなか面白かったです。 古語や口語の対応が難しかったり、日常的に使われる特殊な読み、日常的に省略されたり追加される語尾の存在など、色々と気付かされました。 mecab-ipadic-neologd でもそういった言葉は登録されてなかったので、改善はできなそうです。 UniDic は多少の登録がありますが、ほんの少しの改善が限度になりそうです。 あと長音符や連濁をうまく扱えるライブラリがあるといいですね。 先に正規化してから形態素解析すればスコアは結構上がるんじゃないかなとも思ったりします。

個人的には世の中の多くのタスクに N-Best な形態素解析は不要だと思っていて、 そんな気持ちを少し前にブログにも書きました。 その一つの答えになっている仕組みは実現できているんじゃないかと思います。 ちなみに最近流行の BERT でポンも解決策の一つですが、メモリや速度や資本に問題が生じやすいです。 最近流行のスケーリング上げればどうとでもなる世界線なら、なおさらです。 深層学習の構造上、現時点ではメモリや速度の最適化あたりはまだ人手がいる気がしています。 面倒だから基本やりたくないけど、アプリを作ってるとたまに必要になります。

0 件のコメント: