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'
      }
    }
    
    広告ここから
    広告ここまで
    Home
    Search
    Bookmark