はじめに
先日の記事でとりあえずMacでJuliusを動かしてみるということで
インストールから起動して音声認識してくれるまでの流れを記事にしました。
今回はJuliusをPythonで動かすところまでやってみたいと思います。
Juliusの起動
PythonでJuliusを使えるようにするにはJuliusをモジュールモードで実行する必要があります。
モジュールモードとは公式ドキュメントにも記載がありますが、音声認識サーバーとして動かすためのモードです。
このモードで起動することでTCP/IP経由でクライアントと接続してクライアントから制御を行うことができるようになります。
今回試そうとしているのは音声認識サーバーとしてJuliusを起動して、クライアントとしてPythonから操作するという形ですね。
公式ドキュメントのモジュールモードの記載については以下です。
モジュールモードで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()
host
とport
はそれぞれの使用環境に合わせてください。
とは言っても特に設定していない場合は上記のままで大丈夫かと思います。
その後、host
とport
を設定したsocket
オブジェクトを作成し、connect
メソッドで接続します。
接続した後は音声認識を待機する状態となるので、この時に何か話すとサーバー側で処理を行い、
クライアント側に返してきます。
それの結果を受け取っているのがclient.recv
の箇所です。
受け取った値はbyte
型になっているので、str
に変換し、画面に表示をしています。
recv
メソッドの引数としている1024
という数字は一度に受信するデータの最大量の指定となっており、
2の累乗を設定する必要があるようです。(公式ドキュメント参考)
今回はとりあえずで1024を設定していますが、状況によっては変更した方が良さそうですがひとまずこのままで。
このままだとwhileループで無限に待機状態となってしまうので、処理を抜けるために
例外を受け取れる形にして、KeyboardInterrupt
で抜ける仕組みとしています。
この時にsend
メソッドで送っているDIE
はJuliusを強制終了するコマンドです。
こちらはJuliusの公式ドキュメントを参考にしてみてください。
実際に動かしてみる
上記で書いたコードを動かしてみます。
まず、サーバーの方を動かすためにJuliusをモジュールモードで起動します。(上で書いたのと同じコマンド)
$ julius -C main.jconf -C am-dnn.jconf -dnnconf julius.dnnconf -module -nostrip
その次にクライアント側となるPythonのコードを実行します。(今回はclient-test.py
というファイル名にしています。)
$ python client-test.py
起動するとターミナルにこんな表示が出てきてくれると思います。
この状態になればあとは端末のマイクに向かって何か話してみましょう。
今回は「おはようございます」と言ってみます。
その結果がこちら。
クライアント側にちゃんと音声認識した結果を返してくれました。
最後に
PythonからJuliusのサーバーに接続し、分析した結果を受け取るところまではできました。
今のままの仕組みとしてはサーバーから受け取った値をそのまま出しているだけなので、
まだ見辛い感じになってしまっているので、受け取った値の整形を行う処理は必要ですね。
ひとまず動かせる形にはなりました。
もしまた何か動かせるような形やアプリとしての開発案があればまた何か記事書こうかと思います。
それでは〜
コメント