質問編集履歴
1
解決したコードの追加
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
|
+
いろいろ改善できそうなコードですが、とりあえずできました。
|