4. Amazon Alexa에서 Heroku의 Rails로 연결

연재 기사



전후 관계가 있기 때문에 차례로 읽을 수 있으면 알기 쉬워지고 있습니다.

1. Amazon Alexa와 Fire TV에서 Hello World를 사용해보십시오 - Qiita
2. Amazon Alexa에서 음성에서 인수 받기 - Qiita
3. Amazon Alexa의 Custom Slot Types 설정 - Qiita
4. Amazon Alexa에서 Heroku의 Rails로 연결 - Qiita
5. Amazon Alexa에서 대화 계속하기 (세션 인계) - Qiita
6. Amazon Alexa 기술을 일본어로 만들기 - Qiita
7. 자작한 일본어의 Alexa Skill을 Echo dot로 움직이기 - Qiita

소개



지금까지의 기사에서는 「FireTV <=> Alexa <=> Lambda」의 서버리스라고 하는 구성으로 만들어 왔습니다.
평소에는 Ruby on Rails에서 개발하고 있기 때문에 이번에는 Lambda를 Heroku + Ruby on Rails로 전환하는 방법을 시도해 보겠습니다.
구성은 아래와 같은 "FireTV <=> Alexa <=> Heroku (Ruby on Rails)"입니다.


이 구성으로 이전까지 만든 Hello world의 간단한 샘플을 구현합니다.

Amazon Alexa의 Custom Slot Types 설정 - Qiita

Rails 측 라우팅



FireTV에서 받은 음성은 Alexa를 통해 POST로 전송됩니다.
그래서 라우팅은 아래와 같이 했습니다.
POST    /talks  talks#create

#config/routes.rb
Rails.application.routes.draw do
  resources :talks, only: %i(create)
end


#app/controllers/tasks_controller.rb
class TalksController < ApplicationController
  protect_from_forgery with: :null_session

  # POST /talks
  def create
    Rails.logger.info params
  end
end


이제 Alexa에서 보낸 데이터를 받을 수 있습니다.
이 프로그램을 Heroku에 올려 둡시다.

Alexa 측의 Endpoint 변경



그런 다음 Alexa의 Endpoint를 Lambda에서 Heroku로 변경합니다.

구성 항목의 끝점을 HTTPS로 변경합니다.
Default 곳에 Heroku에서 받을 수 있는 URL을 설정합니다.
이번 예라면 https://xxx.herokuapp.com/talks 라고 합니다.



SSL Certificate 항목의 Certificate for DEFAULT Endpoint를 "My development endpoint is a sub-domain ~"으로 변경합니다.
Alexa측의 설정은 이상입니다.



Heroku에서 Alexa의 POST 확인



Alexa에서 POST 되는 파라미터를 Heroku에서 확인해 봅시다.
Alexa로부터의 액세스를 확인할 수 없는 경우에는 SSL Certificate나 Endpoint의 설정이 올바르지 않을 가능성이 있습니다.

#access.log
# ログは一部加工しています。
Oct 2 21:04:42 app[web] INFO I, [2017-10-02T12:04:42.871451 #6]  INFO -- : Started POST "/talks" for xxx.xxx.xxx.xxx at 2017-10-02 12:04:42 +0000
Oct 2 21:04:42 app[web] INFO I, [2017-10-02T12:04:42.872727 #6]  INFO -- : Processing by TalksController#create as JSON
Oct 2 21:04:42 app[web] INFO I, [2017-10-02T12:04:42.872906 #6]  INFO -- : Parameters: {"version"=>"1.0"...

Rails에서 응답을 반환



Rails는 alexa-rubykit라는 gem을 넣어 처리합니다.

damianFC/alexa-rubykit: Amazon Echo Alexa's App Kit Ruby Implementation
gem 'alexa_rubykit'

후에는 컨트롤러에서 받은 요청에서 이름을 꺼내 응답으로 반환하면 완성됩니다.
FireTV를 향해 말을 걸면 올바른 음성이 돌아올 것입니다.

자신 "tell Hello world hello my name is Tarou."
FireTV 「Hello world! Tarou.」

#app/controllers/talks_controller.rb
class TalksController < ApplicationController
  protect_from_forgery with: :null_session

  # POST /talks
  def create
    request = AlexaRubykit::build_request(params)
    response = AlexaRubykit::Response.new
    response.add_speech("Hello world! #{request.slots[:firstName][:value]}")
    render json: response.build_response
  end
end

요약



이것으로 기존의 서비스가 가동하고 있는 경우에서도 Alexa와 제휴할 수 있게 되었기 때문에 보다 유연한 개발을 할 수 있다.

Let's enjoy Alexa.

좋은 웹페이지 즐겨찾기