野次馬エンジニア道

野次馬な気持ちでプログラミングをあれこれと綴ります

Google Home + Actions SDKでMediaResponseを使ったMP3再生

f:id:notta55:20180325155524j:plain

先日専用のマウントも購入したGoogle Home Mini。開発者向けのサイトを眺めているとMediaResponseを発見。独自に音楽再生ができそうなので早速試してみる。上手くいくとこのような画面になるはず。

f:id:notta55:20180325180714p:plain:w200

これはAssistantの画面だがGoogle Homeでも動作する。

プロジェクトの作成

選択肢が三つあるので、Action SDKを選択。適当に名前をつける。

f:id:notta55:20180325153414p:plain

アクションの作成

gactionのバイナリをとってきて

./gactions init

action.jsonが生成されるので編集。

  • アプリの終了のためにactions.intent.CANCEL *1もいれてしまう。
  • https://your_firebase_domain/fullfilmentのところは次に作成。
{
  "actions": [
    {
      "description": "Media Response Sample",
      "name": "MAIN",
      "fulfillment": {
        "conversationName": "MediaResponseSample"
      },
      "intent": {
        "name": "actions.intent.MAIN"
      }
    }
  ],
  "conversations": {
    "MediaResponseSample": {
      "name": "MediaResponseSample",
      "url": "https://your_firebase_domain/fullfilment",
      "fulfillmentApiVersion": 2,
      "inDialogIntents": [
        {
          "name": "actions.intent.CANCEL"
        }
      ]
    }
  },
  "locale": "ja"
}

Fulfillmentのエンドポイント作成

簡単なのでFirebaseを使う。

npm install -g firebase-tools #CLIをいれる
firebase login #ログイン

functionの雛形を作ってしまう

firebase init functions
cd functions
npm install 

github.comを追加

npm install actions-on-google --save
vi index.js

Actionの中身

さっそく動作を書いてみる

const functions = require('firebase-functions');
const ActionsSdkApp = require('actions-on-google').ActionsSdkApp;

exports.fullfilment = functions.https.onRequest( (req,res) => {

    const app = new ActionsSdkApp({request: req, response: res});

    function responseHandler (app) {
        let intent = app.getIntent();
        switch (intent) {
            case app.StandardIntents.MAIN:
                app.ask('プログラム名を教えてください。');
                break;
            case app.StandardIntents.TEXT: {
                let text = app.getArgument('text');
                const mediaResponse = app.buildMediaResponse()
                mediaResponse.addMediaObjects([
                    app.buildMediaObject("Test MP3", "https://your_test_content/test.mp3")
                        .setDescription("Spoken Word(interviews, reading, etc)")
                        .setImage("https://your_test_content/program.png", app.Media.ImageType.LARGE)
                ]);
                const richResponse =
                    app.buildRichResponse()
                        .addSimpleResponse(text + 'が見つかりました。')
                        .addMediaResponse(mediaResponse)
                        .addSuggestions(["前の回を聞く"]);
                app.ask(richResponse);
                break;
            }
            case app.StandardIntents.CANCEL:
                app.tell('終了します。');
                break;
            case app.StandardIntents.MEDIA_STATUS: {
                app.tell('再生が終わりました。');
                break;
            }
        }
    }
    app.handleRequest(responseHandler);
});

デプロイとアクションの更新

firebase deploy --only functions

実行後に表示されるURLをaction.jsonに入れて

./gactions update --action_package action.json --project PROJECT_ID

後は、Action On GoogleのコンソールからTEST DRAFTをすればOK。App Informationは適当に設定。今回は「マイラジオ」という名前に設定。

動作確認

Action On GoogleのコンソールのSimulatorで動作確認。

f:id:notta55:20180325154021p:plain:w400