Alexaが240秒再生可能になったので約4分間告白され続けるスキルを創った

ごきげんよう

この記事は
**「するめごはんのVUI・スマートスピーカー Advent Calendar 2018」**
の7日目の記事です。


#Alexaのオーディオファイルの再生時間が90秒から240秒に延びた

この記事を書いている今日、つまり12月6日の
Alexa Dev Summit TokyoのAlexaスキルのクイズでオーディオ再生が4分まで対応できるようになった旨が出題されました。

■Alexa Dev Summit TokyoのAlexaスキル
https://www.amazon.co.jp/Amazon-Alexa-Dev-Summit-Tokyo/dp/B07KGH1VJ1/


また、smartioさんのツイートでも同様の報告がありました。


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">mp3のSSMLでの再生時間制限って90秒以内だったはずなのに…。<br>いつの間に、こうなった！？<a href="https://t.co/VN46XhfBWD">https://t.co/VN46XhfBWD</a></p>&mdash; smartio (スマートスピーカー楽しいよ) (@smartiolife) <a href="https://twitter.com/smartiolife/status/1070318023804764160?ref_src=twsrc%5Etfw">2018年12月5日</a></blockquote>
<script async src="https://platform.twitter.c![71g60WqgQ8L._AC_US218_.png](https://qiita-image-store.s3.amazonaws.com/0/67398/a32541c6-dd3c-f65e-3159-a82f666d36f3.png)
om/widgets.js" charset="utf-8"></script>


#早速、約240秒告白されてみる

とのことなので、早速240秒、つまり4分間何かしらを流そうかと思い、考えた結果、やはり？もってる音声ファイルとしてAlexaスキル **ヒロインの告白のうちの告白セリフを連結して3分58秒にしました。**

![71g60WqgQ8L._AC_US218_.png](https://qiita-image-store.s3.amazonaws.com/0/67398/9096844f-3f47-a87c-8bc7-cafd7813af76.png)



実機テスト通りましたので録画・公開してみました。
なお、何も考えないで動くことのみを目的としたため、結城琴葉ちゃんの表示が遅れたりしています。

https://youtu.be/imd6B03UaQw


#ソースコード

たいして何もしてないので、今まで通りです。

とりあえず、LaunchRequestだけ作成して、実機で動くかのみ確かめました。

```javascript

'use strict';

const Alexa = require('ask-sdk');


//20種類の告白セリフを結合したファイル
const kotoha_20 = '<audio src=\"https://s3-XXXXXXXXXXXXXXXXXX.mp3\" />';


//画像
const DisplayImg1 = {
      title: '結城琴葉',
      url: 'https://s3-ap-XXXXXXXXXXXXXXXXXXXXX.png'
    };
    
const DisplayImg2 = {
      title: '結城琴葉',
      url: 'https://s3-ap-XXXXXXXXXXXXXXXXXXXXX.png'
};

const LaunchRequestHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
  },
  async handle(handlerInput) {

    // Template 6
    if (supportsDisplay(handlerInput)){
      const myImage1 = new Alexa.ImageHelper()
        .addImageInstance(DisplayImg1.url)
        .getImage();

      const myImage2 = new Alexa.ImageHelper()
        .addImageInstance(DisplayImg2.url)
        .getImage();

      const primaryText = new Alexa.RichTextContentHelper()
        .withPrimaryText('')
        .getTextContent();

        handlerInput.responseBuilder.addRenderTemplateDirective({
        type: 'BodyTemplate6',
        token: 'string',
        backButton: 'HIDDEN',
        backgroundImage: myImage2,
        image: myImage1,
        title: "",
        textContent: primaryText
      });
    }

    ///////////////////////////////////////////
    var hoge = 'さぁ、付き合いますか！？';
    ///////////////////////////////////////////


    let speechText =  '<break time="0.7s"/>' + kotoha_20;

    return handlerInput.responseBuilder
      .speak('<speak>' + kotoha_20 + '</speak>')
      .reprompt('<speak>' + kotoha_20 + '</speak>')
      .withShouldEndSession(false) //本来きちんと対応する
      .getResponse();
  }
};


// returns true if the skill is running on a device with a display (show|spot)
function supportsDisplay(handlerInput) {
  var hasDisplay =
    handlerInput.requestEnvelope.context &&
    handlerInput.requestEnvelope.context.System &&
    handlerInput.requestEnvelope.context.System.device &&
    handlerInput.requestEnvelope.context.System.device.supportedInterfaces &&
    handlerInput.requestEnvelope.context.System.device.supportedInterfaces.Display;

  console.log("Supported Interfaces are" + JSON.stringify(handlerInput.requestEnvelope.context.System.device.supportedInterfaces));
  return hasDisplay;
}


// LaunchRequestHnadlerより後に書く必要あり
exports.handler = Alexa.SkillBuilders.standard()
  .addRequestHandlers(LaunchRequestHandler)
  .lambda();


```

#これによりどうなるか

僕個人ですと、もっとキャラクターの表現がしやすくなりますし、ポッドキャストに近いこともできることになります。

90秒は結構厳しかったので、今回の対応はうれしい限りです。

が、4分間告白され続け、終わった後8秒間返答しないと repromptで再度4分間告白される動きを上記のコードだとしてしまいます。

いずれにしろ、この長くなったからといって、やみくもに長いのはユーザーからすると鬱陶しいので、それこそVUIデザインの話になるかと思います。
スキルの特性によって適宜利用していきましょう。


以上