30分くらいでClova Extension Kit SDK for Python を使ったClova スキルを作る！（前編：スキル設定編）

みなさん、グランプリ賞金1000万円の「[LINE BOOT AWARDS 2018](https://www.line-community.me/awards/)」に向けて、Clova Skill やLINE BOT の開発は進んでいますか？

そんな中、Python ユーザー待望のClova Extension Kit SDK for Python（以下、PythonSDK）が先日リリースされましたので、これを使ってスキルを作ってみたいと思います。

[前回はAlexa Skill をPythonSDK(Beta) で作ってみました](https://qiita.com/sumihiro3/items/0a7b56671ed3f1864b89)が、今回はClova Skill に挑戦します。

Flask ベースのAWS 向けサーバーレス開発ツールである [Zappa](https://github.com/Miserlou/Zappa)を使って、Lambda + API Gateway + DynamoDB 環境で開発します。（詳しい使い方は後編で解説します）

Clova Skill の開発者登録や、AWS などの初期設定ができていれば、30分くらいで開発できると思います。
とはいえ、文章＋画像で説明すると長くなってしまうので、今回は前編としてスキルの作成と設定までの解説を行い、次回の後編でPythonSDK を使った実装部分を解説します。

* [後編：30分くらいでClova Extension Kit SDK for Python を使ったClova スキルを作る！（後編：実装編）](https://qiita.com/sumihiro3/private/9e24170cad4ad384f453)

スキルのテーマは、[前回](https://qiita.com/sumihiro3/items/0a7b56671ed3f1864b89)と同じご当地グルメ検索です。
各都道府県にあるご当地グルメを確認して、それぞれのご当地グルメの情報を確認できるようにします。
このスキルでできることは次の2種類です。

* 都道府県名からご当地グルメを調べる
    * 北海道のご当地グルメは
* 個別のご当地グルメの詳細を調べる
    * ザンギのことを教えて

こちらの動画のようなスキルを作ってみます。
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">試しに作ったご当地グルメ検索 スキルの実機テスト。<br>Python SDK を使ってみた。結構簡単にできましたよ。<br>ちょっと、説明のセリフが長すぎたかなぁ <a href="https://twitter.com/hashtag/Clova_CEK?src=hash&amp;ref_src=twsrc%5Etfw">#Clova_CEK</a> <a href="https://twitter.com/hashtag/LINE_API?src=hash&amp;ref_src=twsrc%5Etfw">#LINE_API</a> <a href="https://t.co/2UyHFQGffV">pic.twitter.com/2UyHFQGffV</a></p>&mdash; sumihiro3 (@sumihiro3) <a href="https://twitter.com/sumihiro3/status/1028098363739103232?ref_src=twsrc%5Etfw">August 11, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

それでは始めましょう！

# Clova Developer Center でスキル作成

## 新規チャネル作成

まずは、[Clova Developer Center](https://clova-developers.line.me/) を開き、画面中央の「スキルを開発する」ボタンをクリックします。
![Clova Developer Center](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/01_ClovaDeveloperCenter_01.png)

スキル一覧の下にある「LINE Developersでスキルチャネルを新規作成」ボタンをクリックしてます。
![チャネル作成](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/02_AddClovaExtension.png)

チャネル名に作成するスキル名を入力して、「入力内容を確認する」ボタンをクリックします。
今回は”ご当地グルメ”とします。
![チャネル作成](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/03_AddChannel_01.png)

チャネル名を確認して、「作成してClova Developer Centerに移動」ボタンをクリックします。
![チャネル作成](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/04_AddChannel_02.png)

## 新しいExtension を作成

次にスキルの基本情報などを登録します。

### 基本設定

* タイプ：”カスタム”選択
* Extension ID：リバースドメインで登録します。他のスキルと重ならないよう、取得しているドメインなどを使って入力しましょう。
    * 例：com.hoge.foo.barskill
* スキル名：ご当地グルメ
* 呼び出し名（メイン）：ご当地グルメ

![Extension基本設定](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/05_AddExtension_01.png)

* 呼び出し名（サブ）：音声認識のため表記が揺れることがあるので、ひらがなを主体に入力しました
    * 例：ごとうちぐるめ
* 提供者名：ご自分のお名前やチーム名などを入力
* 担当者メールアドレス：ご自分のメールアドレスを登録

![Extension基本設定](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/06_AddExtension_02.png)
規約などを確認したらチェックを入れて「作成」ボタンをクリックします。

### サーバー設定

Clova プラットフォームから呼び出されるサーバー側アプリのURL（HTTPS必須）を入力して「次へ」ボタンをクリックします。
まだサーバー側を設定していないので、仮のアドレスを入力しておきます。
![チャネル作成](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/07_SettingServerInfo.png)

### 配布情報

スキルのユーザー側が見る情報を入力していきます。

* カテゴリ：地域を選択しました
* 審査担当者へのコメント：記入例を参考に入力します

![配布情報](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/08_SettingDistribution_01.png)

* Extension の説明（ユーザー向け）：記入例を参考に入力します
* 代表サンプル発話：以下記入例です。？などの記号は入力できないようです。
    * ねぇClova、ご当地グルメを開いて
    * 北海道のご当地グルメは
    * ザンギのことを教えて

![配布情報](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/09_SettingDistribution_02.png)

* 検索キーワード：ご当地グルメ
* アイコン：512×512の画像を用意します。
* 対象デバイス：全部チェック（デフォルトのまま）

![配布情報](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/10_SettingDistribution_03.png)

入力内容に問題がなければ「次へ」ボタンをクリックします。

### 個人情報の保護および規約同意

* 購入／支払い機能はありますか？：いいえ
* 個人情報を取得しますか？：いいえ

![個人情報保護](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/11_SettingPrivacy.png)

内容に問題なければ「保存」ボタンクリック後、「対話モデル」ボタンをクリックすると、対話モデル : ダッシュボード画面が表示されます。

## 対話モデルの構築

いよいよ、どのように会話するかの”対話モデル”を設定します。

### ご当地グルメを調べたい都道府県名を判別するインテントの作成

ユーザーの文脈や意図を判別するインテント（Intent）を作っていきます。
まずは、ご当地グルメを調べたい都道府県名を判別するインテントです。

対話モデル : ダッシュボード画面左側メニュにある「カスタムインテント」右の＋ボタンを押し、カスタムインテント名を入力して「作成」ボタンをクリックします。
インテント名は、”FindGourmetByPrefectureIntent”とします。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/12_AddIntent_01.png)

### 都道府県名を判別するビルトイン スロットタイプを有効にする

Clova では標準で日本の都道府県名や市区町村名、祝日名を判別するビルトイン スロットタイプが用意されています。
公開当初から日本向け機能が備わっているあたりが、日本を主戦場の一つにしているLINE ならではですね。
知らずにカスタム スロットタイプを作ったのは内緒です :-)

それでは都道府県名用のビルトイン・スロットタイプを有効にします。
対話モデル : ダッシュボード画面左側メニュの下にある「ビルトイン スロットタイプ」右側の＋ボタンを押し、ビルトイン スロットタイプの一覧から「CLOVA.JP_ADDRESS_KEN」にチェックを入れて、「保存」ボタンをクリックすると有効となります。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/13_AddBuiltinSlotType.png)

### インテントのスロットを設定する

有効にした都道府県名のスロットタイプを、インテントのスロットに設定します。
スロットはインテントに必要な引数みたいなものです。

画面左側メニュのカスタムインテント下にある「FindGourmetByPrefectureIntent」を選択し、「スロットリスト」欄に”prefecture”と入力して、右側の＋ボタンをクリックしてスロットを追加します。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/14_AddSlotList_01.png)

追加した”prefecture”スロットのスロットタイプを設定します。
スロットタイプはプルダウンリストから選択できます。先ほど有効化したビルトインスロットタイプ「CLOVA.JP_ADDRESS_KEN」をプルダウンリストから選択すればOKです。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/15_SetSlotType_01.png)

### インテントのサンプル発話を登録する

ユーザーからどのように話しかけられたときに、このインテントで解釈するかを識別するため、話しかけられ方のサンプルを登録します。

サンプル発話リスト欄に、話しかけられ方の例を入力し、右側の＋ボタンをクリックします。
ここでは”北海道のご当地グルメは”と入力します。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/16_AddSampleSpeech_01.png)

入力したサンプル発話には、都道府県のスロット（”prefecture”）が含まれます。
この入力例では”北海道”がそれに当たるので、”北海道”という文字列をドラッグして選択し、候補として表示されるスロット（”prefecture”）の右側にある「選択」ボタンを押して、スロットとして割り当てます。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/17_SelectSlotType_01.png)

想定される話しかけられ方をサンプル発話に入力して、同じようにどこがスロットに当たるかを選択してスロットタイプを割り当ててください。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/18_AddSampleSpeech_02.png)
サンプル発話を入力したら保存ボタンを押しておきます。

### カスタム スロットを登録する

今度はご当地グルメ名をカスタムスロットとして登録します。

画面左側メニュの「カスタムスロットタイプ」右にある＋ボタンをクリックして、新しいスロットタイプを作成します。
”新しいスロットタイプのタイトル”欄にスロット名を入力して、右側の「作成」ボタンをクリックして登録します。
ここではスロット名を”LOCAL_GOURMET_TYPE”とします。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/19_AddCustomSlotType_01.png)

### カスタムスロットの辞書データを登録する

カスタムスロットとしてご当地グルメ名を登録していきます。
1件ずつ登録するのは大変ですので、ここではTSVファイル（タブ区切りのテキストファイル）を使って登録します。
登録するTSVファイルは行単位に辞書データを持ち、１列目に代表語を、２行目以降は任意に同意語を列挙していきます。

```TSV:辞書データのTSVファイル（例）
豚丼	ぶたどん	ブタドン
カレーラーメン	かれーらーめん	カレーラーメン
ザンギ	ざんぎ	ザンギ
エスカロップ	えすかろっぷ	エスカロップ
```

一括でスロットの辞書データを登録するには、辞書データのTSVファイルを「対話モデル：スロットタイプを追加」画面からアップロードします。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/20_AddCustomSlotType_02.png)

画面右側の「アップロード」ボタンをクリックし、表示されるファイル選択画面からアップロードする辞書データのTSVファイルを選択して「アップロード」ボタンをクリックして実行します。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/21_AddCustomSlotType_03.png)

エラーがなければ、スロットタイプの辞書欄に辞書データが登録されますので、保存しておきます。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/22_AddCustomSlotType_04.png)

### インテントの新規作成＆スロットを設定する

次にご当地グルメ名を話しかけられた際のインテントを作成します。

先ほどと同じように、画面左側メニュからカスタムインテントを追加し、カスタムインテント名を入力して「作成」ボタンを押して登録します。
インテント名は”FindGourmetByNameIntent”とします。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/23_AddIntent_02.png)

また、先ほどと同じようにスロットタイプ”gourmet”を登録して、先ほど登録したカスタムインテント”LOCAL_GOURMET_TYPE”を指定します。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/24_AddSlotList_02.png)

### サンプル発話の登録とビルド

”FindGourmetByPrefectureIntent”インテントのときと同じように、サンプル発話を登録します。
”ザンギのことを教えて”などとサンプル発話を入力し、ご当地グルメ名をスロット”gourmet”に割り当ててください。
![インテント](https://s3-ap-northeast-1.amazonaws.com/my-qiita-images/clova_skill_python_sdk/25_AddSampleSpeech_03.png)

サンプル発話を一通り入力したら、画面左上の「ビルド」ボタンをクリックして、使える状態にします。この処理は３分ほどかかるようなので、気長に待ちましょう。

# 後編へ続く

前編となるスキル設定部分はここまでです。
[後編](https://qiita.com/sumihiro3/private/9e24170cad4ad384f453)はpythonSDK を使って実装していきます！

* [後編：30分くらいでClova Extension Kit SDK for Python を使ったClova スキルを作る！（後編：実装編）](https://qiita.com/sumihiro3/private/9e24170cad4ad384f453)

# 参考資料

* [簡単なExtensionを作成する](https://clova-developers.line.me/guide/#/CEK/Tutorials/Build_Simple_Extension.md)
* [本日リリース！LINE Clovaのスキル開発の始め方〜申請編〜](https://dotstud.io/blog/line-clova-skill-tutorial/)