atskimura-memo

あまり仕事とは関係なく適当に書きます。開発ネタが多いかもしれません。

Alexaで萌えタバタタイマーを作った(AudioPlayerを利用)

はじめに

ハリーポッターの呪文に引き続き、こちらは普通に自分が欲しかったので、年始に作りました。トレーニングが捗ります。

しかし、書き終わってから気づいたけど、「萌え」って最近聞かない。死語になってそう…

タバタ式トレーニングとは?

年を取ってくると体が衰えてくるもので、運動しなくちゃなってのが共通の話題になって来ます。
ご多分に漏れず、私も2年前くらいから運動を少し始めてみているのですが、その中の一つにタバタ式トレーニングというのがあります。

胡散臭くなさそうな説明を探したところ立命館大学の説明が見つかったので貼っておきます。

タバタトレーニングでは、20秒の運動と10秒の休息を1セットとして、8セットで疲労困憊に至る間欠運動を行います。8セット=4分間と聞くと、「そんな短時間で効果があるの?」と感じるかもしれません。しかし、田畑教授の研究の結果、4分間の間欠運動によって、大多数の人が「有酸素性エネルギー」も「無酸素性エネルギー」も、同時にかつ、最大に刺激されるということが証明されています。
タバタトレーニング | 特集 | RS WEB | 立命館大学

動画で見るとこんなのです。しんどいです。

実際、私がやっているのはこの本です。タバタ式はHIIT(高強度インターバルトレーニング)の一種なんだそうですよ。

HIIT 体脂肪が落ちる最強トレーニング

HIIT 体脂肪が落ちる最強トレーニング

タバタタイマー

時計を見ている余裕なんてないので、タバタタイマーと呼ばれるタイマーアプリがいくつかリリースされています。有名なRuntasticも出しています。
20秒、10秒をカウントしてくれます。

Runtastic Timer タバタ式トレーニングタイマー

Runtastic Timer タバタ式トレーニングタイマー

  • runtastic
  • ヘルスケア/フィットネス
  • 無料

萌えタバタタイマーアプリ

でも、いろいろ試しましたが、英語でしゃべったり「ピッピッピッピー」と味気なかったりといまいち使い勝手が悪いのです。
というわけで、2年ほど前にReact Nativeの勉強がてらiPhoneアプリを作りました(公開はしていません)。

f:id:a_kimura:20180110215338p:plain:w150

※個人用だったので、どこかから適当に取ってきた画像を使わせていただきました。すみません。

こちらのサイト(効果音ラボ)のアプリ・音声案内(元気な女の子)あたりから取ってきた音声素材を組み合わせて、「がんばってー」「3,2,1,0」のように応援とカウントダウンをします。

味気ないのよりやる気が出るもので便利に使っていたのですが、最近のiOSのバージョンアップで動かなくなってしまいました。
たぶんreact-nativeでもバージョンアップすれば直るのですが、2年前にお遊びで作ったもので再び触る気も起きず放置してたら、なんと全然トレーニングをしなくなってしまったんですね。これほど影響力があったとは思いませんでした…

Google Home

そんな折、Google Home miniを買いまして、ちょうどいい題材なのでタバタタイマーを作ろうと思い立ちました。
アプリにしましたが、どうせ画面なんて見れないので、画面要らないんですよね。

しかし、なんとGoogle Homeのアクションでは2分以上の音声を再生できず(正確には一般開発者には公開されていません)、泣く泣く断念。

Alexaスキル

12月末にやっとAmazon Echo Dotが届きました。すぐ予約したはずなんですけどね。

AlexaにはAudioPlayerといって、オーディオのストリーミング再生のインターフェースがありますので、これを使って長い音声を再生することができます。
というわけで、Alexaスキルとして「萌えたバタタイマー」を作りました。

仕組み

仕組みはすこぶる簡単です。

  1. 上の音声素材をGarageBandで組み合わせて作った音声ファイルを作り、S3に配置
  2. 「萌えたバタタイマー」スキルが呼ばれたら、AlexaのAudioPlayerで音声ファイルを再生する

これだけ。

作り方

事細かには書かないので、詳しくはドキュメントを見てください。
一度クラスメソッドさんが作っているAlexaスキル開発トレーニングをやると以下の情報だけで作れると思います。

1. 音声ファイルを作る

前アプリ作った時は時間や回数を設定できるようにしたのですが、(20秒+10秒)x8回固定でいいので、ただただGarageBandでがんばりました。

f:id:a_kimura:20180104233726p:plain

BGMはこちらのサイト(フリー無料のBGM素材・音楽素材「甘茶の音楽工房」)からいただきました。

2. Alexaスキルを作る

Alexaスキル

スキル情報

Audio Playerを「はい」にするのを忘れないようにしてください。

インテントスキーマ
{
  "intents": [
    {
      "intent": "PlayAudioIntent"
    },
    {
      "intent": "AMAZON.PauseIntent"
    },
    {
      "intent": "AMAZON.StopIntent"
    },
    {
      "intent": "AMAZON.ResumeIntent"
    },
    {
      "intent": "AMAZON.CancelIntent"
    }
  ]
}
サンプル発話
PlayAudioIntent 再生して
PlayAudioIntent 始めて
PlayAudioIntent 開始して

追加してみたけど、LaunchRequest インテントで動かすだけだから実は不必要。

Lambda関数

一時停止/再開とか別にいらないので実装していません。全部停止/再生です。

/* eslint-disable  func-names */
/* eslint quote-props: ["error", "consistent"]*/
/**
 * This sample demonstrates a simple skill built with the Amazon Alexa Skills
 * nodejs skill development kit.
 * This sample supports multiple lauguages. (en-US, en-GB, de-DE).
 * The Intent Schema, Custom Slots and Sample Utterances for this skill, as well
 * as testing instructions are located at https://github.com/alexa/skill-sample-nodejs-fact
 **/

'use strict';

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

const APP_ID = undefined;  // TODO replace with your app ID (OPTIONAL).

const handlers = {
    'LaunchRequest': function () {
        this.emit('PlayAudio');
    },
    'PlayAudioIntent': function () {
        this.emit('PlayAudio');
    },
    'PlayAudio': function () {
        const audioUrl = 'https://<S3のバケットのURL>/moetabatatimer.mp3';
        this.response.audioPlayerPlay('REPLACE_ALL', audioUrl, audioUrl, null, 0);
        this.emit(':responseReady');
    },
    'AMAZON.ResumeIntent': function () {
        this.emit('PlayAudio');
    },
    'AMAZON.PauseIntent': function () {
        this.emit('AMAZON.StopIntent');
    },
    'AMAZON.CancelIntent': function () {
        this.emit('AMAZON.StopIntent');
    },
    'AMAZON.StopIntent': function() {
        const text = '<audio src="https://<S3のバケットのURL>/info-girl1-areremouowaccyauno1.mp3" />';
        this.response.speak(text).audioPlayerStop();
        this.emit(':responseReady');
    },
    'AMAZON.HelpIntent': function () {
        this.emit(':ask', 'タバタ式トレーニングを始めましょう!「始めて」と言ってください。');
    },
    'Unhandled': function () {
        this.emit('AMAZON.HelpIntent');
    },
};

exports.handler = function (event, context) {
    const alexa = Alexa.handler(event, context);
    alexa.APP_ID = APP_ID;
    alexa.registerHandlers(handlers);
    alexa.execute();
};

Echoで動かす

Alexaスキルを作るAmazon Developer AccountのメールアドレスとEchoに認証しているAmazonアカウントのメールアドレスが同じであれば、何もしないでEcho実機で動きます。

おわりに

これで2018年もトレーニングができますよ。スマホを触る必要がないのでアプリに比べても格段に楽になりました。
ぜひ皆さんもAlexaスキルの勉強と運動不足解消にお試しください。

それと、こういう系はスマートスピーカーにぴったりだと思うので、ぜひ皆さんサービス化してください。