このページの本文へ

前へ 1 2 次へ

日曜プログラマーのための「Clovaスキルつくり隊!」 第1回

十二支の時刻を教えてくれる「古時刻~今なんどきだい?~」

むかしの時刻を返す、スマートスピーカー用スキルをつくってみよう

2019年04月03日 15時00分更新

文● ASCII編集部

  • この記事をはてなブックマークに追加
  • 本文印刷

日曜プログラマーの皆さん、一緒にClova向けスキルを作りませんか?

 LINEのスマートスピーカー「Clova」シリーズ。特にキャラクターの可愛らしいルックスをそのままスピーカーにした「Clova Friends」は、子供のいる家庭でも大人気!

 とはいえ、いつも同じ使い方ばかりしていては子供たちも飽きてきちゃうかも?もっと違う遊び方、使い方を教えてあげちゃうことはできないものか……。

 せや! 自分で子供も喜びそうなClova向けのスキルをつくったろ! そんなお父さんのための連載が始まりました。

 大人も子供も楽しめる、Clova向けスキルの作成に挑戦していきましょう。とはいえ筆者も初心者のひとり。いきなりものすごいスキルをつくるのはハードルが高いので、一緒に勉強しながら、簡単なモノから徐々に応用の範囲を広げていきたいと思います。

 とはいえ、技術的には簡単でも、楽しめるものじゃなきゃ意味がないですよね? でもそこはアイデア次第。ひと手間加えるだけで、ちょっと面白いスキルが作れてしまうのです。

ちょっと変わった時計スキルをつくってみよう

 第1回のテーマは「時計」。話しかけると、時間を教えてくれる。シンプルですが、意外と役立つ機能です。標準でも用意されているスキルですが、毎回、現在時刻が返ってくるだけではちょっと味気ない。そこで、そこで少し捻って、面白いことができる「時計」スキルをつくってみることにしました。

 ここでチャレンジするのは、Clovaに話しかけると、現在の時刻を昔の時刻、つまり「古時刻」で返してくれるスキルです。

落語の「時そば」のように「いまなんどき?」と聞いてみましょう

 古時刻とは、子丑寅……という十二支で時刻を表した昔の時刻の呼び名です。怪談話などで、「草木も眠る丑三つ時……」などと枕で語られるアレです。

 せっかく古時刻を返してくれるものをつくるのだから、問いかけも昔風に「今なんどき?」という粋な聞き方にしてみましょう。なんかオラわくわくしてきたぞ!

作品ナンバー01
昔の時刻を答えてくれる『古時刻~今なんどき?~』

古時刻~今なんどき?~

 というわけで、さっそく見て行きましょう。できあがったのがこちらのスキルです。

 スキルのアイコンには、「かわいいフリー素材いらすとや」さんの「時そば」をモチーフにしたイラストを使わせていただきました。ありがとうございます。「時そば」は、蕎麦屋が勘定をしている間に、「今なんどきだい?」と訊ねて勘定をごまかそうとする落語です。

 ソースコードはこちら(リスト1)。Node.js(サーバー側でJavaScriptを使う言語)で書かれています。

//Clova Extensions Kit SDKモジュールを読み込む
const clova = require('@line/clova-cek-sdk-nodejs');

// Node.js のフレームワークexpressを読み込む
const express = require('express');

//ClientクラスのconfigureSkillメソッドでSkillConfiguratorクラスのインスタンスを生成
const clovaSkillHandler = clova.Client
.configureSkill()

//スキル起動時の処理
.onLaunchRequest(responseHelper => {
responseHelper.setSpeechList([
{
lang: 'ja',
type: 'PlainText',
value: '古時刻、今なんどき、を起動しました。'
},
{
lang: 'ja',
type: 'PlainText',
value: '今なんどき、といってみてください。'
}
]);
})

//ユーザーからの発話が来たら応答する処理
.onIntentRequest(async responseHelper => {
const intent = responseHelper.getIntentName();
switch (intent) {
//「いまなんどき?」の発話が来たら行う処理
case 'WhatTimeIntent':
timeslot = responseHelper.getSlot('WhatTimeSlot');
if (timeslot != null) {
//現在時刻より対応する古時刻を設定
const date = new Date();
const hour = date.getHours();
const minute = date.getMinutes();
let zodiac_name;
let time_name;

if (hour == 23 || hour == 0) {
zodiac_name = 'ね';
} else if (hour == 1 || hour == 2) {
zodiac_name = 'うし';
} else if (hour == 3 || hour == 4) {
zodiac_name = 'とら';
} else if (hour == 5 || hour == 6) {
zodiac_name = 'う';
} else if (hour == 7 || hour == 8) {
zodiac_name = 'たつ';
} else if (hour == 9 || hour == 10) {
zodiac_name = 'み';
} else if (hour == 11 || hour == 12) {
zodiac_name = 'うま';
} else if (hour == 13 || hour == 14) {
zodiac_name = 'ひつじ';
} else if (hour == 15 || hour == 16) {
zodiac_name = 'さる';
} else if (hour == 17 || hour == 18) {
zodiac_name = 'とり';
} else if (hour == 19 || hour == 20) {
zodiac_name = 'いぬ';
} else if (hour == 21 || hour == 22) {
zodiac_name = 'い';
}

if ((hour % 2) != 0) {
if (minute < 30) {
time_name = '一つどき';
} else {
time_name = '二つどき';
}
} else {
if (minute < 30) {
time_name = '三つどき';
} else {
time_name = '四つどき';
}
}

//取得した古時刻をユーザに返す
responseHelper.setSimpleSpeech({
lang: 'ja',
type: 'PlainText',
value: zodiac_name + time_name
});
} else { //ユーザの言葉か聞き取れなかった場合
responseHelper.setSimpleSpeech({
lang: 'ja',
type: 'PlainText',
value: 'よくわかりませんでした。再度、今なんどき、といってみてください。'
});
}
break;
default:
responseHelper.setSimpleSpeech({
lang: 'ja',
type: 'PlainText',
value: '今なんどき、といってみてください。'
});
break;
}
})

//終了の処理
.onSessionEndedRequest(responseHelper => {
})
.handle();

//ポート3000番で起動しリクエスト待受
const app = new express();
const port = process.env.PORT || 3000;

//applicationIdの検証、基本情報のExtension IDを入力
const clovaMiddleware = clova.Middleware({applicationId: 'YOUR_APPLICATION_ID'});

//ルートディレクトリ配下の本ディレクトリを指定
app.post('/time', clovaMiddleware, clovaSkillHandler);
app.listen(port, () => console.log(`Server running on `));

 どんな命令が実行されているかは、「//」で始まる行に書いてあるコメントを参照してください。

 簡単に内容を説明すると、

●各種モジュールを読み込み

●「古時刻を起動」という発話に対してスキルを起動

●「古時刻、今なんどき、を起動しました。今なんどき?と言ってみてください」とClovaが返す

●「今なんどき?」という発話に対して、現在の時刻を取得する

●その時刻をスロットに格納

●スロット内の値に対して、対応する古時刻を設定

●設定された古時刻を返す

 という処理になっています。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事