音声インターフェースを定義する


Alexaに新しい機能を追加するには、Alexa Skills Kitでカスタムスキルを作成します。新しいカスタムスキルを作成する際は、ロジックの実装だけではなく、ユーザーがそのスキルと対話して機能を実行するための音声インターフェースの定義も必要となります。

音声インターフェースを定義するには、ユーザーの音声入力と、クラウドベースのサービスで処理可能なインテントをマッピングします。

このマッピングを宣言するためには、主に次の2つを指定します。

  1. インテントスキーマ: あなたのサービスが受け入れ、処理できるインテント一式を宣言するJSON構造。
  2. 音声入力データ:
    • サンプル発話: インテントを、使用される可能性があるフレーズと結び付ける、構造化テキストファイル。このファイルにはフレーズのさまざまな言い方も含まれます。
    • カスタム値(カスタムスロットで使用): スキルで使用される特定の項目を表す値のリスト。カスタムスロットタイプを使用する場合に、インテント内で参照されます。

この情報は、開発者ポータルの「Interaction Model」ページで入力します。詳しくは、開発者ポータルでカスタムスキルを登録および管理するを参照してください。

以下のセクションでは、これらのリソースを使用して効果的な音声インターフェースを定義する方法について説明します。

インテントスキーマ

Alexaにおけるインテントとは、ユーザーの音声によるリクエストを満たすアクションを表します。インテントでは、スロットという引数を任意で使用することもできます。たとえば、「十二星座占い」というスキルのインテントスキーマには、Signというスロットを持つGetHoroscopeというインテントが定義されているとします。ユーザーが「アレクサ、『十二星座占い』で魚座の運勢を調べて」と言った場合、Alexaサービスは、「十二星座占い」サービスに、Signスロットの値が「魚座」のGetHoroscopeインテントを送信します。サービスは、GetHoroscopeインテントを受け取ると、魚座の運勢を検索し、音声に変換するためのテキストを返します。

スキル開発者は、これら一連のインテントを、インテントスキーマと呼ばれる有効なJSONデータで定義します。たとえば、次のインテントスキーマでは、2つのインテントが定義されています。GetHoroscope and GetLuckyNumbers:

{
  "intents": [
    {
      "intent": "GetHoroscope",
      "slots": [
        {
          "name": "Sign",
          "type": "LIST_OF_SIGNS"
        },
        {
          "name": "Date",
          "type": "AMAZON.DATE"
        }
      ]
    },
    {
      "intent": "GetLuckyNumbers"
    }
  ]
}

各インテントには2つのプロパティがあります。

  • intentプロパティは、インテントの名前を決定します。
  • slotsプロパティは、インテントに関連付けられたスロットを列挙します。

上記の例では、GetHoroscopeインテントでSignDateという2つのスロットが定義されています。

スロットはさまざまなタイプで定義されます。たとえば、上記の例のSignスロットは、カスタムタイプLIST_OF_SIGNSとして定義されていて、このスロットに与えられる星座の値(牡羊座、山羊座など)のリストを参照します。Dateスロットは、ユーザーが言った月の名前を、Amazonの標準AMAZON.DATEタイプの日付フォーマットに変換します。

Alexa Skills Kitでは、一般的なアクションのビルトインインテントライブラリが用意されています。ビルトインインテントを実装する場合は、カスタムインテントと同様にインテントスキーマに含めます。詳しくは、ビルトインインテントを実装するを参照してください。

音声入力データ

インテントと、インテントを呼び出すサンプル発話をマッピングするには、スキルでサポートされるカスタムスロットの値一式およびサンプル発話のリストを作成します。

標準スロットタイプ

Amazonは、大規模な標準スロットタイプライブラリを用意しています。このライブラリには、日付などにデータを変換するタイプ、よく使用される値(国、都道府県、市町村、名前など)を認識するタイプなどが含まれます。

たとえば、AMAZON.DATEタイプは、日付を表す言葉(「今日」「明日」「6月」など)を日付フォーマット(「2015-07-00T9」など)に変換します。

スキルで標準タイプを使用する場合は、サンプル値を指定する必要はありません。サンプル発話ファイルには、必要に応じてスロット名を追加します。その他のデータタイプには、カスタムスロットタイプを使用することをお勧めします。すべての標準タイプには、AMAZONネームスペースが接頭辞として付けられています。

カスタムスロットタイプ

カスタムスロットタイプは、アイテムがAmazonの標準タイプセットでは変換不可能で、スロット値が想定される一式のスロット値のいずれかである多くの場合に使用します。上記の星占いの例のLIST_OF_SIGNSスロットタイプでは、カスタム値のリストは以下のようになります。

牡羊座
牡牛座
双子座
蟹座
獅子座
魚座
乙女座
天秤座
蠍座
射手座
山羊座
水瓶座

スキルのスロットで処理するカスタム値のリストには、ユーザーが言う可能性のある言葉なら何でも追加できます。ただし、一般的な辞書にない単語は認識されない可能性があります。

例については、カスタム対話モデルのリファレンスの「カスタムスロットタイプの構文」のセクションを参照してください。

推奨されるカスタムスロットタイプの値については、カスタムスロットの値を参照してください。

カスタムスロットタイプは列挙型と同じではありません。リストにない値でも、音声認識システムが認識すれば、返される可能性があります。カスタムスロットタイプへの入力はリストの値に一致するよう重み付けされますが、リストの項目だけに限られるわけではありません。ただし、コードでスロット値の検証とエラーチェックを行う必要はあります。Alexaから送信されたリクエストを処理するの「想定される入力エラーを処理する」のセクションを参照してください。

複数のスロットで同じカスタムスロットタイプを使用することができます。たとえば、星占いのスキルに2つの星座を比較するMatchSignというインテントが追加されているとします。このインテントでは、FirstSignSecondSignという2つのスロットが定義されます。これら両方のスロットで、同じカスタムスロットタイプLIST_OF_SIGNSを使用できます。

{
  "intents": [
    {
      "intent": "GetHoroscope",
      "slots": [
        {
          "name": "Sign",
          "type": "LIST_OF_SIGNS"
        },
        {
          "name": "Date",
          "type": "AMAZON.DATE"
        }
      ]
    },
    {
      "intent": "MatchSign",
      "slots": [
        {
          "name": "FirstSign",
          "type": "LIST_OF_SIGNS"
        },
        {
          "name": "SecondSign",
          "type": "LIST_OF_SIGNS"
        }
      ]
    },
    {
      "intent": "GetLuckyNumbers"
    }
  ]
}

サンプル発話ファイル

各サンプル発話は、定義されたインテントの1つに割り当てます。たとえば、以下のサンプル発話ファイルのスニペットでは、GetHoroscopeインテントに4つのフレーズ、GetLuckyNumbersインテントに2つのフレーズ、MatchSignインテントに2つのフレーズがマッピングされています(実際には、この例よりもはるかに多くのフレーズをマッピングする必要があります)。

GetHoroscope {Sign} の運勢を教えて
GetHoroscope {Sign} の {Date} の運勢を教えて
GetHoroscope 私の運勢を教えて
GetHoroscope {Sign}
...
GetLuckyNumbers 私のラッキーナンバーは何
GetLuckyNumbers 私のラッキーナンバーを教えて
...
MatchSign {FirstSign} と {SecondSign} は気が合うかな
MatchSign {FirstSign} と {SecondSign} の相性はどう

注: AMAZON.HelpIntentなどのビルトインインテントにはサンプル発話をマッピングする必要はありません。

サンプル発話の構文

サンプル発話ファイルの各行は、タブまたはスペースで区切られた2つのフィールドで構成されます。

  • 左側はインテントの名前です。
  • 右側は、そのインテントを呼び出すためにユーザーが言うフレーズです。

スロットはインテントの引数です。各サンプル発話のAMAZON.LITERAL以外のすべてのスロットタイプでは、スロット値を波括弧で囲まれたスロット名で表します(例: {SlotName})。AMAZON.LITERALスロットタイプでも、インラインでスロットの単語の値を指定する必要があります(例: {slot value|SlotName})。スロットを表す記号 ` {SlotName} ` の前後には半角スペースを入れる必要があります。

ファイルに含まれる次のフレーズを例として説明します。

「{Sign} の {Date} の運勢を教えて」

この発話では、{Sign}{Date}のスロットがGetHoroscopeインテントの引数であり、この発話パターンで変数として使われています。{Sign}にはカスタムリストLIST_OF_SIGNSの値、{Date}にはAlexa Skill Kitが標準でサポートされる日付の値が使用されます。したがって、ユーザーは以下のように言うことができます。

「獅子座の火曜日の運勢を教えて」

Alexa Skills Kitは、入力をカスタムおよび標準スロットタイプに応じて自動的に一般化するので、パターンを1つ指定するだけで、そのパターンに対するさまざまな形式の入力に対応できます。ただし、発話パターンのバリエーションを考慮することは重要です。たとえば、下記のような発話に対応するために、

「天秤座の明日の運勢を教えて」

以下のパターンをサンプル発話ファイルに追加する必要があります。

「{Sign} の {Date} の運勢を教えて」。

発話パターンの指定方法については、下記の「サンプル発話のコンテンツ」のセクションを参照してください。

各サンプル発話で、インテントで定義されているスロットをすべて使用する必要はありません。上記の例のGetHoroscopeインテントのスキーマでは、SignスロットとDateスロットが定義されています。「{Sign} の運勢を教えて」というフレーズではSignスロットだけが使用されています。また、「私の運勢を教えて」ではスロットが1つも使用されていません。ユーザーがこれらのフレーズのどれを使っても、同じインテントが送信されます。ただし、スロット値がnullになります。

タイプミスやスペルミスがないか確認してください。コピーアンドペーストによる間違いなどがないか、注意してください。

次のステップ


このページは役に立ちましたか?

最終更新日: 2023 年 05 月 05 日