前提・実現したいこと
Juliusを使用したGUIアプリケーションを作成しています。
最終目標は、問題をGUIに表示→音声で入力→正解・不正解を表示といったアプリを作成したいと考えています。
その途中段階で、
スタートボタンをクリック→Juliusをモジュールモードで起動→出力結果をTCP/IP経由で取得・GUIに表示
まで作成しました。
次のステップとして
ストップボタンをクリック→Juliusとの接続を停止させる
を実現したいのですが、以下のソースコードすとストップボタンが押される。次の
音声入力が行われると接続が停止されるという状態しか作れませんでした。
停止ボタンが押されたら即接続を停止させたいのですが、どういった方法がありますでしょうか。
ご教示いただければ幸いです。
発生している問題
ストップボタンが押されてから即接続を停止できない。
該当のソースコード
python3+Julius
1# -*- coding: utf-8 -*- 2 3import tkinter # Tkinterモジュールのインポート 4import socket 5import string 6import subprocess 7import time 8import threading 9 10stopFlag = 0 11 12# コンソールに"Button is clicked."を出力する関数 13def startButtonClicked(): 14 # ボタン非表示化 15 #startButton.pack_forget() 16 # スレッディング処理 17 thread1 = threading.Thread(target=juliusWork) 18 thread1.start() 19 20def stopButtonClicked(): 21 #stopButton.pack_forget() 22 global stopFlag 23 stopFlag = 1 24 print("stop") 25 26def juliusWork(): 27 28 #Juliusをモジュールモードで起動(自作辞書使用) 29 p = subprocess.Popen("julius -C ~/julius/dictation-kit-4.5/am-gmm.jconf -nostrip -gram ~/julius/test/test -input mic -module", stdout=subprocess.PIPE, shell=True) 30 print('Initiating') 31 time.sleep(2) 32 print('Done') 33 pid = str(p.pid) 34 print(pid) 35 36 host = 'localhost' # IPアドレス 37 port = 10500 # juliusの待ち受けポート 38 39 # TCP/IPで、juliusサーバに接続 40 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 41 sock.connect((host, port)) 42 43 data = "" 44 while True: 45 #stopFlagが立った時の終了処理 46 global stopFlag 47 if stopFlag == 1: 48 print("finished") 49 sock.close() 50 stopFlag = 0 51 break 52 53 # 音声認識結果のみをXMLで取得 54 while (data.find("</RECOGOUT>\n.") == -1): 55 soc = sock.recv(1024) 56 data = data + soc.decode('utf-8') 57 58 # 音声認識結果のXMLから単語部分のみを抜き出して連結 59 recog_text = "" 60 for line in data.split('\n'): 61 index = line.find('WORD="') 62 if index != -1: 63 line = line[index+6:line.find('"', index+6)] 64 if line != "[s]" and line != "[/s]": 65 recog_text = recog_text + line 66 67 print("認識結果: " + recog_text) 68 69 resultTextWidget.insert('end', "認識結果=" + recog_text+"\n") #テキストフィールドに検出結果を表示 70 data = "" #dataの中身(検出結果)を空に 71 72# ウィンドウ(フレーム)の作成 73root = tkinter.Tk() 74# ウィンドウの名前を設定 75root.title("demo_Tkinter") 76# ウィンドウの大きさを設定 77root.geometry("400x400") 78 79resultTextWidget = tkinter.Text(root) 80resultTextWidget.pack() 81 82# ボタンの作成(text=ボタンに表示されるテキスト, command=押下時に呼び出す関数) 83startButton = tkinter.Button(root, text="スタート", command=startButtonClicked) 84startButton.pack()# ボタンの表示 85stopButton = tkinter.Button(root, text="ストップ", command=stopButtonClicked) 86stopButton.pack()# ボタンの表示 87 88# イベントループ 89root.mainloop()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/21 11:58 編集
2020/05/21 11:59