🍟

ティロリサウンドでTimers REST APIに挑戦し、挫折

2023/02/26に公開

ティロリサウンドとは

https://twitter.com/McDonaldsJapan/status/1615280373637779456

マクドナルドでフライドポテトを揚げる機械のタイマー音です。

最近、Twitterで公式に公開されていて、かなりバズっていて、こんな面白くて話題になる音があるなら、スマートスピーカーでタイマー作ったら良いだろうと思いました。

※ 後日、マクドナルド問い合わせ窓口の広報部門に電話で確認しました。商用利用にあたるので許可できませんとご回答いただきました。

実現したかった事

😀「アレクサ、ポテトタイマーを起動して」
🔊「ポテトタイマーです。何分か指定してください」
😀「3分」
🔊「分かりました。3分でタイマーを設定します」

3分後
🔊ティロリサウンドを再生、Alexaの画面上にはフライドポテトの画像を表示。

Timers REST API

https://developer.amazon.com/ja-JP/docs/alexa/smapi/alexa-timers-api-reference.html#create-timer

下記のTimerデモをAlexa-hostedに貼り付けると、そのまま動きました。
https://github.com/alexa-samples/timers-demo

index.js
        triggeringBehavior: {
            operation: {
                type : 'ANNOUNCE',
                textToAnnounce: [{
                    locale: handlerInput.t('ANNOUNCEMENT_LOCALE_MSG'),
                    text: handlerInput.t('ANNOUNCEMENT_TEXT_MSG')
                }]
            },
            notificationConfig: {
                playAudible: true
            }
        }

index.jsの24行目からがポイントだと思います。

私が理解した範囲だと、Alexaスキルで何分後のタイマーをアレクサ本体に登録します。経過したら、登録内容にしたがってアレクサ本体がお知らせします。その時点ではAlexaスキル自体は動いていません。

triggeringBehaviorでその挙動を登録します。
公式ドキュメントの「タイマーを作成する」部分に例として3パターン掲載されています。

textToAnnounceでは、SSMLが使えません。
audioタグが使えないので、音声ファイルを再生できません。
文字列をアレクサに読み上げてもらう事しか登録できません。

https://developer.amazon.com/ja-JP/docs/alexa/smapi/alexa-timers-api-reference.html#operation

リクエスト本文のタスク起動の例から引用
{
    "duration": "PT30S",
    "creationBehavior": {
        "displayExperience": {
            "visibility": "HIDDEN"
        }
    },
    "triggeringBehavior": {
        "operation": {
            "type": "LAUNCH_TASK",
            "task": {
                "name": "custom.task.name",
                "version": "1",
                "input": {
                    "type": "PrintImageRequest",
                    "version": "1",
                    "title": "美しい風景の画像",
                    "url": "http://www.example.com/image.jpg",
                    "imageType": "JPEG"
                }
            },
            "textToConfirm": [{
                "locale": "ja-JP",
                "text": "印刷タイマーが終了しました。 {continueWithSkillName}を開始しますか?"
            }],
            "notificationConfig": {
                "playAudible": true
            }
        }
    }
}

ここを適切に設定すれば、実現したかったティロリサウンドをタイマーで再生できるはずだったのですが、どうすればいいか分かりませんでした。

無音の音声ファイル

妥協案として、YouTubeからダウンロードしてmp3ファイル化したティロリサウンドの先頭に30秒の無音部分を追加する方法をとりました。
以前から知られている方法です。スマートスピーカーが起動しっぱなしになるのが難点です。

同様のタイマーアプリを作成されるなら、ユーザーが指定するバリエーションに合わせて、例えば1分から10分までの無音部分を追加した音声ファイルをあらかじめ作っておきます。

編集には、ググってすぐ出てきたAudacityを使用しました。

プロトタイプ作成

音声ファイルを再生するだけなのでindex.jsを編集せずにVoiceflowを使いました。

https://twitter.com/allforbigfire/status/1629631747494412289

感想

ほとんどタイマーのスキルがリリースされていない印象なので、これを機会に作ってみます。

Discussion