音声アシスタント開発ブログ

音声アシスタントを作りながら得た知見を共有していく予定(未定)

Docomo発話理解APIをRubyで使ってみた

発表をされてからは随分と月日が流れてはおりますが、

卒業研究の内容と非常に関わりがあったため、Docomoが提供する「知識理解API」を試しました。Rubyで動かしてみた記事は見当たらなかったため(既にあったらすみません)、ご紹介します。



dev.smt.docomo.ne.jp

知識理解APIはユーザのテキスト(発言)を投げると、ユーザが発した発言の意図を判断し、それに見合った機能名や値を返却するAPIです。

例えば、

つくば駅から渋谷までの乗り換え案内」という文字列を渡すと次のような結果が得られます。(実際はjson出力です。)

                                                    • -

発言:つくば駅から渋谷駅の乗り換え案内
分かち書き:["つくば駅", "から", "渋谷駅", "の", "乗り換え", "案内"]
位置情報:
コマンド:乗換案内
スロット名:stationTo
スロット値:渋谷駅
スロット名:stationFrom
スロット値:つくば駅

                                                    • -

コマンド → 対応する機能
スロット → 対応する機能に用いる情報

得られたコマンドは、他の関数と対応づけるなどして活用ができます。

音声アシスタントアプリのようにユーザの発言から様々な機能を呼び出せるサービスが代表的ですが、他にもかなり幅広い応用が可能だと思います。

得られるコマンドはこちらに詳細が記述されています。

# coding: utf-8
require 'net/http'
require 'uri'
require 'json'

#取得したAPIキー
API_KEY = 'hoge'

URL = "https://api.apigw.smt.docomo.ne.jp/sentenceUnderstanding/v1/task?APIKEY=#{API_KEY}"
uri = URI.parse(URL)

https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
req = Net::HTTP::Post.new(uri.request_uri)
query = gets.chomp!
#リクエストヘッダー
req["Content-Type"] = "application/x-www-form-urlencoded"
#リクエストボディ(JSON形式です)
param = {
     "projectKey" => "OSU",
     "appInfo" => {"appName" => "hoge_app", "appKey" => "hoge_appkey"},
     "clientVer" => "1.0.0",
     "dialogMode" => "off",
     "language" => "ja",
     "userId" => "12 123456 123456 0",
     "location" => {"lat"=> "139.766084","lon"=>"35.681382"},
     "userUtterance" => {"utteranceText" => "#{query}"}
}.to_json

req.body = param
res = https.request(req)
res_parse = JSON.parse(res.body)


#出力
print("発言:",res_parse["userUtterance"]["utteranceText"],"\n")
print("分かち書き:",res_parse["userUtterance"]["utteranceWord"],"\n")
print("位置情報:",res_parse["location"],"\n")
print("コマンド:",res_parse["dialogStatus"]["command"]["commandName"],"\n")
if(res_parse["dialogStatus"]["slotStatus"]!=nil)
	res_parse["dialogStatus"]["slotStatus"].each do |youso|
  		print("スロット名:",youso["slotName"],"\n")
  		print("スロット値:",youso["slotValue"],"\n")
	end
end