Amazon AlexaAWS

ssml-builderで多言語に対応したレスポンスを作成する

この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の14日目の記事です。 前回の記事:alexa-sdk + ssml-builderでAlexa Skilの […]

広告ここから
広告ここまで

この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の14日目の記事です。

前回の記事:alexa-sdk + ssml-builderでAlexa Skilの発話をカスタマイズする

ここではベタ打ちのテキストをSSML化していました。

次は英語・日本語に対応したバージョンを作る方法を紹介します。

変更前のコード

const Alexa = require('alexa-sdk')
const handlers = {
  LaunchRequest: function () {
    this.emit(':tell', 'Hello World')
  }
}

module.exports.handler = function (event, context, callback) {
  const alexa = Alexa.handler(event, context)
  alexa.registerHandlers(handlers)
  alexa.execute()
}

まずは完成品

const Alexa = require('alexa-sdk')
const Speech = require('ssml-builder')

const languageStrings = {
  'en-US': {
    'translation': {
      'SAY_HELLO': 'Hello',
      'WORLD': 'World!'
    }
  },
  'ja-JP': {
    'translation': {
      'SAY_HELLO': 'こんにちは',
      'WORLD': '世界!'
    }
  },
  'de-DE': {
    'translation': {
      'SAY_HELLO': 'Hallo',
      'WORLD': 'Welt!'
    }
  }
}

const handlers = {
  LaunchRequest: function () {
    const speech = new Speech()
    speech.say(this.t('SAY_HELLO'))
    speech.say(this.t('WORLD'))
    const speechOutput = speech.ssml(true)
    this.emit(':tell', speechOutput)
  }
}

module.exports.handler = function (event, context, callback) {
  const alexa = Alexa.handler(event, context)
  alexa.resources = languageStrings
  alexa.registerHandlers(handlers)
  alexa.execute()
}

Point:翻訳の粒度を小さくする

前回の記事と同様、発話の文字列を作成した後でssml-builderのヘルパー関数に突っ込むというやり方です。

ポイントはalexa-sdkのt()関数で翻訳テキストをロードさせるというところです。

Hello Worldくらいの短いテキストだとわざわざ分割する必要もないのですが、長文になった場合を考えるとできるだけ小さい粒度で翻訳テキストを用意した方が管理が楽そうです。

Tips:t()を使わずに多言語対応

基本的にはalexa-sdkのヘルパー関数で翻訳できますが、ケースによっては処理自体や文章全体がまるごと変わるケースもあります。
そんな場合は、event.request.localeの中に入っている値を使用します。

自分の場合は、英語にフェイルオーバーさせるヘルパー関数を自作しています。

function getLocaleFromEvent (event) {
  let lang = 'en-US'
  const { request } = event
  if (!request) return lang
  const { locale } = request
  if (!locale) return lang
  return locale
}

function getLocalizeString(event)
  const locale = getLocaleFromEvent(event)
  switch (locale) {
    case 'ja-JP':
      return '日本語での返答文'
    default:
      return 'English text'
  }
}

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts