pocketsphinxを使用したPythonでの音声認識または音声アシスタントの作成方法

これは、Pythonでpocketsphinxライブラリを使用するためのチュートリアルです。 彼があなたを助けることを願っています

私のレーキを踏むのではなく、このライブラリをすばやく処理します。







それはすべて、私が自分をPythonの音声アシスタントにしたかったという事実から始まりました。 最初は、 speech_recognitionライブラリを認識に使用することが決定されました 。 結局のところ、私は私だけではありません 。 認識には、キー、パスワードなどを必要としない唯一のものであるため、Google Speech Recognitionを使用しました。 音声合成のために、gTTSが採用されました。 一般的に、それはこのアシスタントのほとんどのクローンであることが判明しました。そのため、私は落ち着きませんでした。







確かに、私はこれだけでなく、答えを待つことができませんでした:回答は長時間待たなければなりませんでした(録音がすぐに終了せず、認識のために音声を送信し、合成のためのテキストを送信するのに時間がかかりました)。 、はっきりと話す必要がありました。Googleが合成した音声はひどい音でした。アクティベーションフレーズはありませんでした。つまり、音は常に録音され、サーバーに送信されました。







最初の改善点は、yandexのスピーチキットクラウドを使用した音声合成でした:







URL = 'https://tts.voicetech.yandex.net/generate?text='+text+'&format=wav&lang=ru-RU&speaker=ermil&key='+key+'&speed=1&emotion=good' response=requests.get(URL) if response.status_code==200: with open(speech_file_name,'wb') as file: file.write(response.content)
      
      





次に、認識キューが来ました。 私はすぐに、ライブラリページの碑文「CMU Sphinx(オフラインで動作します)」に興味を持ちました。 ポケットスフィンクスの基本概念については話さない 私の前に、 chubakurこの投稿でこれを行いました(多くの人に感謝します)。







Pocketsphinxをインストールする



pocketsphinxをインストールするのは簡単ではない(少なくとも成功しなかった)ため、 pip install pocketsphinx



は機能せず、失敗し、車輪に宣誓します。
pipを介したインストールは、swigがインストールされている場合にのみ機能します。 それ以外の場合、pocketsphinxをインストールするには、 ここに移動してインストーラー(msi)をダウンロードする必要があります。 注:インストーラーはバージョン3.5専用です!







pocketsphinxによる音声認識



Pocketsphinxは、マイクとファイルの両方からの音声を認識できます。 彼はまた、ホットフレーズを検索することもできます(私は実際に成功しませんでした。何らかの理由で、ホットワードが見つかったときに実行されるコードが数回実行されますが、私はそれを発音しました)。 Pocketsphinxはクラウドソリューションとは異なり、オフラインで動作し、限られた辞書で動作するため、精度が向上します。 興味がある場合は、ライブラリページに例があります 。 「デフォルト設定」項目に注意してください。







ロシア語と音響モデル



最初、pocketsphinxには英語と音響モデルと辞書が付属しています。 このリンクからロシア語をダウンロードできます。 アーカイブを解凍する必要があります。 次に、 <your_folder>/zero_ru_cont_8k_v3/zero_ru.cd_cont_4000



フォルダーをC:/Users/tutam/AppData/Local/Programs/Python/Python35-32/Lib/site-packages/pocketsphinx/model



に移動する必要がありますC:/Users/tutam/AppData/Local/Programs/Python/Python35-32/Lib/site-packages/pocketsphinx/model



folder、ここで<your_folder>



C:/Users/tutam/AppData/Local/Programs/Python/Python35-32/Lib/site-packages/pocketsphinx/model



<your_folder>



はフォルダーですアーカイブを解凍した場所。 移動したフォルダーは音響モデルです。 同じ手順を、フォルダー<your_folder>/zero_ru_cont_8k_v3/



のファイルru.lm



およびru.dic



で実行する必要があります。 ファイルru.lm



は言語モデルであり、 ru.dic



は辞書です。 すべてを正しく行った場合、次のコードが機能するはずです。







 import os from pocketsphinx import LiveSpeech, get_model_path model_path = get_model_path() speech = LiveSpeech( verbose=False, sampling_rate=16000, buffer_size=2048, no_search=False, full_utt=False, hmm=os.path.join(model_path, 'zero_ru.cd_cont_4000'), lm=os.path.join(model_path, 'ru.lm'), dic=os.path.join(model_path, 'ru.dic') ) print("Say something!") for phrase in speech: print(phrase)
      
      





まず、マイクが接続され動作していることを確認します。 Say something!



-これは正常です。 この時間のほとんどはLiveSpeech



インスタンスの作成に費やされます。これは、ロシア語のモデルの重量が500(!)Mbを超えるため、長い間作成されています。 約2分で作成されたLiveSpeech



インスタンスがあります。







このコードは、あなたが発したほとんどすべてのフレーズを認識するはずです。 同意します、精度は嫌です。 しかし、それは修正することができます。 また、 LiveSpeech



の作成速度を上げることもできます。







Jsgf



言語モデルの代わりに、簡素化された文法でpocketsphinxを動作させることができます。 これを行うには、 jsgf



ファイルを使用します。 その使用により、 LiveSpeech



インスタンスの作成が高速化されます。 文法ファイルの作成方法はここに書かれています 。 言語モデルがある場合、 jsgf



ファイルは無視されるため、独自の文法ファイルを使用する場合は、次のように記述する必要があります。







 speech = LiveSpeech( verbose=False, sampling_rate=16000, buffer_size=2048, no_search=False, full_utt=False, hmm=os.path.join(model_path, 'zero_ru.cd_cont_4000'), lm=False, jsgf=os.path.join(model_path, 'grammar.jsgf'), dic=os.path.join(model_path, 'ru.dic') )
      
      





当然、文法ファイルはフォルダーC:/Users/tutam/AppData/Local/Programs/Python/Python35-32/Lib/site-packages/pocketsphinx/model



作成する必要があります。 そしてもう1つ: jsgf



使用するときは、より明確に別々の単語を話す必要があります。







独自の辞書を作成する



辞書は一連の単語とその文字起こしであり、それが小さいほど認識精度が高くなります。 ロシア語の単語を含む辞書を作成するには、 ru4sphinxプロジェクトを使用する必要があります。 ダウンロード、解凍します。 次に、ノートブックを開き、辞書にある単語をそれぞれ新しい行でmy_dictionary.txt



、ファイルをmy_dictionary.txt



としてtext2dict



フォルダーにUTF-8エンコードで保存します。 次に、コンソールを開いて次のように記述します: C:\Users\tutam\Downloads\ru4sphinx-master\ru4sphinx-master\text2dict> perl dict2transcript.pl my_dictionary.txt my_dictionary_out.txt



my_dictionary_out.txt



開き、内容をコピーします。 メモ帳を開き、コピーしたテキストを貼り付けて、ファイルをUTF-8エンコードでmy_dict.dic



(「テキストファイル」ではなく「すべてのファイル」を選択)として保存します。







 speech = LiveSpeech( verbose=False, sampling_rate=16000, buffer_size=2048, no_search=False, full_utt=False, hmm=os.path.join(model_path, 'zero_ru.cd_cont_4000'), lm=os.path.join(model_path, 'ru.lm'), dic=os.path.join(model_path, 'my_dict.dic') )
      
      





いくつかの文字起こしを調整する必要があるかもしれません。







speech_recognitionを介してpocketsphinxを使用する



speech_recognitionを介してpocketsphinxを使用するのは、英語の音声を認識する場合にのみ意味があります。 speech_recognitionでは、空の言語モデルを指定してjsgfを使用することはできないため、各フラグメントを認識するのに2分かかります。 確認済み。







まとめ



いくつかの夜を捨てて、時間を無駄にしていることに気づきました。 2語の辞書(yesおよびno)では、スフィンクスは間違いを犯すことがよくあります。 セレロンの30〜40%は食べ尽くし、言語モデルでは大胆な記憶もあります。 また、Yandexはほとんどすべての音声を正確に認識しますが、メモリとプロセッサを消費しません。 だから、それをやる価値があるかどうか、自分で考えてみてください。







PS :これは私の最初の投稿なので、記事のデザインと内容に関するアドバイスを待っています。








All Articles