音声認識をやってみたいなーと思って色々調べたところ、簡単に登録できてかつ無料なAPIであるdocomoの音声認識APIというものを見つけました。
今回はこのdocomo音声認識APIの登録からMacOSでのpythonを使った簡単なサンプルまでを紹介します。
1:docomoDeveloperSupportのアカウントを作成する
以下のdocomoDeveloperSupportの新規登録からアカウントを作成します。メールアドレスとパスワードを入力し、返信されたメールにあるリンクをクリックするだけで登録は完了します。
dev.smt.docomo.ne.jp
2:APIの使用申請を行う
dev.smt.docomo.ne.jp
上記サイトにある「申請する」ボタンをクリックします。
手順は以下に示すブログ様の「API利用登録」の部分を参考に行ってください。
申請が完了するとメールが送られてくるので、docomoDeveloperSupportのマイページから払い出されたAPIキーを確認することができます。
3:homebrewをインストールする
ターミナルを立ち上げ、以下のサイトにあるコマンドを入力してHomebrewをインストールします。
(※インストール中に「HEAD is now ...」と出た後は10分ほど何も出ませんが、待ち続けます)
Homebrew — macOS 用パッケージマネージャー
以下のように表示されていればHomebrewのインストールは完了です。
==> Installation successful! ==> Homebrew has enabled anonymous aggregate user behaviour analytics. Read the analytics documentation (and how to opt-out) here: https://docs.brew.sh/Analytics.html ==> Next steps: - Run `brew help` to get started - Further documentation: https://docs.brew.sh
4:portaudioをインストールする
以下のコマンドを実行します。(少し時間がかかります)
$ brew install portaudio
15分ほど放置しても一向にインストールが進まないという場合は、3のHomebrewのインストールを行ってHomebrewを最新にしてから実行してみてください。
5:pyaudioをインストールする
以下のコマンドを実行します。(少し時間がかかります)
$ pip install pyaudio
実行した際に「Failed building wheel for pyaudio」というエラーが表示された場合は、以下のコマンドを実行します。
$ sudo env LDFLAGS="-L/usr/local/lib" CFLAGS="-I/usr/local/include" pip install pyaudio
これで必要なライブラリのインストールは完了です。
6:docomo音声認識APIを使用する
Python 3.5.2でのプログラムです。バージョンが違うと動かない場合もあるので注意してください。
・docomoAPI.py
import requests import pyaudio import sys import time import wave chunk = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 16000 # サンプリングレート、マイク性能に依存 RECORD_FILE_PATH = 'voice.wav' # 音声ファイルパス RECORD_SECONDS = 5 # 録音時間 print ('Please speak! >>>') # pyaudio p = pyaudio.PyAudio() # マイク0番を設定 input_device_index = 0 # マイクからデータ取得 stream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True, frames_per_buffer = chunk) all = [] cnt = RECORD_SECONDS oneTime = int(RATE / chunk) for i in range(0, oneTime * int(RECORD_SECONDS)): if i % oneTime == 0: print(cnt) cnt = cnt - 1 data = stream.read(chunk) all.append(data) stream.close() data = b''.join(all) out = wave.open(RECORD_FILE_PATH,'w') out.setnchannels(1) #mono out.setsampwidth(2) #16bits out.setframerate(RATE) out.writeframes(data) out.close() p.terminate() print ('<<< Record end') # docomoの音声認識APIに音声ファイルを渡してJSONの結果を受け取る APIKEY = '[APIキー]' url = "https://api.apigw.smt.docomo.ne.jp/amiVoice/v1/recognize?APIKEY={}".format(APIKEY) files = {"a": open(RECORD_FILE_PATH, 'rb'), "v":"on"} r = requests.post(url, files=files) print(r.json()['text'])
上記ファイルを実行すると5秒間録音が行われます。録音された音声ファイルをdocomo音声認識APIに渡し、JSONとして受け取った結果を表示させています。
以上が今回やってみた音声認識です。portaudioのインストールに苦戦したり、参考にさせていただいたプログラムをそのまま実行するとエラーになったりと色々ありましたが、音声認識への第一歩ができました。
ESP32でも音声認識できるようにしたいなぁ、とかも考えています。
・参考資料
・macOSにpyaudioをインストールする - Qiita
・RaspberryPiのマイクで録音した音声をテキスト化する【ヒミツのクマちゃん その3】 - uepon日々の備忘録