RaspberryPi ラズパイ(Python)

音声認識を使ってラズパイと会話をする(Julius,OpenJtalk使用)

どうも。まっきーです!

JuliusとOpenJtalkを使って、Siriっぽいのできないかなと思って簡単なやり取りができるシステムを作ってみました。(AIではありません…)

今回の目的は以下の二つです。

  • subprocessを使ってモジュールモードをpythonから起動させる
  • ラズパイに話しかけたら、音声が帰ってくるプログラムの作成

モジュールモードをpythonから起動させる

モジュールモードとは

音声認識エンジンのJulius は,独立した認識サーバとして動作し, 外部クライアント(今回はPython)とソケットを介してデータをやりとりすることができます。これを行うためのモードがモジュールモードです。

データのやり取りをするためには、ターミナルを二つ開き一方はモジュールモード(サーバー)一方はクライアント(Python)というよう設定しなければなりませんでした。(詳しい解説はラズパイで音声認識を見てください!)

わざわざ設定するのってめんどくさいですよね。そこで、subprocessモジュールというものを用いてPythonからモジュールモードを起動するよう設定をしていきます。

subprocessの説明

subprocessとは、PythonスクリプトからOS上の別プロセス(コマンド)を起動するためのモジュールです。

実行されているプログラムをプロセスと言い、これを実行中に別プロセスを立ち上げたい。その際子プロセスというものが作成されます。

通常、子プロセスの出力を親プロセス(実行しているプロセス)は取得することはできない.しかしexecの前にプロセス間通信の手法(パイプ)を適切に設定してやることで,出力を得ることが可能になります。

つまり、子プロセス側でPIPEにつなぎ変えることで親プロセス側とデータのやり取りが可能になります。

注意して使わなければ「デッドロック」と呼ばれるお互いにロックかけている状態になってしまうことがあるそうです。ですが今回は加味しないことにします(詳しくないので(-_-;))

ソースコード

JuliusモジュールモードをPythonから立ち上げるコードは以下のようになります(後で使用するために関数にしてあります)

subprocessにはrunメソッドもありますが、汎用性の高いPopenを使用しています。

ラズパイに話しかけたら、音声が帰ってくるプログラムの作成

では実際にSiri風のものを作成していきます。

Julius、OpenJtalkのインストールは完了しているものとします。

まだできていない方は以下の記事を参考にしてください。

ディレクトリの階層は以下のようになっています。

ソースコード(voice.py)

-Dplughw:1,0-Dplughw(カード番号、デバイス番号)です。

aplay -l コマンドでご自身の番号を確認して修正してください。

カード番号・デバイス番号確認方法

ソースコード(julius_talk.py)

モジュールモードを起動してから、sleepが入らないとうまくPython側と接続できないので3秒のsleepを入れています。

結果

音声載せられなくてすみません。

少しレスポンスが遅い感じがしますが、認識後にしっかりしゃべってくれます。

本物のSiriの足元にも及ばないですが、Siri風のものはできたのではないでしょうか(笑)

終わりに

レスポンスは少し遅い感じになってしまいましたが、それっぽくはなったのではないでしょうか?

電気をつけたりカメラをとったりする機能を付け加えたりすればもっと面白そうですね!

近いうちにやってみたいと思います!今回はここまでです。ありがとうございました!

参考サイト

subprocessの使い方(Python3.6)

-RaspberryPi, ラズパイ(Python)

© 2020 まきろぐ Powered by AFFINGER5