【入門】CEKでのClovaスキル開発ポイントまとめ

# はじめに
[LINE Clovaスキル開発ハンズオンに参加してきた](https://www.hands-lab.com/contents/?p=8669)ので、
質問のでていたところ、注意が必要そうなところをまとめていこうと思います。


# 今回のハンズオンの概要
CEKを使用して占いスキルを作りました。

- コーディング部分　:　gitからまるっと取得
- サーバーの手配　　:　herokuを使用

サンプルコードが用意されており、サーバー手配もherokuでお手軽なので
gitと一般的なCLIにある程度親しんでいる方なら資料通り開発できるのではないでしょうか。


# 事前準備
- スキル開発アカウントと紐付けられたLINEアカウント
- Node.jsのLTS（最新安定版）をインストール


# 当日のハンズオン資料
- **[資料リンク](https://www.dropbox.com/s/547siacriaudy4f/CEK_Handson%1D_0729.pdf?dl=0)**
- **ざっくり流れ**
    - ハンズオンで作成するスキルの動作フロー
    - スキルの登録
    - 対話モデルの登録
        - 対話モデルとは
        - スロットとは
        - インテントとは
        - 設定画面
    - Heroku
        - アカウント作成
        - CLIインストール（このheroku-cliのインストールで同時にgitもインストールされるはず）
    - デプロイ
        - gitからclone
        - herokuにデプロイ
        - 環境変数の設定
        - さっき作ったスキルと紐付け
    - 実機テスト
    - [コメントにてコードの解説](https://github.com/stachibana/cek-handson-fortune/blob/master/index.js)
    - NextStep
        - お題
        - 対話モデル例
        - コーディング例
    - Clovaスキルが活きるシーン例
    - LINE BOOT AWARDS2018のお知らせ
    

# 開発を進める上でのポイント
では資料に補足する形でポイントを解説していきたいと思います。


## 呼び出し名（資料14ページ）
#### 今回作成するスキルの基本情報は下記の通り。

|項目|入力内容|
|:--|:--|
|タイプ|カスタム|
|Extension  ID|リバースドメイン形式の文字列。わからない方は「com.あなたのフルネーム.skill.first」としてください|
|スキル名|サンプル占い|
|呼び出し名(メイン)|サンプル占い|
|呼び出し名(サブ)|サンプルふらない|
|AudioPlayerの使用|いいえ|
|提供者について|個人>欄を埋める。LINE  IDは入力不要|

メインの呼び出し名が「サンプル占い」になっているのに対し、
サブの呼び出し名が「サンプルふらない」になっています。
これはClovaが「サンプル占い」というユーザーの発話を「サンプルふらない」と誤認識してしまった場合の対策です。

Clovaがユーザーの音声をテキスト変換した際に、どのように認識されるのか、
CEKのシミュレーターから見られる発話履歴などから確認してみましょう。

#### 「対話モデル」の編集から「テスト」を開くと表示される「発話履歴」を開きます。
<img width="1172" alt="Clova_Extensions_Kit_-_Interaction_Model_Builder.png" src="https://qiita-image-store.s3.amazonaws.com/0/210788/346c0c19-19eb-93f4-61c9-8beacde948a3.png" border="1px">
↑発話履歴をONにしてから、開発アカウントに紐付いているClovaに話しかけてみます。

<img width="1175" alt="Clova_Extensions_Kit_-_Interaction_Model_Builder_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/210788/1d933835-1c06-f63d-e8c6-469c042bf208.png" border="1px">
↑このように発話履歴が見られます。

どのスキルの対話モデルから開いても共通の発話履歴を見ることができます。
例えば「サンプル占い」の対話モデルから発話履歴を開いているときに「東急ハンズ」スキルについて発話しても
そのままの発話履歴画面で確認することができます。

漢字変換がおかしい、違う言葉に認識されてしまう場合は、
その言葉をサブ呼び出し名に登録してカバーしていきましょう。
ただし、表記や音声認識の揺らぎに関係のない、全く異なる呼び出し方を設定することはできません。


## 基本情報の入力ができたら（15ページ）
基本情報の入力が終わって次に進むと、サーバー設定画面に遷移しますが、
多くの場合、「えっまだサーバー側の用意できてないんだけど・・・」と思うと思います。

基本情報の入力が終わったら、**保存ボタンだけしっかり押して**
画面上部の「スキル設定」からスキル一覧に戻ってしまいましょう。
大丈夫です。
一覧には先程作成しかけたスキルがきちんと追加されているはずです。

## 大量の対話モデルの登録（21ページ）
画面から大量に対話モデルを追加するのは少し大変ではないかと思います。
スロットの登録、サンプル発話は数件だけ登録して保存したら
画面上部右からダウンロードしてみましょう。

<img width="750" alt="Clova_Extensions_Kit_-_Interaction_Model_Builder_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/210788/2da64b21-e0f8-b088-e936-7d4f7fa4c848.png">

登録した内容がtsv形式ファイルに変換されてダウンロードできます。
あとはここにどんどん追記して再度アップロードしましょう。
画面から登録するよりもずっと楽だと思います。（個人の感覚か・・・？）

#### カスタムスロット
```tsv:カスタムスロット例.tsv
水瓶座	みずがめ座	みずがめ
乙女座	おとめ座
```
カスタムスロットの場合は、代表語に続けてタブ区切りで同義語を記載していきます。

#### インテント
```tsv:インテント登録例.tsv

[INTENT SLOT]
zodiac_signs	zodiac_signs

[INTENT EXPRESSION]
占って
<zodiac_signs>水瓶座</zodiac_signs>
<zodiac_signs>乙女座</zodiac_signs>を占って

```
インテントごとにスロット名を定義して、そこへ用意しておいたスロットを紐付ける必要があります。
`[INTENT SLOT]`はスロット名、タブ区切りでスロットタイプを記載します。

またサンプル発話にスロットを含む場合は、上記のようにスロットにあたる単語を
スロット名のタグで囲む必要があります。
スロットを使用しないインテントを作成することも可能です。

#### スロット名が重複してしまった場合
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">スロットが重複になってしまった場合は、現状削除ができない仕様なので、インテントをもう一度作った方が早いかもです<a href="https://twitter.com/hashtag/linebootawards?src=hash&amp;ref_src=twsrc%5Etfw">#linebootawards</a> <a href="https://twitter.com/hashtag/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC%E5%8B%89%E5%BC%B7%E4%BC%9A?src=hash&amp;ref_src=twsrc%5Etfw">#スマートスピーカー勉強会</a> <a href="https://twitter.com/hashtag/Clova_CEK?src=hash&amp;ref_src=twsrc%5Etfw">#Clova_CEK</a> <a href="https://t.co/GJzkkY02Zl">pic.twitter.com/GJzkkY02Zl</a></p>&mdash; show (@surumegohan) <a href="https://twitter.com/surumegohan/status/1023437899268669440?ref_src=twsrc%5Etfw">2018年7月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
当日はこのような現象が報告されていましたが、さきほど再現しようとしたところ
重複エラーチェックが走って登録できなかったので
もしかすると既に対応が入れられたかもしれません。

## インテント名の登録（23ページ）
ここで登録するインテント名は、コードの中に記述されているインテント名と一致している必要があります。

```js:index.js

const intent = responseHelper.getIntentName(); 
let speech; 
switch (intent) { 
  case 'FortuneIntent': 

    // FortuneIntentの処理　

    break;

}
// 以下略

```
↑[解説](https://github.com/stachibana/cek-handson-fortune/blob/master/index.js)より省略して抜粋

このようにCEKから送られてきたリクエストの中身に含まれる`intent`から処理を分岐しているので
今回のハンズオンでは必ずインテント名を`FortuneIntent`で登録してください。


# ここまでできればあとはデプロイするだけ！
CEKを扱う上でのポイントはこんなかんじでしょうか。
あとはgitとherokuの扱いになります。

CLIの操作は資料からコピー＆ペーストで概ね問題なく進められると思いますが、
どうやら資料からコピーする際、スペースが抜けてしまうようなのでその点だけ注意！
資料をよく見て、適切な命令文になっていることを確認してから実行しましょう。


# おわり
うまく動かせましたか？

この記事やハンズオン資料を見ながら開発していてわからないところがあれば
コメントいただければ可能な限り回答したいと思いますのでぜひ。

ハンズオン資料の最後にはLINE BOOT AWARDのお知らせもあるので
スキルを開発して、ぜひ応募してみましょう！