Alexa AlexaでDynamoDBのデータを取得する
Lambdaでやること
下記のコードを追加していつもどおりハンドラー登録をします。
def dbGet(name): queryData = table.query( KeyConditionExpression = Key("name").eq(name) ) text = '登録されていない人です' if(len(queryData['Items']) > 0): text = name + 'さんは' + str(int(queryData['Items'][0].get('age'))) + '歳です' return QuestionSpeech(text).reprompt('他にはなにかありませんか?').build()
DynamoDBのqueryで取得したデータは最初listになっていて
['Items']のインデックスで取得することで
Dictonaryとして各要素にアクセスできるようになります。
Dictonaryにはキー名:値のセットで格納されているので
素直にキー名で取り出してやれば欲しい値が取れます。
Alexaでやること
インテントの追加だけです。

実行
前回作ったPutと合わせて使ってみます。

データベースの操作は1できれば2もできますね。
Alexaは自由テキストを受け取る仕組みではないらしい
今回テスト用として適当な名前で100件ほどデータPutしてみようと
やってみたら何件か弾かれました。
(よくわからない文字列になるかそもそもエラーになるか)
なんでだろうと思い色々ぐぐってみたら
Alexa的に登録されていないテキストを認識するということは
結構領域外っぽいです。
というのもAlexaは受け取ったテキストを
登録されているインテントに当てはめようとして
どうしても当てはまらない場合のみ
渡されたデータをリテラルとして無理やりあてはめるそうです。
(無理やりなあてはめだからわけわかめな文字列になったわけですね)
こうしているのはおそらくですが、
識字率を上げるためでしょうね。
同じスマートスピーカーであるGoogleHomeなんかでは
似た発音の文字列と誤認識することが結構あるそうですが、
Alexaの場合そういった事例はあまり聞きません。
精度の高さと自由性はトレードオフってことですね。
あとがき
今回はAlexaでデータを取得してみました。
そんな苦戦せずに済みましたね。
(Pythonの文法やらなんやらで少し手間取りましたが)
今回はテストということで自由テキストで投げましたが、
実運用時はAlexaにかける言葉はある程度限定されるはずなので
まぁ問題はないのかなと思っております。
それでは今回はこの辺でノシ