Amazon Lex のスロットタイプのAMAZON.Timeは、日本語の時刻に関する言葉をどこまで認識してくれるか調査してみた

日本語では、時刻に関する言葉が多くありますが、スロットタイプのAMAZON.Timeでは、どこまで認識するのかを調査しました。
2023.02.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Amazon Lexのスロットタイプで、AMAZON.Timeを利用した際に、Lexが日本語の時刻に関する言葉をどこまで認識してくれるか調査しました。

例えば、AMAZON.Timeをスロットに適用し、テストした場合、15時と入力すると、Lexは、時刻を認識し、具体的な時間に変換してくれます。

下記は、テストしたときの画像です。

15時を認識し、15:00に変換されていますね。

日本語では、15時と同じ意味でも、PM3時午後3時2時間後(時刻が13時の場合)...など様々な言い回しがあります。

Lexではどこまで認識してくれるか調査しました。

調査結果

先に調査結果を出します。

ただし、調査日(2023年2月3日 金曜日)時点でのLexの認識能力のため、時間が立てば、認識能力が上がることで、より聞き取ってくれる可能性はあります。

時間を様々な言い方でテストした結果

表のLexの認識のうち-のところは、Lexが認識しなかった箇所です。

入力内容 Lexの認識 判定
9 - ×
9時 - ×
AM9 09:00
午前9時 09:00
12 - ×
12時 - ×
AM0 00:00
AM12 00:00
午前0 00:00
午前12 00:00 ×(12:00が正解)
PM0 12:00
PM12 12:00 ×(00:00が正解)
午後0時 12:00
午後12時 12:00
正午 - ×
13 13:00
13時 13:00
じゅうさんじ - ×
2時間後 - ×

「午後(PM)0時」「午後(PM)12時」は、12:00と認識し、「午前(AM)0時」「午前(AM)12時」は、00:00と認識するようですね。

日本語では、「午後12時」は「00:00」、「午前12時」は「12:00」のことでなので、Lexが間違えてますね。。

あいまいな時刻

「9時」が認識されない理由は、厳格には認識していますが、09:00と21:00の2通りあり、どちらに変換すればよいか分からないため、スロット値に入らないようです。

ドキュメントにも2通りある時刻をあいまいな時刻と表現し、Lambda関数に値を渡して、処理する必要があると記載がありました。

ただし、「午前9」にすると、あいまいな時刻ではないので、「9:00」と認識してくれますね。

あいまいな時刻の解決が含まれています。ユーザーがあいまいな時刻を入力すると、Amazon Lex は slotDetails イベントの Lambda 属性を使用して、あいまいな時刻の解決を Lambda 関数に渡します。たとえば、ボットからユーザーに配達時間を尋ねたときにユーザーが「10 時」と答えると、この時刻はあいまいです。午前 10:00 なのか午後 10:00 なのかが不明です。この場合、slots マップの値は null となり、slotDetails エンティティには 2 つの可能な時刻の解決が含まれます。

あいまいな時間の対処法は、以前下記のブログを書きましたので、一読ください。

分を様々な言い方でテストした結果

入力内容 Lexの認識 判定
9:13 - ×
12:00 - ×
13分 13:00 ×
34分 - ×
13時13分 13:13
13:13 13:13
30分後 - ×

日付を表す単語を日付形式に変換するスロットタイプの一つであるAMAZON.Dateでは、日付が2月6日のときに「5日」と入力すると、未来の日付である「3月6日」と認識されます。

ただし、AMAZON.Timeの場合、時刻が13:30のときに「13分」と入力しても、「14:13」ではなく、「13:00」と分ではなく、時間と認識されるようです。

秒を様々な言い方でテストした結果

入力内容 AMAZON.Timeの認識 判定
13:55:32 13:55 ×
13秒 - ×

秒数は、切り捨てられるようです。

JSONで確認すると、originalValueは、13:55:32 でしたが、 interpretedValueが13:55になっていることが確認できました。

  • interpretedValue
    • Amazon Lex V2 がスロットについて決定する値。
    • ユーザーが入力した値を使用できるか、Amazon Lex に resolvedValues のリスト中の値を選ばせるかを行えます。
  • originalValue
    • スロットに対して入力されたユーザーからの発話のテキスト。
  • resolvedValues
    • スロットで認識された追加の値のリスト。

     "value": {
      "originalValue": "13:55:32",
      "interpretedValue": "13:55",
      "resolvedValues": [
       "13:55"
      ]
     }

調査環境の作成

調査するために、作成したボットとインテントの作成方法を説明します。

ボットの作成

  1. Lexのコンソール画面から、[ボットの作成]をクリックします。
  2. [空のボットを作成します]を選択し、ボット名を記載し、下記画像の通りに入力します。
  3. 日本語を選択し、[完了]をクリックします。

これでボットが作成できました。

インテントの作成

  1. インテント名を入力し、サンプル発話に「予約時間」を追加します。
  2. [スロットを追加]から、スロットタイプ[AMAZON.Time]を選択します。プロンプトと名前も記載します。
  3. [Confirmation]の確認プロンプトに、以下を記載します
    • {time}でよろしいでしょうか?
  4. [応答を閉じる]をアクティブにします。
  5. インテントを保存後、Buildすると、インテントのテストが行えます。

テスト方法

  1. [Test]をクリックし、「予約時間」と入力後、「予約時間を教えて下さい」と問われるため、「15時」などを入力すると、Lexが認識できた場合のみ、確認プロンプトで作成した文章が返ってきます。

このインテントで、AMAZON.Timeのテストが行えます。

最後に

スロットタイプのAMAZON.Timeでは、「2時間後」は認識できず、「午後12時」を間違って認識、秒数切り捨てられるなど、実際にテストしないと分からない部分がありました。

他のスロットタイプもどこまで日本語を認識してくれるか調査してみてもよいですね。

Lexを使用する際に、参考になれば幸いです。