質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Julius

Julius は,音声認識システムの開発・研究のためのオープンソースの高性能な汎用大語彙連続音声認識エンジンです。数万語彙の連続音声認識を一般のPCやスマートフォン上でほぼ実時間で実行できる軽量さとコンパクトさを持っています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1427閲覧

PythonでJuliusの音声認識結果を取得したい

rukei_jima2017

総合スコア7

Julius

Julius は,音声認識システムの開発・研究のためのオープンソースの高性能な汎用大語彙連続音声認識エンジンです。数万語彙の連続音声認識を一般のPCやスマートフォン上でほぼ実時間で実行できる軽量さとコンパクトさを持っています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/01/11 02:02

###前提・実現したいこと
PythonのsubprocessでJuliusをモジュールモードで起動し、音声認識結果をテキストで受け取る。
juliusの音声認識結果はxml形式でサーバ側に渡される。
期待する出力例:

<RECOGOUT> <SHYPO RANK="1" SCORE="59.118156"> <WHYPO WORD="" CLASSID="<s>" PHONE="sp_S" CM="1.000"/> <WHYPO WORD="さようなら" CLASSID="さようなら+感動詞" PHONE="s_B a_I y_I o:_I n_I a_I r_I a_E" CM="0.689"/> <WHYPO WORD="。" CLASSID="</s>" PHONE="sp_S" CM="1.000"/> </SHYPO> </RECOGOUT>

###発生している問題・エラーメッセージ
1.
マイクに音声を入力しても空データしか返ってこないため、音声認識結果が出力されない(juliusが立ち上がっているのは確認できる)
2.
PythonとJuliusの接続に失敗する(2〜3回に1回程度の割合)

Traceback (most recent call last): File "julius.py", line 53, in <module> main() File "julius.py", line 18, in main client.connect((host, port)) ConnectionRefusedError: [Errno 61] Connection refused

###該当のソースコード
julius.py

python

1# coding:utf-8 2import subprocess 3import socket 4 5 6def main(): 7 # julius起動スクリプトを実行 8 p = subprocess.Popen(["./dictation-kit-v4.4/run-dnn-mod.sh"], stdout=subprocess.PIPE, shell=True) 9 # juliusのプロセスIDを取得 10 pid = str(p.pid) 11 12 host = 'localhost' 13 port = 10500 14 15 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 16 client.connect((host, port)) 17 18 while 1: 19 try: 20 # データの受け取り バイト列で返ってくるためutf-8にデコード 21 data = client.recv(1024).decode("utf-8") 22 # データが空でなければ 23 if len(data) > 1: 24 # 出力 25 print(data) 26 except KeyboardInterrupt: 27 print ("KeyboardInterrupt occured.") 28 p.kill() 29 # juliusのプロセスを終了 30 subprocess.call(["kill " + pid], shell=True) 31 client.close() 32 33if __name__ == "__main__": 34 main()

run-dnn-mod.sh

#! /bin/sh PATH='dictation-kit-v4.4' ./$PATH/bin/osx/julius -C $PATH/main.jconf -C $PATH/am-dnn.jconf -module -dnnconf $PATH/julius.dnnconf $*

###試したこと
ホストのIPアドレスを指定する際に host='localhost' ではなく実際に割り当てられているIPアドレスを指定したが特に効果はなかった
対話モードで実行した場合は想定通りに動作しているため原因となっている箇所が不明

###補足情報(言語/FW/ツール等のバージョンなど)
実行環境
MacBook Pro(13-inch Early 2015)
macOS High Sierra 10.13.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

portが固定ですが、たまに接続に失敗するのは他に実行しているものがある時ではないですか?

音声に反応しないことですが、pythonからではなく直接実行すると正しい応答があるという仮定のもとで考えてよろしいのでしょうか?


追記
エラーを再現しました。
Juliusが走りだす前にソケットを開いてしまうせいみたいです。
少し待ってあげると動きます。

python

1# coding:utf-8 2import subprocess 3import socket 4import time 5 6def main(): 7 p = subprocess.Popen("./run-dnn-mod.sh", stdout=subprocess.PIPE, shell=True) 8 print('Initiating') 9 time.sleep(5) 10 print('Done') 11 pid = str(p.pid) 12 13 host = 'localhost' 14 port = 10500 15 16 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 17 client.connect((host, port)) 18 19 while True: 20 try: 21 data = client.recv(1024).decode("utf-8") 22 if len(data) > 1: 23 print(data) 24 except KeyboardInterrupt: 25 print ("KeyboardInterrupt occured.") 26 p.kill() 27 subprocess.call("kill " + pid, shell=True) 28 client.close() 29 quit() 30 31if __name__ == "__main__": 32 main()

投稿2018/01/11 03:37

編集2018/01/11 15:01
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rukei_jima2017

2018/01/11 04:02

確かに常時アプリケーションを立ち上げた状態でプログラムを実行しているのでそれはあるかもしれません。 Juliusを直接立ち上げた場合は正常に動作します。Pythonの対話モードで上のjulius.pyを各行入力、実行した場合もなぜか正常に動作します。
mkgrei

2018/01/11 13:26

ソケットが閉じるまでラグがあるみたいですね。 https://rcmdnk.com/blog/2015/07/03/computer-linux/ 対話モードで正常動作というのは不思議ですね。 何かの不具合があったとみて、どこかで待ち時間を挿入してみるのも手かもしれません。
rukei_jima2017

2018/01/12 01:47

とりあえず待ち時間の挿入は試してみます
rukei_jima2017

2018/01/12 01:52

ありがとうございます、追記の内容に変更した場合に正常に動作しました。socketを使う場合はそういったポイントにも注意が必要なのですね、勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問