LoginSignup
3
2

More than 5 years have passed since last update.

Alexaに時間を伝えてみる

Last updated at Posted at 2018-03-21

結論

  • Alexaに時間(期間)を伝えるときは素直にAMAZON.DURATIONを使おう。
  • ドキュメントとサンプルをちゃんと読もう。

Alexaに時間を教えてみる

最初あまりドキュメント見ずにスロット増やして行けるかな?と思ったのでやってみました。

スロットを増やして{AMAZON>NUMBER}を使ってみる

Intentのサンプル発話に↓のようなものを用意します

{hour} 時間です
{hour} 時間 {minute} です
{hour} 時間 {minute} 分 {second} 秒です
{minute} 分 です
{minute} 分 {second} 秒です
{hour} 時間 {second} 秒です
{second} 秒です

Lambda側ではとりあえず発話した時間を言ってもらうようにします。

'TimeIntent': function () {
    const hour = this.event.request.intent.slots.hour.value;
    const minute = this.event.request.intent.slots.minute.value;
    const second = this.event.request.intent.slots.second.value;

    let hourMsg = '';
    if (!hour) {
        hourMsg = hour + '時間';
    }
    let minuteMsg = '';
    if (!minute) {
        minuteMsg = minute + '';
    }
    let secondMsg = '';
    if (!second) {
        secondMsg = second + '';
    }
    this.emit(':tell', hourMsg + minuteMsg + secondMsg + 'です。');
},
'DistanceIntent': function () {
    const duration = this.event.request.intent.slots.Duration.value;
    this.emit(':tell', duration +  'キロメートルです。');
},

しかしダメだった

テストシュミレータでいざ実行してみると

私「○○スキル開いて〜」
A「時間を教えてください」
私「1時間2分3秒です。」
A「1時間2分3秒です。」
私「1時間2分3秒」
A「1時間2分?秒です。」

こんな感じで語尾に「です」をつけなかったりするとうまくいかなくなったりします。
テストシュミレータだけではなく実機でやっても?になったりします。
そのうちこういうのもうまくできるようになると思いますが、
現状よくわからなかったので、ちゃんとドキュメント読んでAMAZON.Durationを使うことにします。

AMAZON.DURATION

このAMAZON.DURATIONは時間(期間)を発話(「1時間」とか「30分」とか)というとISO-8601の表記で認識します。
このAMAZON.DURATIONを使えば「1時間20分30秒」とかも"PT1H20M30S"と認識してくれます。
さらに「3時間半」とかいってもちゃんと"PT3H30M"と認識してくれるのはありがたいところです。
※ただし小数点は認識してくれないので1.5時間とかはダメ

とりあえず時間だけが欲しかったので、↓のような正規表現を使えば値は取得できます。

String.prototype.match()

function parser(m, length) {
    if (m.length < length) {
        return '';
    } else if (!m[length - 1]) {
        return ''
    } else {
        return m[length - 1].slice(0, -1);
    }
}

const duration = this.event.request.intent.slots.Duration.value;
const m  = duration.match(/(^PT)(\d+H)?(\d+M)?(\d+S)?/);

const hour = parser(m, 3);
const minute = parser(m, 4);
const second = parser(m, 5);

正規表現の"PT"以降が時刻になるため、例えば「1時間2分3秒」だと1と2と3が取れます。
ただし、「1年2ヶ月3日4時間5分6秒」とか言われると"P"が先頭になるので日時が欲しい場合は正規表現を変える必要があります。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2