JuliusをPythonで動かしてみた

はじめに

先日の記事でとりあえずMacでJuliusを動かしてみるということで

インストールから起動して音声認識してくれるまでの流れを記事にしました。

今回はJuliusをPythonで動かすところまでやってみたいと思います。

Juliusの起動

PythonでJuliusを使えるようにするにはJuliusをモジュールモードで実行する必要があります。

モジュールモードとは公式ドキュメントにも記載がありますが、音声認識サーバーとして動かすためのモードです。

このモードで起動することでTCP/IP経由でクライアントと接続してクライアントから制御を行うことができるようになります。

今回試そうとしているのは音声認識サーバーとしてJuliusを起動して、クライアントとしてPythonから操作するという形ですね。

公式ドキュメントのモジュールモードの記載については以下です。

https://julius.osdn.jp/juliusbook/ja/desc_module.html

モジュールモードでJuliusを起動するには前回試したコマンドに-moduleを追加する必要があります。

前回の起動コマンドはこちら。

$ julius -C main.jconf -C am-dnn.jconf -dnnconf julius.dnnconf -nostrip

そして今回変更したコマンドはこちら。

$ julius -C main.jconf -C am-dnn.jconf -dnnconf julius.dnnconf -module -nostrip

-moduleを入れる箇所はjulius.dnnconfの後です。

このコマンドを起動することで以下のように起動してくれます。

Juliusのモジュールモードでの起動の準備はここまでです。

Pythonのコード

今回はソケット経由でデータのやりとりを行います。

Juliusはクライアントからの接続を受けることで音声認識が可能な状態となります。

とりあえずソケット通信で接続して値を受け取るところまでやってみます。

# -*- coding: utf-8 -*-

import socket
host = '127.0.0.1'   # IPアドレス(今回はローカルループバックアドレス)
port = 10500         # ポート番号(今回はJuliusのデフォルトポート番号)

# ソケット通信で接続する
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, port))

try:
    while True:
        # 受け取った値を出力する
        print(str(client.recv(1024)))

except KeyboardInterrupt:
    print('finished')
    client.send("DIE".encode('utf-8'))
    client.close()

hostportはそれぞれの使用環境に合わせてください。

とは言っても特に設定していない場合は上記のままで大丈夫かと思います。

その後、hostportを設定したsocketオブジェクトを作成し、connect メソッドで接続します。

接続した後は音声認識を待機する状態となるので、この時に何か話すとサーバー側で処理を行い、

クライアント側に返してきます。

それの結果を受け取っているのがclient.recv の箇所です。

受け取った値はbyte型になっているので、strに変換し、画面に表示をしています。

recvメソッドの引数としている1024という数字は一度に受信するデータの最大量の指定となっており、

2の累乗を設定する必要があるようです。(公式ドキュメント参考)

socket --- 低水準ネットワークインターフェース
ソースコード: Lib/socket.py このモジュールはBSDの ソケット(socket) インターフェイスへのアクセスを提供します。これは、近代的なUnixシステム、Windows、MacOS、その他多くのプラットフォームで動作します。 Availability: not Emscripten, not WASI...

今回はとりあえずで1024を設定していますが、状況によっては変更した方が良さそうですがひとまずこのままで。

このままだとwhileループで無限に待機状態となってしまうので、処理を抜けるために

例外を受け取れる形にして、KeyboardInterruptで抜ける仕組みとしています。

この時にsendメソッドで送っているDIEはJuliusを強制終了するコマンドです。

こちらはJuliusの公式ドキュメントを参考にしてみてください。

https://julius.osdn.jp/juliusbook/ja/desc_module.html

実際に動かしてみる

上記で書いたコードを動かしてみます。

まず、サーバーの方を動かすためにJuliusをモジュールモードで起動します。(上で書いたのと同じコマンド)

$ julius -C main.jconf -C am-dnn.jconf -dnnconf julius.dnnconf -module -nostrip

その次にクライアント側となるPythonのコードを実行します。(今回はclient-test.pyというファイル名にしています。)

$ python client-test.py

起動するとターミナルにこんな表示が出てきてくれると思います。

この状態になればあとは端末のマイクに向かって何か話してみましょう。

今回は「おはようございます」と言ってみます。

その結果がこちら。

クライアント側にちゃんと音声認識した結果を返してくれました。

最後に

PythonからJuliusのサーバーに接続し、分析した結果を受け取るところまではできました。

今のままの仕組みとしてはサーバーから受け取った値をそのまま出しているだけなので、

まだ見辛い感じになってしまっているので、受け取った値の整形を行う処理は必要ですね。

ひとまず動かせる形にはなりました。

もしまた何か動かせるような形やアプリとしての開発案があればまた何か記事書こうかと思います。

それでは〜

コメント

タイトルとURLをコピーしました