テスターちゃん【4コマ漫画】

ソフトウェアテストの用語、やり方などを4コマ漫画でわかりやすく説明する(予定の)ブログです。脱線も多いです。

Clovaのスキルを作ってみた&作り方

目次

 

***

 

LINEの「Clova」のスキルを開発できる「Clova Extensions Kit」が出ましたね!

待ってましたという感じですw

併せて優勝賞金1000万円の開発コンテストも開かれるとか!!

これは頑張るしかありませんw

www.line-community.me

 

 

 Clovaスキルで簡単な言葉を返すだけのスキルを実装する

 

さっそくClovaのスキルを作ってみたので、作り方を書こうと思います。

まずはいきなりコードからです(爆

Clova Developer Center(スキルのサイト)でのスキルの登録については下の方でかきますね!(いや……コードより長文になって……)

 

では……

「こんにちはザ・ワールド」という簡単な言葉を返すだけのスキルです。

phpです)

 

<?php
//レスポンスのjson作成
function makeSentense($message){
	return array(
		'version' => "1.0",
		'sessionAttributes' => null,
		'response' => [
			'outputSpeech' =>[
				'type' => "SimpleSpeech",
				'values' => [
					'lang' => 'ja',
					'type' => 'PlainText',
					'value' => $message
				]
			],
			'directives' => null,
	        'shouldEndSession' => false
		]
	);
}


//メイン

$json_string = file_get_contents('php://input');
$jsonObj = json_decode($json_string);

$response = makeSentense("こんにちはザ・ワールド");

header("Content-Type: application/json; charset=utf-8");
echo json_encode($response);
?>

リファレンスはこのへんです。

https://clova-developers.line.me/guide/#/CEK/References/CEK_API.md#CustomExtRequestMessage

 

Clovaに何か話させるだけならとても簡単!

上記で書いたjsonを返せば「こんにちはザ・ワールド」と返してくれますw

 

各項目の意味ピックアップ。

  • sessionAttributes……例えば「ゲームを起動して」「1問目~」「2問目~」とclovaと連続でやり取りしたいときに必要なデータを保持する場所です。
  • response……ここに入れたものを話します
  • SimpleSpeech……短文タイプのシンプルなスピーチのタイプです…ってそのままですね(^-^;
  • directives……オーディオコンテンツ用です
  • shouldEndSession……falseだと連続で聞き取りモードになります。繰り返しおしゃべりできるモードですね。trueだと終了です。

 

 

 Clovaに入力した言葉を取得して、返信するスキルを作る

ついでにオウム返しのスキルも実装してみました。

まずは受け取るリクエストメッセージを見てみるとこんな感じになってました。

{
    "version": "1.0",
    "session": {
        "sessionId": "xxx",
        "user": {
            "userId": "xxx",
            "accessToken": "xxx"
        },
        "new": true
    },
    "context": {
        "System": {
            "application": {
                "applicationId": "com.otameshi01.com"
            },
            "user": {
                "userId": "xxx",
                "accessToken": "xxx"
            },
            "device": {
                "deviceId": "xxx",
                "display": {
                    "size": "l100",
                    "orientation": "landscape",
                    "dpi": 96,
                    "contentLayer": {
                        "width": 640,
                        "height": 360
                    }
                }
            }
        }
    },
    "request": {
        "type": "IntentRequest",
        "intent": {
            "name": "test_intent",
            "slots": {
                "greeting": {
                    "name": "greeting",
                    "value": "こんにちは"
                }
            }
        }
    }
}

 

色々と返ってきますが使うところはrequestの中の「value」です。

name部分は、この後説明しますが、サイトで設定した「インテント」と「スロット」です。質問したクエリが何の「インテント」か、何の「スロット」かを解析して送ってくれています。

 

このvalueを拾えば、入力した言葉を取得できそうです。

<?php

//レスポンスのjson作成
function makeSentense(
	$message, 
	$shouldEndSession
){
	return array(
		'version' => "1.0",
		'sessionAttributes' => null,
		'response' => [
			'outputSpeech' =>[
				'type' => "SimpleSpeech",
				'values' => [
					'lang' => 'ja',
					'type' => 'PlainText',
					'value' => $message
				]
			],
			'directives' => null,
	        'shouldEndSession' => $shouldEndSession
		]
	);
}


//requestからvalue取得
function getResponse($jsonObj){
	return $jsonObj->{"request"}->{"intent"}->{"slots"}->{"greeting"}->{"value"};
}


//メイン

$json_string = file_get_contents('php://input');
$jsonObj = json_decode($json_string);

$query = getResponse($jsonObj);
$response = makeSentense($query, false);

header("Content-Type: application/json; charset=utf-8");
echo json_encode($response);


?>

 

 phpだとこんな感じで書けそうです。

これで"半"オウム返しのスキルのコードが完成です。

(指定した部分の言葉しかとれないので"半")

 

Clova Skillの登録のやり方

LINE Developers でClova Skillを作ろう

 

まずはLINE Developersに遷移しましょう

LINE Developers

 

そうしたら「プロバイダーの新規作成」を行います。

プロバイダーは組織というか配給者というか、スキルをまとめる入れ物程度に考えておけばよいかと思います。

f:id:m_training:20180713001035p:plain

f:id:m_training:20180712224730p:plain

f:id:m_training:20180712224738p:plain

 

プロバイダーを作り終わったら、続いてClovaスキルです。

 

f:id:m_training:20180712224818p:plain

f:id:m_training:20180712224919p:plain

f:id:m_training:20180712224941p:plain

これでLINE DevelopersでClova Skillを作ることができました。

「作成してClova Developer Centerに移動」をクリックすると

Clova Skillを細かく設定するための「Clova Developer Center」に移動します。

 

Clova Developer Centerでスキルを設定しよう

 移動するとこのような画面になります。

「タイプ」の「カスタム」を選ぶと先に進めるようになります。

f:id:m_training:20180712225324p:plain

 

ガリガリと書いていきましょうw

 

f:id:m_training:20180712225604p:plain

 

f:id:m_training:20180712225636p:plain

各項目について

Extension ID

ここは○○.○○.○○といった形で書きます。他と被らないように設定しましょう。

 

スキル名……スキルに付ける名前です。

 

呼び出し名(メイン)

超大事なポイント!!

「{呼び出し名}を起動して」で作ったスキルを起動できます。

なのですが、音声認識(音声信号が言葉に変換される)しやすい言葉で書いた方がよいです。

googleとかsiriに音声入力で言葉を入力できますが、ソレをイメージすればよいです。

パソコンで日本語入力したときに一発で変換できるような言葉がベター。

「テスト」とか「モヒカン」とか「小松菜」とか。

 

呼び出し名(サブ)

ここは要は呼び出し名の「変換揺れ」を吸収する場所です。

例えば「ガヴリードロップキック」とメインを設定したとしましょう。

けど、音声認識させてみると(対話モデル->テスト->発話履歴で確認可能)

「がブリードロップキック」みたいになっているようなら

サブに

「がブリードロップキック」を入れることで変換揺れを吸収できます。

それと例えば音声認識ミスがあって「ガヴリドロッキク」みたいになってたとしたら

「ガヴリドロッキク」を入れることで、これも「ガヴリードロップキック」で認識されて起動することができます。

 

AudioPlayerの使用

オーディオ再生させるようなスキルを作るときに使いましょう

 

提供者について

「Extensionと連携するLINE ID」はMessaging APIなどと連携させるときに使用します。

 

f:id:m_training:20180712231059p:plain

サーバー設定では、先ほど作ったプログラムの場所を指定します。

httpsの必要があります!!

httpsを使えるようにがんばりましょう~(ぉ

 

アカウント連携

ここは何かしら認証がある場所と連携させる場合に使用します。

 

f:id:m_training:20180712231310p:plain

f:id:m_training:20180712231333p:plain

配布情報もガリガリと書いていきましょう。

 

代表サンプル発話

 

これは、そのスキルで使える発話です。

どんな音声コマンドがあるのかな、をここに記載します。

 

アイコン

512x512のみ!

 

f:id:m_training:20180712231543p:plain

規約の設定で終了です!

 

プライバシーポリシーのURL、利用規約のURL

企業さんになると特に重要なのがこの二つ。

用意してあるURLがあったら入力しましょう。

ここまでようやく基本情報の入力が終了です。

 

続いて「対話モデル」の設定が必要です。

 

 Clova Skillの「対話モデル」を作ろう!

「対話モデル」は、要は「入力された言葉を解析する場所」です。

例えば

「今日の大阪の天気は?」

「今日の大阪の湿度は?」

の答えを返すようなプログラムを作る側としては

「いつ」

「どこで」

「何を聞きたいか」

の3つの情報が欲しいわけです。

この対話モデルで、それら情報を取り出すための設計を行います。

 

カスタムスロットタイプを作ろう

 

 

f:id:m_training:20180712232247p:plain

f:id:m_training:20180712232310p:plain

f:id:m_training:20180712233138p:plain

カスタムスロットタイプは……

「"今日"の大阪の天気は?」

「"明日"の大阪の天気は?」

「"あさって"の大阪の天気は?」

 

これの「今日」「明日」「明後日」といった言葉はtest_slot(例)というスロットだ、というように設定する場所です。

 

代表語が、メインの言葉で、同義語が表記ゆれ、似たような言葉が来たときに「代表語」として認識されます。

たとえば上の例の同義語に「きょー」と入れたとしたら、「きょー」といったら「今日」と認識されるようになります。

 

 

カスタムインテントを作ろう

f:id:m_training:20180712233008p:plain

f:id:m_training:20180712233356p:plain

 

インテントは、入力された質問を分析する場所です。

まずは、作ったスキルでよく使う質問を書きましょう。

そしたら……

 

f:id:m_training:20180712233656p:plain

f:id:m_training:20180712233717p:plain

その質問のスロットを設定します。

「今日」をドラッグするとスロット作成のポップアップが表示されます。

そこにスロットを作って、先ほどのカスタムスロットを設定してあげます(例でいうと「今日」とか「明日」を設定したtest_slotを入れました)

この調子でバシバシ設定します。

 

f:id:m_training:20180712234023p:plain

「今日」「大阪」「天気」それぞれにスロットを割り当てた状態です。

 

 テストをしてみよう!

スロットとインテントを用意したらほぼ完成です!

動くかどうかサイト上でテストができます。

早速テスト……と行きたいところですが、まずは「ビルド」が必要です。

ポチっとしましょう。

で、お茶を飲みながら待ちましょう。10分は持っていかれます。

テストをすると、こんな感じで表示されます。

インテントで設定したスロットと値がちゃんと出ていますねw

 

f:id:m_training:20180712235535p:plain

 

送られるリクエストを見ても、ちゃんと「天気」「大阪」「今日」という必要データが抜き出して送られています。

{
    "version": "1.0",
    "session": {
        "sessionId": "xxx",
        "user": {
            "userId": "xxx",
            "accessToken": "xxx"
        },
        "new": true
    },
    "context": {
        "System": {
            "application": {
                "applicationId": "com.otameshi01.com"
            },
            "user": {
                "userId": "xxx",
                "accessToken": "xxx"
            },
            "device": {
                "deviceId": "xxx",
                "display": {
                    "size": "l100",
                    "orientation": "landscape",
                    "dpi": 96,
                    "contentLayer": {
                        "width": 640,
                        "height": 360
                    }
                }
            }
        }
    },
    "request": {
        "type": "IntentRequest",
        "intent": {
            "name": "test_intent",
            "slots": {
                "what": {
                    "name": "what",
                    "value": "天気"
                },
                "where": {
                    "name": "where",
                    "value": "大阪"
                },
                "when": {
                    "name": "when",
                    "value": "今日"
                }
            }
        }
    }
}

 

スロットに、博多、湿度というのも設定してみました。

これもちゃんと解析されています。

f:id:m_training:20180712235901p:plain

 

実機でスキルを起動しよう!!

最後にして感動の瞬間です!

「{呼び出し名}を起動して」というと、作ったスキルが起動します。

テストでうまく動いていればほぼほぼその通り動きます。

 

 

あれれ、Clovaがうまく認識してくれないぞ……

こんなときは、対話モデルの左側の「テスト」->「発話履歴」を使いましょう。

 

例:起動クエリ「テスターちゃん」といれたけど動かない。

発話履歴を見ると……「エスターちゃん」で認識されている!!

この場合は、呼び出し名(サブ)に「エスターちゃん」を入れましょう。

 

例:「今日の札幌の天気を教えて」が通らない

発話履歴を見ると……札幌がサッポロで認識されていた!

この場合は、スロットの代表語:札幌の「同義語」に「サッポロ」を入れましょう。

 

f:id:m_training:20180713000231p:plain