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

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

新規登録して質問してみよう
ただいま回答率
87.20%
並列処理

複数の計算が同時に実行される手法

Python

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

解決済

pythonで音声認識とレベルバーの同時処理について

hiro04kon
hiro04kon

総合スコア27

並列処理

複数の計算が同時に実行される手法

Python

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

1回答

0評価

0クリップ

560閲覧

投稿2021/11/21 04:01

編集2021/11/23 02:47

解決したいこと

音声認識の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("停止を確認。終わります。")

いろいろ改善できそうなコードですが、とりあえずできました。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

並列処理

複数の計算が同時に実行される手法

Python

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