47歳でやむなくセミリタイア

病気のためセミリタイアをすることに。現在は週20時間程度のバイトをしています。その他、雑多なことを記録として書いています。

Alexaデバイスで音楽を再生するスキルを作ってみた

この何日間か朝早く起きてしまっていて、睡眠時間が短くなってしまっています。

さて、最近は椅子に長時間座ったままになるのを避けるために、ポモドーロタイマー(25分集中、5分休憩)の環境音楽を流し、休憩中は椅子から離れるようにしています。

音楽はEcho DotにiPhoneを接続して再生していています。 iPhoneのショートカット機能で大分便利になったのですが、さらに簡単にならないかなと思っていたら、以下のサイトを見つけました。

qiita.com

これは良さそうと、さくっとスキルを作成しすると、うまくいったので、メモを残しておきます。

Alexa スキル 「集中」

今回はAmazon S3にmp3ファイルを置いて、スキル開始時に再生を行うだけのスキルを作成しました。

「集中」というスキルを作成したので、「Alexa 集中を開いて」と言うだけで、音楽が再生されるようになりました。

手順はザックリと以下のような感じです。

amazon developerアカウントを作成

https://developer.amazon.com/

新規のアカウントを作成ではなく、Alexaデバイスに使用しているamazonアカウントでログインした方が良いです。 そうするとAlexaデバイスとのリンク作業が必要ありません。

ログインすると住所などの追加情報の登録が求められて、アカウント作成が完了します。

スキルを作成

チュートリアルがあるのですが、チュートリアルは記載が古いです。 ただ、全てデフォルトで進めればよいのでハマることはありませんでした。

  1. alexa developer consoleで、「スキルの作成」
  2. 作成するスキル名(集中)を記入
  3. 「カスタム」「Alexa-hosted (Node.js)」が選択されているので、そのまま「スキルの作成」
  4. 「スクラッチで作成」選択されているので、そのまま「テンプレートで作成」

こんな感じで、作業はスキル名を記入するだけという感じです。

ビルドにAudio Playerを追加

Alexaスキルで音楽再生のインターフェイスが使用できるようにします。

「ビルド」タブに移動して、「インターフェース」の項目にある、「Audio Player」のスイッチをオンにします。 その後で、「モデルをビルド」を行えば完了です。

Amazon S3にファイルをアップロード

amazon developerアカウントを作成すると自動的にAmazon S3の無料枠が割り当てられます。

「コードエディタ」のタブに移動して、「S3 Storage」をクリックすると、Amazon S3の管理コンソールが立ち上がります。 Media/というバケットができているので、ここにmp3ファイル(pomodoro.mp3)をアップロードします。

アップロードの仕方で迷うことはないと思います。

音楽再生を行うコードを記述する

「コードエディタ」に戻って、index.jsのコードを以下のように書き換えます。

const Util = require('./util.js');   // S3にアクセスするために必要

// スキル開始時に音楽を再生
const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
    },
    handle(handlerInput) {
        const url = Util.getS3PreSignedUrl('Media/pomodoro.mp3');
        const token = 'comodoro';
    
        return handlerInput.responseBuilder
            .addAudioPlayerPlayDirective('REPLACE_ALL', url, token, 0, null)
            .getResponse();
    }
};

// リピート再生
const playbackNearlyFinishedHandler = {
    canHandle(handlerInput) {
        return Util.checkIntentTypeName(handlerInput, 'AudioPlayer.PlaybackNearlyFinished');
    },
    handle(handlerInput) {
        return playbackNearlyFinished(handlerInput);
    }
}

function playbackNearlyFinished(handlerInput) {
    let audioPlayer = handlerInput.requestEnvelope.context.AudioPlayer;
    let url = Util.getS3PreSignedUrl('Media/pomodoro.mp3');
    let token = 'comodoro';
    let expectedPreviousToken = audioPlayer.token;
    return handlerInput.responseBuilder
        .addAudioPlayerPlayDirective('ENQUEUE', url, token, 0, expectedPreviousToken)
        .getResponse();
}

// 「止めて」「キャンセル」などで再生を停止する
const CancelAndStopIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && (Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.CancelIntent'
                || Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.StopIntent'
                || Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.PauseIntent');
    },
    handle(handlerInput) {
        return handlerInput.responseBuilder
            .addAudioPlayerStopDirective()
            .getResponse();
    }
};

書き換えたら、「保存」して「デプロイ」を行います。 デプロイが終わると、手持ちのAlexaデバイス(Echo Dotなど)でスキルが使用できるようになります。

テスト

Audio Playerはコンソールでのテストがサポートされていません。なので、実機(Echo Dotなど)でテストします。

  • 「Alexa 集中を開いて」で音楽再生開始
  • 「Alexa キャンセル」「Alexa 止めて」で音楽再生停止

するようならOKです。

注意点

注意点というか、気になったことを記録しておきます。

mp3の変換の必要ない

ググるとmp3をAlexa用に変換する必要があるというような記載が見つかりますが、古い情報だと思います。 48kbpsに変換しろと書いてあったのですが、さすがに音質が悪すぎて聞けたものではなくて、元ファイル(128kbps)を使ってみたら問題なく使えました。

スキルでさまざまな音声を使用する | Alexa Skills Kit

| ファイルタイプ:.acc .mp4 .mp3 .hls .pls .m3u 仕様: ビットレート16~384kbps 長さ: 無制限 |<

この情報が正しそうです。 ただあまりビットレートが高いと、次で説明するAmazon S3の無料枠をすぐに使い切ってしまいます。

Amazon S3の無料枠でどれだけ使えるのか

これは要注意項目です。

Alexa-hostedスキルを使用してスキルをエンドツーエンドで作成する | Alexa Skills Kit

| Amazon S3: 月あたり、5 GBのAmazon S3ストレージ、20,000件のGETリクエスト、2,000件のPUTリクエスト、15 GBのデータ転送を利用できます。 |<

mp3ファイル一つだけなので容量は使いません。 音楽再生なので再生開始時にGETだけ、 月間20,000リクエストということは、666回/日なので、GETも問題なし。

データ転送量は、128kbpsだから16KB/s、24時間でザックリ1.4GBになりますので約10日分、一日の1/3の8時間は使えるということですね。 無料枠を超えることはまずなさそうかな。

もっと転送量を落としたければ、モノラル音声の64kbpsに変換してもいいですね。Echo Dotは一台で鳴らすのでしたらモノラルで充分ですから。

「Alexa 止めて」がPauseIntentになる

これは多分バグかな。

「Alexa 止めて」はStopIntentのはずなのですが、PauseIntentで上がってきてしまいます。 私の用途では問題ありませんが、ちょっと気持ちが悪い。

音切れ

ストリーム再生なのでネットワークが遅いと音切れが発生します。ただし、普通に使っていて音が途切れることはないです。

ただ、ゲームのダウンロードを実行した時に、音切れが発生することがありました。そういう作業中はiPhoneから再生した方が良さそうです。

追記: スキルが無効になった

一日使っていると、「このスキルは無効にされています。Alexaアプリで有効にしてください」と言われるようになってしまいました。 Alexaアプリで一旦無効化して有効にしても駄目です。何故だ~~。

さらに追記。alexa developer consoleで再ビルドしてみたりしていたら使えるようになりました。

それにしても、Alexaスキルが結構簡単に作れて驚きました。また何か面白そうなものがあれば手を出してみたいと思います。