##はじめに
この記事はリンク情報システムの「TechConnect! 2022年2月」のリレー記事です。
engineer.hanzomon のグループメンバによってリレーされます。
(リンク情報システムのFacebookはこちらから)
TechConnect! 2022年2月のインデックスはこちら
2月3日の記事を担当しますshinmoです。よろしくお願いします。
この企画に参加するのも3回目なのですが、以前は文字認識や顔認識を試していました。
次は何を認識させるか…と思案していたのですが、今回は音声で行こうと思います。
##SpeechRecognitionについて
今回使用するライブラリSpeechRecognitionについて軽く説明すると、音声認識エンジンやAPIを利用して音声認識を行うライブラリです(ただし検証用に限る)。
公式サイトを読んだところだと下記をサポートしているのだとか。
CMU Sphinx (works offline)
Google Speech Recognition
Google Cloud Speech API
Wit.ai
Microsoft Azure Speech
Microsoft Bing Voice Recognition (Deprecated)
Houndify API
IBM Speech to Text
Snowboy Hotword Detection (works offline)
とはいっても、無料で利用できて、かつ日本語対応しているのはGoogle Speech Recognition か Wit.ai くらいらしいので、今回はGoogle Speech Recognition を使用します。
##準備
今回使う環境とライブラリは以下です。
Python 3.7.4
PyAudio
PyAudioは長らく更新されていないので、実は公式のものを使おうとしても対応していません。
なのでこちらのサイトから対応したファイルをダウンロードしてPyAudioをインストールします。今回はPython 3.7.4、64bitのPCなので、PyAudio-0.2.11-cp37-cp37m-win_amd64.whlというファイル名のものをダウンロードしておきます。
ダウンロードしたら、コマンドプロンプトを開きそのファイルのあるディレクトリに移動して下記を実行。
pip install PyAudio-0.2.11-cp37-cp37m-win_amd64.whl
インストールできたかを確認するため、下記コマンドを実行します。
python -m speech_recognition
すると、下記が表示されるのでマイクに向かってしゃべります。特に言語指定していないからか、英語しか認識しません。
A moment of silence, please...
Set minimum energy threshold to 482.92843982052875
Say something!
Got it! Now to recognize it...
You said konnichiwa
Say something!
Got it! Now to recognize it...
You said hello
Say something!
##実装
下記の内容で実装してみます。
import speech_recognition as sr
recognizer = sr.Recognizer()
mic = sr.Microphone()
while True:
print("喋ってください:")
with mic as source:
recognizer.adjust_for_ambient_noise(source) #環境音とかを校正する設定
audio = recognizer.listen(source)
try:
print ("認識中...")
#発声した内容を英語で認識させる
print(recognizer.recognize_google(audio, language='en-GB'))
#発声した内容を日本語で認識させる
print(recognizer.recognize_google(audio, language='ja-JP'))
if recognizer.recognize_google(audio, language='ja-JP') == "中断" :
#音声でも終了できるようにしておく
print("終了します")
break
# エラー
except sr.UnknownValueError:
print("認識できません")
except sr.RequestError as e:
print("リクエストエラー:{0}".format(e))
##実行
実行してみます。
python soramimi.py
喋ってください:
認識中...
what time is it now
掘った芋いじるな
喋ってください:
認識中...
I'll get off
揚げ豆腐
喋ってください:
認識中
taken
鉄拳
喋ってください:
認識中...
chicken
鉄拳
喋ってください:
認識中...
you know me
湯のみ
喋ってください:
認識中...
sing a song
寝具 破損
喋ってください:
認識中...
Philadelphia
古道具屋
喋ってください:
認識中...
how much
ハマチ
喋ってください:
認識中...
Trudeau
中断
終了します
意外と認識してくれました。
1回目の「鉄拳」は「taken」になっていますが、発音を「chicken」に近づけたら認識しました。
また、「Philadelphia」:「古道具屋」は本当は「古豆腐屋」と声に出していたので、筆者の滑舌が単によくなかったのでしょう。
##終わりに
ネイティブな人にも通じる、というのが以前にテレビ番組でも検証されているだけあるのか、認識が通りました。
本当はもう少し音声認識でライブラリとかが変更出来たりとかないかなと調べていたのですが、今回のはなさそうでした。別のやり方で認識させるならあるのかもしれません。
前々回、前回、今回とPythonで認識を試したので、次回があったら組み合わせてなにかできないか、もしくは別の何かを認識させるかになりそうですね。