ラズパイをサーバとして運用してから約3年、電子工作・IoTを始めてみようと思い立ってから約2年。
そんな中、以前、ラズパイでのIoT第1弾としてJulius、Open JTalkベースのスマートスピーカーを、ESP8266/ESP32による自作スマートリモコン、自作スマートコンセントを作り、これらの連携もとり、結果的にスマートホーム化を進めています。
また、サブマシンデスクトップPC Pavilionの周辺機器+ラズパイでパソコン、壊れた先代メインマシンでRaspberry Pi 3 Model B+とノートPC液晶他でパソコン化してみたりもしています。
IoTデバイスとしては、ArduinoやESP8266/ESP32でできることも多く、コスト含め、ラズパイでなくては!と思えるような第2弾は、なかなか思いつきそうもありませんが、ラズパイスマートスピーカーなどのIoTデバイスを中心にラズパイ関連でデバイスや機能追加以外の何かがあれば、ここに書いていこうと思います。
我が家には、ラズパイスマートスピーカーと、この自作スマートスピーカー機能をパソコン/Debian(Linux)にも入れて運用中で、PC版で検証後、ラズパイ版に反映させており、いわば同期を取っています。
が、ESP-01/12/ESP32でSHARP AQUOS TVをWiFi操作する機能を実装、自作ラズパイスマートスピーカーでテレビを音声操作できるようにしたところ、ラズパイ版スマートスピーカーでもパソコン版スマートスピーカーでも急にJuliusの認識精度が見る影もなくガタ落ちしてしまった...。
なぜか、ラズパイ版が先にこの症状に見舞われ、1日遅れ程度でパソコン版スマートスピーカーも同様となりました。
何れも少なくとも機能追加した直後は、何の問題もなく、音声認識できていたため、辞書追加に起因しているようだということに、気づくのが遅れました。
Juliusでは、dictation-kit 4.4を使っており、-moduleモードを外し、入力モード?として確認、明らかに認識精度が落ちていることに気づき、オリジナル辞書からテレビ操作関連を除いた(バックアップから元に戻した)ところ、何れのスマートスピーカーでも以前のように正常に認識、機能するようになりました。
このテレビ操作用に追加した辞書は、パソコン版からscpコピーしたものを使ったのでパソコン版とラズパイ版は同じもの。
「テレビつけて」「テレビ消して」は以前から登録済みなのでさておきます。
茶色の太字部分が、テレビ操作用に追加したもので、これらを削除し、元に戻したら、ラズパイスマートスピーカーでも、あっさり、音声認識できました。
これは、ファイルエンコーディングがutf8ですが、もちろん、Julius dictation-kit-v4.4用辞書として反映させるには、eucjpに変換する必要があります。
テレビ関連の操作ワードしか考えなかったけど、他の家電と被るワードは、「テレビの」など枕詞を付けないと区別できなくなるので注意。
ちなみに気づけば、[今日]の読み[ky o]に長音記号[:]や[u]を付け忘れていますが、なぜか、影響なく、ちゃんと機能しています。
そこで今度は、テレビ操作用ワードを割と実用的なもの、チャンネルと音量、要らないかもしれませんが、番組表と番組情報だけに絞ってみることにしました。
ちなみに音量については、「テレビの」も追加してみました。
現在のところ、認識精度に違和感なく、正常に機能している...ので様子見。
ワード数の限界?というほど多くありませんが...標準辞書も含めるとオーバーってことか?それともエラーにはならかなったものの、実はJuliusを惑わせるNGワードがあった?
尚、Juliusの認識精度は、デフォルトのスピード重視しつつ、精度も良いモードであり、これを精度重視にもできるとはありますが、精度向上は、1%程度とあり、あまり意味はなさげと思い、試してはいません。
ちなみに激安USBハブに起因するのか、修正後、PCを再起動するとUSB系のエラーが出たり、これが出ず、PCに挿し直しても、なぜか、マイクを認識しなくなることがあり、sudo modprobe snd_usb_audioしてみたら、PCに挿した状態では、認識するようになりました。
と思いましたが、そもそも直挿しのラズパイでも同じようなことがあったため、USBハブの問題はさておき、sudo modprobe snd_usb_audioする必要に迫られることもある模様。
ただ、実行前後でsudo modprobe -cした時にsnd_usb_audioの設定値は変わってないんだけど、たまたま改善されたように見えただけで実は、この操作関係ない?
Julius/Open JTalkベースの自作ラズパイスマートスピーカー、ESP8266/ESP32による自作スマートリモコン、自作スマートコンセントがあるのですが、家電を無線操作するにあたり、Juliusの辞書の扱いをイマイチ理解できていないのか、判然とせず、明快な答えを探しています。
現在は、単語辞書で実装して、うまく機能しているので良いのですが、文法辞書を併用すれば、単語辞書の行数を低減できつつ、より柔軟に音声を認識してくれます気がしなくもないと思うのですが、考えれば考えるほど、やっぱり、そうはならない気がする...。
いや、音声の認識だけでよいのなら、併用すれば、思惑通りにはなりますが、Juliusから応答スクリプトにテキストを渡そうとすると...。
もちろん、単語辞書は「単語」であり、文法辞書が「文法」なのは、わかるし、単語辞書を補う形で文法辞書を併用できることもわかる。
つまり、「テレビ」「エアコン」「扇風機」などにおいて重複させることなく「つけて」「けして」などを共用できることはわかる。
が、単語辞書なら、第2フィールドの[]でJuliusから出力するテキストを明示できますが、文法辞書では、たぶんできない。
となると応答スクリプト側でテキストを受け取ることを考えた場合、操作呼びかけワードに「揺れ」があるとすると、この揺れのバリエーションを含めて複数行を「単語辞書」に書くことになるんだよね?だとしたら、文法辞書で揺れを補完できても意味ないんじゃ?というのが、自身の今の認識。
たとえば、「テレビをつけて」「テレビつけて」「テレビONして」という音声の場合、それら全てを[テレビをオン]とテキスト出力させたい場合、単語辞書にそれら3行を全て書くことで実装できます。
でも、これを文法辞書で「つけて」「をつけて」「ONして」を「扇風機」などと共用できれば、より合理的に辞書を作ることができそう...だけど、そうだとしたら、「単語辞書」の出力テキストとなる[テレビをオン]を応答スクリプトに渡すためには、「単語辞書」においてテレビをつける操作の場合、その行の第1フィールドをどう書けばよいのか?という疑問が残る。
仮に文法辞書で助詞や後置子を共用して単語辞書に「テレビ」と書くとして「をつけて」「つけて」「ONして」全てのバリエーションを音声として正しく認識はしてくれるのでしょうが、これらが何れも「テレビをつける」という意味であることを認識することは、できない...できるとすれば単語辞書の出力テキスト[テレビをオン]しかないのではないか?...と。
結局、この場合、文法辞書を使わず、単語辞書に3行書くしかないってことなら、自身の認識と合致はするけど、なんかモヤモヤする...みたいな。
第7章 言語モデル by Juliusが、これに関わると思われますが、自身が読解できていないだけ?
ん?「つける」と「けす」...を別々の文法辞書にすればよいのか?
「つけて」「をつけて」「をONにして」など「つける」意味のみから成る文法辞書を作成しつつ、単語辞書には、その一例としてテレビなら"テレビをつけて [テレビをON] t e r e..."と書いておけば、「テレビつけて」「テレビをONにして」と音声操作しても認識してくれます...のか?
でも、それだと「テレビの音量上げて」、「テレビの音量下げて」...も別々の文法辞書になってかえって非合理的か...んーーー...。
気づけば、2019/01/03にリリースされてたJulius 4.5に乗り換えつつ、検証してみようかな...。