はじめに
ConnectとLex連携する際、カスタムスロットのスロットをなかなか聞き取れなかったため、
聞き取りの精度を上げる方法について、記載します。
具体的には、Connectの電話番号に電話し、Lexが呼ばれた際、ファミリーマート
と発話しましたが、聞き取ってくれませんでした。
ConnectとLex連携方法は、下記の記事を参考にしてください
Lexのカスタムスロット
スロット値に制限
を使用し、スロット値ファミリーマート
を設定します。
精度をあげる方法
精度をあげる方法は結論から言うと、Lexでの聞き取りを失敗した後、CloudWatchLogsで、Lexで使用しているLambdaのログを見て、Lexが聞き取った言葉をカスタムスロットに反映させることです。
上記で設定したファミリーマート
が聞き取れなかった場合、lexで使用しているLambdaのログを見てみましょう。
ちなみに、Logに出力するには、以下のようにevent
をprint
等で出力するとよいです。
def lambda_handler(event, context):
print (event)
return dispatch(event)
LexのLambdaへのレスポンス(eventのログ)は、以下のようになっておりました。
一部省略しています。
{
"requestAttributes": {
"x-amz-lex:accept-content-types": "PlainText,SSML",
"x-amz-lex:channels:platform": "Connect"
},
"sessionId": "afd73d30-683c-4ddf-97fc-10368b820b50",
"inputTranscript": "ファミリー マート",
"interpretations": [
{
"intent": {
"slots": {
"destination": {
"shape": "Scalar",
"value": {
"originalValue": "ファミリー マート",
"resolvedValues": []
}
}
},
"confirmationState": "None",
"name": "Reservation",
"state": "InProgress"
},
"nluConfidence": 1
},
{
"intent": {
"slots": {},
"confirmationState": "None",
"name": "FallbackIntent",
"state": "InProgress"
}
}
]
}
inputTranscript
とoriginalValue
が、ファミリー マート
となっており、ファミリー
とマート
の間にスペースがあることが分かりました。
おそらく、聞き取った言葉を単語ごとに分けているため、ファミリー
とマート
の2つ単語を聞き取ったと推測されます。
Lexが聞き取った言葉をカスタムスロットに反映
ファミリー マート
をカスタムスロットに加えます。
これで、Connectの電話番号に電話し、Lexが呼ばれた際、ファミリーマート
と発話すると、しっかり聞き取ってくれました。
それでも、聞き取らない場合、もう一度ログを見て、カスタムスロットに反映させることで、どんどん聞き取り精度が向上します。
他の方法
あまりおすすめできませんが、カスタムスロットをスロット値に制限
ではなく値を展開(既定)
の方が聞き取り精度が良い場合もあるかもしれません。
私の感覚として、スロット値に制限
の方が聞き取り精度が良い気がします。
組み込みスロットタイプについて
ちなみに、Amazonが用意している組み込みスロットタイプで、AMAZON.Number
がありますが、カスタムスロットの方が精度がよかったです。
想定している値が0~9
の場合、カスタムスロットで10個作成をおすすめします。
ただ、想定している値が0~100
だと、カスタムスロットで設定するのが大変なので、組み込みスロットタイプAMAZON.Number
を使用するしかないですね。
参考