ゆかりさんと雑談する
このブログは↓のアドベントカレンダーの14日目の記事です.
なんだかんだ折り返してあと半分なので頑張っていきたいと思います.
今週の月曜日のアドベントカレンダーの記事に↓のようなものがありました.
ゆかりさんと対話することで寂しさを紛らわせたいよねってことで,僕はゆかりさんと雑談することに決めました.
ゆかりさんと雑談する
使用するもの
docomoのapiを2つ利用します. dev.smt.docomo.ne.jp dev.smt.docomo.ne.jp
実装
実装としてはコンソールで入力した文字を雑談apiに投げて,その返答をゆかりさんに喋らせてます. ゆかりさんが喋る部分のコードはごーなんちゃらさんのコードを参考にしてます.
require 'uri' require 'openssl' require 'net/http' require 'json' APIKEY = 'YOUR_APIKEY' speach_uri = URI.parse("https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech?APIKEY=#{APIKEY}") speach_http = Net::HTTP.new(speach_uri.host, speach_uri.port) speach_http.use_ssl = true chat_uri = URI.parse("https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=#{APIKEY}") chat_http = Net::HTTP.new(chat_uri.host, chat_uri.port) chat_http.use_ssl = true chat_body = {} loop do chat_body['utt'] = gets chat_request = Net::HTTP::Post.new(chat_uri.request_uri, {'Content-Type' =>'application/json'}) chat_request.body = chat_body.to_json chat_response = nil chat_http.start do |h| resp = h.request(chat_request) chat_response = JSON.parse(resp.body) end chat_body['context'] = chat_response['context'] chat_body['mode'] = chat_response['mode'] speach_request = Net::HTTP::Post.new(speach_uri.request_uri, {'Content-Type': 'application/ssml+xml','Accept': 'audio/L16'}) speach_request.body = "<?xml version='1.0' encoding='utf-8' ?> <speak version='1.1'> <voice name='sumire'> #{chat_response['utt']} </voice> </speak> " speach_response = nil speach_http.start do |h| resp = h.request(speach_request) speach_response = resp.body end File.open("tmp.raw", "w") do |f| f.puts(speach_response) end system('sox -t raw -r 16k -e signed -b 16 -B -c 1 tmp.raw output.wav') system('afplay output.wav') end
いい感じに対話してるのを撮りたかったのですが,いい感じに録画する方法がなかったのでとりあえずコードだけ貼っておきます.
しりとりとかもできるので,ゆかりさんとの楽しい雑談で暇な時間をつぶせます.
APIの登録ちょっとめんどくさいですが,いろいろ試して遊べるので是非試してみてください.
明日はかのんくんです,