解決したいこと
音声認識のpyファイルと、音量レベルバーのpyファイルを一つにして、認識とレベルバーを同時に処理したい。
音声認識はできているのですが、レベルバーが動かずに困っています。
解決方法を教えて下さい。
完成したら、下記のようにしたい。
「認識中」の上がレベルバー、「認識中」のところには、認識した文字が表示されるようにしたい。
試したこと
下にある「音声認識用pyファイル voice.py」と「音量レベルバー表示pyファイル bar.py」があり、voice.pyのvoice_inをbar.pyにimportし,bar.pyのapp()に追記。
この時点で、音声認識はするものの、ボタンのクリック等出来なくなります。
その他に、音声認識したものを、#ラベルを変更用のキー「key='-TEXT-'」を使って表示したいと考えています。
bar2.py
from VoicePaste import voice_in -------省略------ def app(): while True: #ボタン動作 event, values = _VARS['window'].read(timeout=100) if event == sg.WIN_CLOSED or event == '終了': pAud.terminate() break if event == '開始': listen() if event == '停止': stop() voice_in() #追加 update_text = voice_text _VARS['window']['-TEXT-'].update(update_text)
音声認識用pyファイル
voice.py
import time import speech_recognition as sr import pyperclip import pyautogui ###### 音声入力 def voice_in(): while True: r = sr.Recognizer() with sr.Microphone() as source: print("何かお話しして下さい。") r.adjust_for_ambient_noise(source , duration = 1 ) #雑音対策 audio = r.listen(source) try: # Google Web Speech APIで音声認識 text ="" text = r.recognize_google(audio, language="ja-JP") except sr.UnknownValueError: print("音声認識できませんでした。") except sr.RequestError as e: print("音声認識を要求できませんでした;" " {0}".format(e)) else: if text == "停止" : #停止で終了 break else: print(text) pyperclip.copy(text) pyautogui.press('enter') #メモ帳などを選択した状態で time.sleep(0.2) #話すと、貼り付けられる pyautogui.hotkey('ctrl', 'v') voice_text = text if __name__ == "__main__": app = voice_in() print("停止を確認。終わります。")
###音量レベルバー表示pyファイル
bar.py
import PySimpleGUI as sg import pyaudio import numpy as np _VARS = {'window': False,'stream': False} AppFont = 'Any 16' sg.theme('Black') layout = [[sg.ProgressBar(10000, orientation='h', size=(30, 10), key='-PROG-')], [sg.Text('開始を押してね', size=(40, 2) ,font=(AppFont,11,'bold'),key='-TEXT-'))], #ラベルを変更用のキー「key='-TEXT-'」 [sg.Button('開始', font=(AppFont,10)), sg.Button('停止', font=(AppFont,10)), sg.Button('終了', font=(AppFont,10))]] _VARS['window'] = sg.Window('音声入力レベルバー', layout,no_titlebar=False,finalize=True,transparent_color=True,keep_on_top=True) CHUNK = 1024 RATE = 44100 INTERVAL = 1 pAud = pyaudio.PyAudio() def stop(): if _VARS['stream']: _VARS['stream'].stop_stream() _VARS['stream'].close() _VARS['window']['-PROG-'].update(0) def callback(in_data, frame_count, time_info, status): data = np.frombuffer(in_data, dtype=np.int16) _VARS['window']['-PROG-'].update(np.amax(data)) return (in_data, pyaudio.paContinue) def listen(): _VARS['stream'] = pAud.open(format=pyaudio.paInt16, channels=1, rate=RATE,input=True, frames_per_buffer=CHUNK, stream_callback=callback) _VARS['stream'].start_stream() def app(): while True: #ボタン動作 event, values = _VARS['window'].read(timeout=100) if event == sg.WIN_CLOSED or event == '終了': pAud.terminate() break if event == '開始': listen() if event == '停止': stop() if __name__ == "__main__": application = app() application.mainloop() _VARS['window'].close()
###解決した内容
長いので、こちらに記入します。これで、アクティブにしたメモ帳等に、音声が反応しているか等を確認しながら入力できるようになりました。
import PySimpleGUI as sg import pyaudio import numpy as np import time import speech_recognition as sr import pyperclip import pyautogui import threading _VARS = {'window': False,'stream': False} CHUNK = 1024 RATE = 44100 INTERVAL = 1 pAud = pyaudio.PyAudio() ###### 音声入力部分 ###### def long_operation_thread(window): while True: r = sr.Recognizer() with sr.Microphone() as source: print("何かお話しして下さい。") r.adjust_for_ambient_noise(source , duration = 1 ) #雑音対策 audio = r.listen(source) update_text = "認識中" _VARS['window']['-TEXT-'].update(update_text) try: # Google Web Speech APIで音声認識 text ="" text = r.recognize_google(audio, language="ja-JP") except sr.UnknownValueError: print("音声認識できませんでした。") update_text = "音声認識できませんでした。" _VARS['window']['-TEXT-'].update(update_text) except sr.RequestError as e: print("音声認識を要求できませんでした。" " {0}".format(e)) update_text = "音声認識を要求できませんでした。" _VARS['window']['-TEXT-'].update(update_text) else: if text == "停止" : #停止で終了 stop() else: print(text) pyperclip.copy(text) pyautogui.press('enter') #メモ帳などを選択した状態で time.sleep(0.2) #話すと、貼り付けられる pyautogui.hotkey('ctrl', 'v') voice_text = text update_text = voice_text _VARS['window']['-TEXT-'].update(update_text) def stop(): if _VARS['stream']: _VARS['stream'].stop_stream() _VARS['stream'].close() _VARS['window']['-PROG-'].update(0) update_text = "停止中" _VARS['window']['-TEXT-'].update(update_text) def callback(in_data, frame_count, time_info, status): data = np.frombuffer(in_data, dtype=np.int16) _VARS['window']['-PROG-'].update(np.amax(data)) return (in_data, pyaudio.paContinue) def listen(): _VARS['stream'] = pAud.open(format=pyaudio.paInt16, channels=1, rate=RATE,input=True, frames_per_buffer=CHUNK, stream_callback=callback) _VARS['stream'].start_stream() def the_gui(): AppFont = 'Any 16' sg.theme('Black') layout = [[sg.ProgressBar(10000, orientation='h', size=(30, 10), key='-PROG-')], [sg.Text('開始を押してね', size=(40, 2) ,font=(AppFont,11,'bold'),key='-TEXT-')], #ラベルを変更用のキー「key='-TEXT-'」 #size=(40, 2)で横40字、2行表示ができます。 [sg.Button('開始', font=(AppFont,10)), sg.Button('停止', font=(AppFont,10)), sg.Button('終了', font=(AppFont,10))]] _VARS['window'] = sg.Window('音声入力レベルバー', layout,no_titlebar=False,finalize=True,transparent_color=True,keep_on_top=True) ###### 音声入力 ###### while True: #ボタン動作 event, values = _VARS['window'].read(timeout=100) if event == sg.WIN_CLOSED or event == '終了': pAud.terminate() break if event == '開始': listen() print('音声認識中') update_text = '音声認識中' _VARS['window']['-TEXT-'].update(update_text) threading.Thread(target=long_operation_thread, args=(_VARS['window'],), daemon=True).start() if event == '停止': stop() long_operation_thread.alive = False _VARS['window'].close() if __name__ == '__main__': the_gui() print("停止を確認。終わります。")
いろいろ改善できそうなコードですが、とりあえずできました。
まだ回答がついていません
会員登録して回答してみよう