6. Amazon Alexa のスキルを日本語化する


連載記事

前後関係があるため順番に読んでもらえると分かりやすくなっています。

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

はじめに

先日ついにEchoの国内発売が発表されました。

Amazon | Echo Dot - スマートスピーカー

それに伴いAlexaアプリも日本語化が可能となりました。
ということで前回まで作ったHello worldを日本語化したいと思います。

Amazon Alexaで会話を続ける(セッションを引き継ぐ) - Qiita

スキルを日本語化する

まずは開発者ポータルから日本語化したスキルを選択します。

アマゾン アプリ 開発者ポータル

次にスキル情報を日本語化します。
上のタブから「新しい言語を追加」を選んでJapaneseを追加します。
スキル名、呼び出し名を「こんにちは」に変更します。
アプリの呼び出し名もちゃんと日本語対応していますね。

次に対話モデルを日本語化します。
インテントスキーマは英語と同じものを入力します。

{
  "intents": [
    {
      "intent": "AMAZON.CancelIntent"
    },
    {
      "intent": "AMAZON.HelpIntent"
    },
    {
      "intent": "AMAZON.StopIntent"
    },
    {
      "slots": [
        {
          "name": "firstName",
          "type": "JP_FIRST_NAME"
        }
      ],
      "intent": "HelloWorldIntent"
    },
    {
      "intent": "HowAreYouIntent"
    }
  ]
}

カスタムスロットタイプもJP_FIRST_NAMEとして適当な値を入力します。
僕は「太郎」「花子」として登録しました。

Amazon AlexaのCustom Slot Typesを設定する - Qiita

実は国内発売に伴いAmazonが準備した日本人の名前に対応したビルトインスロットが追加されました。

スロットタイプリファレンス | Custom Skills

これを利用すればより多くの名前に対応することが可能です。
今回は話をシンプルにするために、英語版をそのまま日本語化することにします。

最後にサンプル発話を設定します。

HelloWorldIntent こんにちは私の名前は {firstName} です
HowAreYouIntent 良いよ

注意点
スロットが入る{firstName}の前後に半角のスペースが必要です。

返答側のRailsを日本語化する

次にAlexaからのリクエストに対して、Rails側で日本語で返答するように修正します。
Alexaのリクエストには言語を判定するlocaleがあるのでこれを使って言語を判定するのが良さそうです。
最終的なRails側のコードは下記の通りです。
localeで言語の判定を行って返答するメッセージを分岐しています。

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

  def create
    request = AlexaRubykit::build_request(params)
    response = AlexaRubykit::Response.new
    session_end = true
    case request.name
      when 'HelloWorldIntent'
        first_name = request.slots[:firstName][:value]
        message = if request.locale == 'ja-JP'
                    "こんにちは#{first_name}さん。ご機嫌いかがですか?"
                  else
                    "Hello world! #{first_name}. How are you?"
                  end
        response.add_speech(message)
        response.add_session_attribute :first_name, first_name
        session_end = false
      when 'HowAreYouIntent'
        first_name = request.session.attributes[:first_name]
        message = if request.locale == 'ja-JP'
                    "いいですね!#{first_name}さん。"
                  else
                    "That's good, #{first_name}."
                  end
        response.add_speech(message)
    end
    render json: response.build_response(session_end)
  end
end

Alexaから日本語で発話してみる

実は、FireTVはまだ日本語でのAlexaメニューが存在していません。
来週のEchoの配送まではAlexaアプリからしか確認することができなさそうです。
「テスト」から発話のところに「こんにちは私の名前は太郎です」と入力して「こんにちはを呼び出す」を押すと右下に日本語でのレスポンスが返ってきます。

まとめ

Echoが無いので日本語での発話の認識率が高いのか?など気になるところはあるけど、日本語化の設定はとてもシンプルでした。
ベンダーからすでにAlexa対応が数多く発表されているので今後盛り上がってくる事が期待できますね。
Echoが届いたら発話して動画を撮りたいと思います。

Let's enjoy Alexa.