質問編集履歴

1

解決したコードの追加

2021/11/23 02:47

投稿

hiro04kon
hiro04kon

スコア46

test CHANGED
File without changes
test CHANGED
@@ -255,3 +255,221 @@
255
255
  _VARS['window'].close()
256
256
 
257
257
  ```
258
+
259
+
260
+
261
+ ###解決した内容
262
+
263
+ 長いので、こちらに記入します。これで、アクティブにしたメモ帳等に、音声が反応しているか等を確認しながら入力できるようになりました。
264
+
265
+
266
+
267
+ ```
268
+
269
+ import PySimpleGUI as sg
270
+
271
+ import pyaudio
272
+
273
+ import numpy as np
274
+
275
+ import time
276
+
277
+ import speech_recognition as sr
278
+
279
+ import pyperclip
280
+
281
+ import pyautogui
282
+
283
+ import threading
284
+
285
+
286
+
287
+ _VARS = {'window': False,'stream': False}
288
+
289
+
290
+
291
+ CHUNK = 1024
292
+
293
+ RATE = 44100
294
+
295
+ INTERVAL = 1
296
+
297
+ pAud = pyaudio.PyAudio()
298
+
299
+
300
+
301
+ ###### 音声入力部分 ######
302
+
303
+ def long_operation_thread(window):
304
+
305
+ while True:
306
+
307
+ r = sr.Recognizer()
308
+
309
+ with sr.Microphone() as source:
310
+
311
+ print("何かお話しして下さい。")
312
+
313
+ r.adjust_for_ambient_noise(source , duration = 1 ) #雑音対策
314
+
315
+ audio = r.listen(source)
316
+
317
+ update_text = "認識中"
318
+
319
+ _VARS['window']['-TEXT-'].update(update_text)
320
+
321
+ try:
322
+
323
+ # Google Web Speech APIで音声認識
324
+
325
+ text =""
326
+
327
+ text = r.recognize_google(audio, language="ja-JP")
328
+
329
+ except sr.UnknownValueError:
330
+
331
+ print("音声認識できませんでした。")
332
+
333
+ update_text = "音声認識できませんでした。"
334
+
335
+ _VARS['window']['-TEXT-'].update(update_text)
336
+
337
+ except sr.RequestError as e:
338
+
339
+ print("音声認識を要求できませんでした。"
340
+
341
+ " {0}".format(e))
342
+
343
+ update_text = "音声認識を要求できませんでした。"
344
+
345
+ _VARS['window']['-TEXT-'].update(update_text)
346
+
347
+ else:
348
+
349
+ if text == "停止" : #停止で終了
350
+
351
+ stop()
352
+
353
+ else:
354
+
355
+ print(text)
356
+
357
+ pyperclip.copy(text)
358
+
359
+ pyautogui.press('enter') #メモ帳などを選択した状態で
360
+
361
+ time.sleep(0.2) #話すと、貼り付けられる
362
+
363
+ pyautogui.hotkey('ctrl', 'v')
364
+
365
+ voice_text = text
366
+
367
+ update_text = voice_text
368
+
369
+ _VARS['window']['-TEXT-'].update(update_text)
370
+
371
+
372
+
373
+ def stop():
374
+
375
+ if _VARS['stream']:
376
+
377
+ _VARS['stream'].stop_stream()
378
+
379
+ _VARS['stream'].close()
380
+
381
+ _VARS['window']['-PROG-'].update(0)
382
+
383
+ update_text = "停止中"
384
+
385
+ _VARS['window']['-TEXT-'].update(update_text)
386
+
387
+
388
+
389
+ def callback(in_data, frame_count, time_info, status):
390
+
391
+ data = np.frombuffer(in_data, dtype=np.int16)
392
+
393
+ _VARS['window']['-PROG-'].update(np.amax(data))
394
+
395
+ return (in_data, pyaudio.paContinue)
396
+
397
+
398
+
399
+ def listen():
400
+
401
+ _VARS['stream'] = pAud.open(format=pyaudio.paInt16, channels=1, rate=RATE,input=True, frames_per_buffer=CHUNK, stream_callback=callback)
402
+
403
+ _VARS['stream'].start_stream()
404
+
405
+
406
+
407
+ def the_gui():
408
+
409
+ AppFont = 'Any 16'
410
+
411
+ sg.theme('Black')
412
+
413
+ layout = [[sg.ProgressBar(10000, orientation='h',
414
+
415
+ size=(30, 10), key='-PROG-')],
416
+
417
+ [sg.Text('開始を押してね', size=(40, 2) ,font=(AppFont,11,'bold'),key='-TEXT-')], #ラベルを変更用のキー「key='-TEXT-'」 #size=(40, 2)で横40字、2行表示ができます。
418
+
419
+ [sg.Button('開始', font=(AppFont,10)),
420
+
421
+ sg.Button('停止', font=(AppFont,10)),
422
+
423
+ sg.Button('終了', font=(AppFont,10))]]
424
+
425
+ _VARS['window'] = sg.Window('音声入力レベルバー', layout,no_titlebar=False,finalize=True,transparent_color=True,keep_on_top=True)
426
+
427
+
428
+
429
+ ###### 音声入力 ######
430
+
431
+ while True: #ボタン動作  
432
+
433
+ event, values = _VARS['window'].read(timeout=100)
434
+
435
+ if event == sg.WIN_CLOSED or event == '終了':
436
+
437
+ pAud.terminate()
438
+
439
+ break
440
+
441
+ if event == '開始':
442
+
443
+ listen()
444
+
445
+ print('音声認識中')
446
+
447
+ update_text = '音声認識中'
448
+
449
+ _VARS['window']['-TEXT-'].update(update_text)
450
+
451
+ threading.Thread(target=long_operation_thread, args=(_VARS['window'],), daemon=True).start()
452
+
453
+ if event == '停止':
454
+
455
+ stop()
456
+
457
+ long_operation_thread.alive = False
458
+
459
+
460
+
461
+ _VARS['window'].close()
462
+
463
+
464
+
465
+ if __name__ == '__main__':
466
+
467
+ the_gui()
468
+
469
+ print("停止を確認。終わります。")
470
+
471
+
472
+
473
+ ```
474
+
475
+ いろいろ改善できそうなコードですが、とりあえずできました。