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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

542閲覧

pythonのtkinterとspeech_recognitionを用いて、議事録アプリを作成したい。

ikevo

総合スコア5

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/03/31 14:12

実現したいこと

tkinterを使って、googleのspeech_recognitionを使って、メモリ上にオブジェクト(インスタンス)を保存して、textに変換したい。ただ実行した場合、4秒くらい数行はテキスト化されるのですが、「プログラムは応答していません」となり、「pythonは応答していません」となります。再度ボタンを押して追記されるのですが、それも4秒ほどで止まります。原因をどのように見たらいいかがわかりません。また最初は(pyaudioで)wavファイルとして、SSDに保存して、60秒の録音ファイルをtextにすることが出来ました。その時に60秒の音声をテキスト化するのに10分ほどかかりました。

今回の主な失敗の要因として考えられるのは次のうち二つで、
①変数作成時に必要メモリが決まるため、割り当てられた後に増えていくaudioインスタンスが割り当てられたメモリ量を超えるから?(調べたらメモリは50byte程度作成されると書かれていましたが、自動で変更されるものではないのか?)
②処理に限界があり、どこかにデフォルトで設定してあるtimeoutの秒数を超えたから?
一応タスクマネージャーは見ていてcpuの使用率は70%ほどでした。

前提

私のパソコンのスペックはcpuがceleron 3865uで1.8ghz、2コア2スレッドと低いスペックです。
メモリは8ギガです。

該当のソースコード

import tkinter as tk import speech_recognition as sr # Create a new window root = tk.Tk() root.title("議事録アプリ") root.geometry("400x300") # Create a recognizer object r = sr.Recognizer() # Function to convert speech to text def speech_to_text(): with sr.Microphone() as source:#引数なしで既定のデバイスが使用されます # Adjust for ambient noise r.adjust_for_ambient_noise(source)#引数durationを設定するとnoise関係の時間設定できる # Listen for audio audio = r.listen(source)#audioこれ変数に持たしてるけどメモリに大容量保存できるのか? # Convert audio to text try: text = r.recognize_google(audio, language='ja-JP') return text except: return "認識できませんでした" # Function to close the window def close_window(): root.destroy() # Create a button to start speech-to-text conversion button = tk.Button(root, text="音声入力開始", command=lambda: text_box.insert(tk.END, speech_to_text() + "\n")) button.pack(pady=10) # Create a text box text_box = tk.Text(root, height=10, width=50) text_box.pack() # Create a button to close the window exit_button = tk.Button(root, text="終了", command=close_window) exit_button.pack() # Start the main loop root.mainloop()

試したこと、補足情報

それぞれの関数内を見てみたのですが、時間設定をしているのが一つだけでした。
この書き方で"音声入力開始"ボタン側に、終了時間を明示してないですが、
書き方的にはまずいことはわかっています。下手をすれば容量をいっぱい食い、圧迫するような書き方ですが、
本当は終了ボタンclose_windowで"音声入力開始"buttonを終了させたい予定です。
ご教授のほどをよろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

詳しいわけではありませんが、回答が付いていないようなので、少しは役に立つかと思って書いてみます。

このアプリでボタンを押したときにどのように音声認識が動作すると考えているのかよくわかりませんが、公式のドキュメントを確認すると、使っているlistenメソッドは、1回呼ぶと、ある程度以上の大きさの入力で開始して、ある入力が無くなる=静かになるか、時間が過ぎると結果を返すようになっています。

This is done by waiting until the audio has an energy above recognizer_instance.energy_threshold (the user has started speaking), and then recording until it encounters recognizer_instance.pause_threshold seconds of non-speaking or there is no more audio input. The ending silence is not included.

ということは、質問にあるとおり、ボタンを押すとある程度読み込んで止まるのは仕様通りの動作のように思います。

再度ボタンを押して追記されるのですが、それも4秒ほどで止まります

これも、仕様のとおりの動作だと思います。

ボタンを押すと、マイクから読み込んだ音声を読み込みながら次々に文字化するような動作をさせたいのだと思いますが、現状そのような動作をするようにはなっていません。
知識も無く調べてもいないのでわかりませんが、そのような動作をさせたいのであれあb、音声を取り込んで、ある程度のサイズに切り分けて、文字化して表示することになるのではないかと思います。そのとき、認識処理は別プロセスにする必要があるように思います。

投稿2023/04/01 12:17

TakaiY

総合スコア12765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問