Appの自動起動例)Python3音声認識codamaPart-1では、サンプルプログラムの動作確認と改造を行い、LAN上の他のPCから認識結果を得る方法を考えました。Part-2では、得られた認識結果をMecabを使って形態素解析を行い、Windowsアプリケーションの自動起動を考えます。発話(アナログ)した内容が音声認識され、得られた文字列(デジタル)が、予め用意した制御対象の辞書内容と一致すれば、動作可能なように思えます。そこで、以下のような辞書を用意することにしました。パラメータ}]動作としては、認識結果文字列と辞書内の「Keyword」で定義した「比較文字列」と一致すれば、「Func」の「動作関数」が「Arg」のパラメータと供に呼び出されというものです。具体的には、「青のLEDを点灯させる」ことを考えた場合、辞書を以下のように定義します。ON}]発話内容が辞書の「Keyword」と一致すれば、blue_led()がパラメータ「ON」と供に呼び出されます。これだと目的の動作をさせるのに、複数の発話内容が存在しますし、認識結果にノイズが混じる場合があり現実的ではありません。上記の例ですと、認識結果文字列に「青」又は「青い」・「LED」・「点け」の文字が含まれていることが確認できれば要件を満たします。このように、文字列をバラバラに分解していくれる処理を「形態素解析」と言われているようで、自然言語処理の前処理としては古くからある手法だそうです。そこで、形態素解析の有名なモジュールである「MeCab」を用いると以下のようになります。動詞,非自立,*,*,五段・ラ行特殊,命令i,くださる,クダサイ,クダサイEOSオプションの「wakati」を指定すると、スペースで区切った文字列が出力されます。ください辞書を再検討します。「青」と「青い」は名詞と形容詞の違いなので、一緒にはなりません。これで動作精度はかなり向上しますが、まだ問題があります。それは、認識結果が「点ける」や「つける」と返される場合があるからです。(辞書が大きくなる)これを避けるためには、辞書のKeywordを「カタカナ」で定義します。MeCabには「chasen」というオプションがあるので、読みであるカタカナ部分を採用することにします。命令iEOS辞書の再再検討をします。認識結果と辞書の内容の比較方法MeCabから出力される文字列は、各要素をタブと改行コードで区切られた1つの文字列です。よって、以下の手順で認識結果と辞書の内容との比較を行います。得られた認識文字列をMeCab(chasen)で処理する。タブと改行コードを頼りに2次元配列を作る。配列の2番目がカタカナの読みであるので、それを取出して1次元配列にする。辞書の「Keyword」の要素を1次元配列にする。それぞれの配列を集合に変換する。集合演算で包含関係を調べる。以上の原理の考察を踏まえて、具体的なデバイスの自動起動を考えます。半田付けが不要な、発話によるWindowsアプリケーションの自動起動を検討します。(Chromeの自動操作)※seleniumは、Chromeで表示した特定サイト内の操作を自動化するもので、サイト内検索や特定ボタンを押すなどプログラムから制御できるドライバです。よって、単にアプリケーションを立ちあげることを確認するだけなら必要ありません。どちらもインストール後に簡単なプログラムを作成し、Windows上のPythonで動作確認しておきます。作成したログラムdefine.pyappcont.pyAppControl.pyここでは、発話により以下のアプリケーションを起動することにします。「AccuRadio」は、私が毎日BGMで利用しているインターネットラジオサイトです。define.py定数を定義するのにpythonではやりにくいですね!!C言語みたいな#define文が使えないのでファイルが分かれる場合、同じ定数をファイル毎に変数定義しなければなりません。仕方が無いので、以下のような定数クラス作り、定義したファイルを使っています。良い方法があればと思います。各アプリケーションのインストール場所(PATH)は使用する環境に依存しますので、予め調べておきます。D/Bから取得した認識結果を形態素解析して、辞書の要素と比較して一致したら実際に起動する関数を呼び出します。補足説明」のツールを使うなりして登録します。appcont.py実際のアプリケーション起動は、subprocess()を使っています。Webdriverを使って起動後にそのチャンネルのボタンを探して押す動作を行います。最大の難関は、ごちゃごちゃのHTMLソースコードからボタンの場所(XPATH)を探すことかな?コツを掴むのに時間がかかります。「Codama」をハットしたラズパイでPart-1で作成した認識プログラムを起動します。「main.py」PC側で「AppControl.py」を起動します。「ワードを立ち上げるのじゃ」などと喋って下さい。Part-2のまとめ今回のやり方が良いのかどうか分からないが、制御対象を限定すれば案外簡単に音声認識結果を利用できた。認識結果をMeCab(chasen)で形態素解析することにより、多少認識結果にノイズが混じっていても動作精度を向上させることが可能である。Part-1のまとめでも述べたが、反応が多少鈍いのは5Gの登場を待たなければならないのか?Part-3では、定番のLED及びサーボモータを発話により動かしてみるが、基本的なプログラム構造は今回のものと同じで、異なるのは辞書と動作プログラムの内容である。発話により同じ自動動作をさせるにも、複数の発話方法や認識結果にノイズが混じることもあります。それらを全て辞書に登録するのは現実的ではありませんので、動作に必要な共通の単語を決める必要があります。下記のプログラムは、上記の「AppControl.py」を多少改造して、MeCab(chasen)で形態素解析したカタカナリストと認識文字列をCSVで書き出すようにしただけのものですが、こうゆうものを利用して共通の単語を決めたら良いかと思います。辞書に追加する単語は、下の例でも分かるように発話の仕方により「アゲ」だけでは無く「アゲル」も必要なようです。upLoginユーザーは見つかりませんでした。