ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【python】MacOSでdocomo音声認識APIを使ってみる

 音声認識をやってみたいなーと思って色々調べたところ、簡単に登録できてかつ無料なAPIであるdocomo音声認識APIというものを見つけました。

dev.smt.docomo.ne.jp

 今回はこのdocomo音声認識APIの登録からMacOSでのpythonを使った簡単なサンプルまでを紹介します。


1:docomoDeveloperSupportのアカウントを作成する
 以下のdocomoDeveloperSupportの新規登録からアカウントを作成します。メールアドレスとパスワードを入力し、返信されたメールにあるリンクをクリックするだけで登録は完了します。
dev.smt.docomo.ne.jp


2:APIの使用申請を行う
dev.smt.docomo.ne.jp

 上記サイトにある「申請する」ボタンをクリックします。

 手順は以下に示すブログ様の「API利用登録」の部分を参考に行ってください。

uepon.hatenadiary.com

 申請が完了するとメールが送られてくるので、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日々の備忘録