音声認識に空耳英語は通じるのか

##はじめに

この記事は[リンク情報システム](https://www.lis.co.jp/)の「TechConnect! 2022年2月」のリレー記事です。
engineer.hanzomon のグループメンバによってリレーされます。
（リンク情報システムのFacebookは[こちら](https://ja-jp.facebook.com/lis.co.jp/)から）

TechConnect! 2022年2月のインデックスは[こちら](https://qiita.com/hs-lis/items/69eee14fd7bec92a854f)

2月3日の記事を担当しますshinmoです。よろしくお願いします。

------

この企画に参加するのも3回目なのですが、以前は[文字認識](https://qiita.com/shinmo/items/9fbb4f444f55c9b0d69a)や[顔認識](https://qiita.com/shinmo/items/5d990593b5acc51a413f)を試していました。
次は何を認識させるか…と思案していたのですが、今回は音声で行こうと思います。

##SpeechRecognitionについて
今回使用するライブラリSpeechRecognitionについて軽く説明すると、音声認識エンジンやAPIを利用して音声認識を行うライブラリです（ただし検証用に限る）。
[公式サイト](https://github.com/Uberi/speech_recognition)を読んだところだと下記をサポートしているのだとか。

```text
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は長らく更新されていないので、実は公式のものを使おうとしても対応していません。
なので[こちら](https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio)のサイトから対応したファイルをダウンロードしてPyAudioをインストールします。今回はPython 3.7.4、64bitのPCなので、PyAudio-0.2.11-cp37-cp37m-win_amd64.whlというファイル名のものをダウンロードしておきます。
ダウンロードしたら、コマンドプロンプトを開きそのファイルのあるディレクトリに移動して下記を実行。

```Text:コマンドプロンプト
pip install PyAudio-0.2.11-cp37-cp37m-win_amd64.whl
```

インストールできたかを確認するため、下記コマンドを実行します。

```Text:コマンドプロンプト
python -m speech_recognition
```

すると、下記が表示されるのでマイクに向かってしゃべります。特に言語指定していないからか、英語しか認識しません。

```Text:コマンドプロンプト
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!
```

##実装

下記の内容で実装してみます。

```Python:soramimi.py
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))
```

##実行

実行してみます。

```Text:実行結果
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で認識を試したので、次回があったら組み合わせてなにかできないか、もしくは別の何かを認識させるかになりそうですね。