Raspberry Pi & Python 開発ブログ ☆彡

Raspberry PiとPythonの基本的な使い方をわかりやすく解説。初心者、入門者必見!!

juliusをmoduleモードで起動して、pythonで話した言葉を取得する

julius python

この記事の内容はRaspberry Pi 4と3の両方で動作確認済みです

ブログ管理者のP.Hです!

今回は、juliusを使って話した言葉をpythonで取得する方法を紹介したいと思います。juliusとpythonで連携することで、話した言葉によって実行するプログラムを変えることができます。"光れ"と話すとLEDを光らせる、"消す"と話すとLEDを消す、なんていうこともできます。プログラム次第でいろいろなものが作れそうですね。

それでは、juliusとpythonで連携する方法を紹介します。

juliusをモジュールモードで起動する

juliusにはモジュールモードというモードがあります。モジュールモードで起動すると、ソケット通信を介してデータをやりとりすることができます。juliusを起動するときに-moduleオプションを追加して起動するとモジュールモードで起動することができます。

下記記事でディクテーション実行キットと記述文法音声認識キットの使い方を紹介していますが、以下のようにコマンドを実行することでモジュールモードで起動することができます。

  • ディクテーション実行キット
$ julius -C main.jconf -C am-gmm.jconf -demo -module
  • 記述文法音声認識キット
$ julius -C ~/grammar/grammar-kit-4.3.1/hmm_mono.jconf -input mic -gram ~/grammar/tenki -nostrip -module

www.raspberrypirulo.net

これでモジュールモードで起動することができます。ポート番号は10500になります。

pythonでソケット通信して、話した言葉を取得する

下記がサンプルコードになります。コード内にコメントを記載していますので、参考にしてください。以下のような流れになります。

  • juliusサーバーをモジュールモードで起動する
  • pythonプログラムを起動し、ソケット通信でjuliusサーバーに接続する
  • 何か話すとjuliusサーバーからクライアント(python)にxml形式でデータが送信される
  • pythonで送られてきたxmlデータを解析する
  • 解析した言葉により、print文を実行する
import socket
import time

HOST = '127.0.0.1'   # juliusサーバーのIPアドレス
PORT = 10500         # juliusサーバーの待ち受けポート
DATESIZE = 1024     # 受信データバイト数

class Julius:

    def __init__(self):

        self.sock = None

    def run(self):

        # socket通信でjuliusサーバーに接続
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as self.sock:
            self.sock.connect((HOST, PORT))

            strTemp = "" # 話した言葉を格納する変数
            fin_flag = False # 話終わりフラグ

            while True:

                # juliusサーバからデータ受信
                data = self.sock.recv(DATESIZE).decode('utf-8')

                for line in data.split('\n'):
                    # 受信データから、<WORD>の後に書かれている言葉を抽出して変数に格納する。
                    # <WORD>の後に、話した言葉が記載されている。
                    index = line.find('WORD="')
                    if index != -1:
                        # strTempに話した言葉を格納
                        strTemp = strTemp + line[index+6:line.find('"',index+6)]
                        
                    # 受信データに</RECOGOUT>'があれば、話終わり ⇒ フラグをTrue
                    if '</RECOGOUT>' in line:
                        fin_flag = True

                # 話した言葉毎に、print文を実行
                if fin_flag == True:
                    if '晴れ' in strTemp:
                        print("今の天気は晴れ")
                    elif '雨' in strTemp:
                        print("今の天気は雨")
                    elif '曇' in strTemp:
                        print("今の天気は曇り")
                    else:
                        print("話した言葉:" + strTemp)
                    
                    fin_flag = False
                    strTemp = ""

if __name__ == "__main__":

    julius = Julius()
    julius.run()

今回は、晴れ、雨、曇という言葉でprint文を実行していますが、この部分を変えれば、話した言葉により好きなプログラムを実行することができます。LEDを光らせたり、モーターを動かしたり、シャットダウンしたり、話した言葉をトリガーにいろいろな動作をさせることができます。アマゾン エコーとまでは行きませんが、似たようなものは作れそうです。

以上で、juliusとpythonを連携する方法の説明を終わります。