Raspberry Piで対話した

ドコモの音声認識APIと雑談対話APIを使って雑談することにしました。
なお、インターネット上の情報では簡単にできると謳っていましたが簡単ではありませんでした。
理由は手元にあるマイクのサンプリング周波数が指定できなかった為です。
サンプリング周波数を指定できなければ音声認識APIが使用できません。
なので一旦マイクで録音して録音ファイルを作成後、エンコードして音声認識APIにぶん投げることでテキスト化に成功しました。

規格外のマイクでも実現可能です。諦めないでください。

また、インターネット上の情報では会話が続かないコードでした。
雑談対話APIでは「コンテキストID」が鍵になります。
雑談対話APIで対話を開始すると「コンテキストID」が自動生成されるので、それを次の会話と同時送信することで会話が続くようになります。
他を参考にして実現させました。

「コンテキストID」の送信に成功すると「しりとり」が可能になります。 お試しください。

# -*- coding: utf-8 -*-
import os
import time
import requests
import json

os.system('mpg321 zatudankaishi.mp3')

os.system('AUDIODEV=hw:0 rec -c 1 -r 16k maikunokikakuuzee.wav trim 0 5')
os.system('mpg321 zatudankaishi.mp3')
os.system('mpg321 zatudankaishi.mp3')
#これでできます
os.system('sox maikunokikakuuzee.wav test.wav channels 1 rate 16k')
time.sleep(1)

docomo_api_key = 'xxxxx'

path = '/home/pi/test.wav'
url = 'https://api.apigw.smt.docomo.ne.jp/amiVoice/v1/recognize?APIKEY={}'.format(docomo_api_key)
files = {'a': open(path, 'rb'), 'v':'on'}
r = requests.post(url, files = files)
message = r.json()['text']
print message

endpoint = 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=REGISTER_KEY'
url = endpoint.replace('REGISTER_KEY', docomo_api_key)
utt_content = message
payload = {'utt': utt_content, 'context': ''}
headers = {'Content-type': 'application/json'}
r = requests.post(url, data = json.dumps(payload), headers = headers)
data = r.json()
response = data['utt']
context_get = data['context']

print response
print context_get

os.system('/home/pi/aquestalkpi/AquesTalkPi " '+ response.encode('utf-8') +' " | aplay -Dhw:1,0')

while True:
    time.sleep(1)
    os.system('mpg321 zatudankaishi.mp3')
    
    os.system('AUDIODEV=hw:0 rec -c 1 -r 16k maikunokikakuuzee.wav trim 0 5')
    os.system('mpg321 zatudankaishi.mp3')
    os.system('mpg321 zatudankaishi.mp3')
    os.system('sox maikunokikakuuzee.wav test.wav channels 1 rate 16k')
    time.sleep(1)
    
    path = '/home/pi/test.wav'
    url = 'https://api.apigw.smt.docomo.ne.jp/amiVoice/v1/recognize?APIKEY={}'.format(docomo_api_key)
    files = {'a': open(path, 'rb'), 'v':'on'}
    r = requests.post(url, files = files)
    message = r.json()['text']
    print message

    endpoint = 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=REGISTER_KEY'
    url = endpoint.replace('REGISTER_KEY', docomo_api_key)

    utt_content = message

    payload = {'utt': utt_content, 'context': context_get}
    headers = {'Content-type': 'application/json'}

    r = requests.post(url, data = json.dumps(payload), headers = headers)
    data = r.json()
    
    response = data['utt']
    context = data['context']
    
    print response
    print context

    os.system('/home/pi/aquestalkpi/AquesTalkPi " '+ response.encode('utf-8') +' " | aplay -Dhw:1,0')

ラズパイでは工夫すればAIスピーカーのようなことができます。
また、赤外線リモコンと組み合わせると面白いことができそうです。

衛星チューナはPCなので、それは面白そうですが行おうとする思いは今の所ありません。