Ruby on RailsでAlexa スキルを開発するハンズオンを実施しました

いつもロリポップ!マネージドクラウドをご利用いただき、誠にありがとうございます!

こんにちは、エンジニアの@sunecosuri です。

先日、Fukuoka Growth Nextにてマネージドクラウドを使ってAlexaスキルを開発しようというハンズオンを実施しましたのでこちらにて公開いたします。

また以下の手順に沿ったスライドも公開しておりますのでもしよろしければあわせて御覧ください。

前提条件
・ ruby 2.5.1以上がインストール済み
・ gem install railsが完了している
・ Slackチームに参加している
・ マネージドクラウドにクレジットカードが登録済みである
・ プロジェクトに公開鍵が登録済みである
・ Amazon developerに登録済みである

Railsアプリの作成
以下のコマンドを実行します

$ rails new alexa-lolipop-weather --api

Gemを登録する
 
- Gemfile
alexa-lolipop-weather のディレクトリに移動してGemfileに以下の2行を追記します

...
gem 'alexa_rubykit'
gem 'weather-report'
...

ルーティングの登録
 - config/routes.rb

Rails.application.routes.draw do
 resources :weather, only: %i(create)
end

コントローラーの作成
以下のコマンドを実行してコントローラーの雛形を作成します

$ rails generate controller Weather 

メソッドを書き換える(簡単な応答)
- app/controllers/weather_controller.rb


 def create
   request = AlexaRubykit::build_request(params)
   response = AlexaRubykit::Response.new
   response.add_speech("こんにちは")
   render json: response.build_response
 end

マネージドクラウドにプッシュする
- コンパネからリモートリポジトリの情報を取得して設定する

この時点で、Alexa にある開発コンソールのテストシミュレータで確認することができます。

インテントを利用して、引数を受け取る
- app/controllers/weather_controller.rb

def create
 request = AlexaRubykit::build_request(params)
 response = AlexaRubykit::Response.new
 # インテントからcityの文字列を受け取る
 city = request.slots[:city][:value]
 response.add_speech("#{city}を受け取りました")
 render json: response.build_response
end 

create メソッドを上書き保存し、マネージドクラウドにプッシュします。
もう一度テストシミュレータで確認してみましょう。
以下のように○○を受け取りましたと返ってくれば成功です。

WetherReportのAPIを利用して天気を答える
- app/controllers/weather_controller.rb

def create
 request = AlexaRubykit::build_request(params)
 response = AlexaRubykit::Response.new
 # インテントからcityの文字列を受け取る
 city = request.slots[:city][:value]
 
 # cityの文字列からWeatherReportのID形式の値を取得する 
 id = WeatherReport::Weather.request_cityid(city)
 
 # IDが取得できたら、明日の天気を調べて応答する
 if id
   weather = WeatherReport::Weather.new(id)
   weather.tomorrow.date
   response.add_speech("#{city}の明日の天気は#{weather.tomorrow.telop}です。")
 else
   response.add_speech("#{city}の天気が調べられませんでした")
 end 
 render json: response.build_response
end

再度create メソッドを上書き保存してマネージドクラウドにプッシュしましょう。

最終的には「Alexa、ロリポップで福岡の天気を教えて」というと明日の天気を教えてくれるようになります。

インテントの仕組みがわかると、スキルを開発することができると思います。応用が効くので夢が広がりますね!ぜひ興味の有る方は試してみてください!