Clovaスキルの作り方 (Python編)

LINEが販売しているClovaのスキルを作成したので,その方法を記しておきます.

Clovaスキルのチャンネル作成する

clova-developers.line.me

Clova Developer Centerに行き,ログインしてもらってスキルチャンネルを作成してください.

f:id:MitubaEX:20180820235002p:plain

プロバイダーは自分のプロバイダーを選択,Extension IDは自分で適当に決めてください. あとは必要事項を入力して作成を押してください.

対話モデルの作成する

対話モデルにはインテントとスロットという二つの定義する必要があります.

  • インテント
    • サンプル発話を登録し,どういった発話を認識させるかを定義する
  • スロット
    • 実際に取得した単語の辞書を定義します.

インテントの作成する

カスタムインテントの+ボタンを押して,インテントを作成してください.

f:id:MitubaEX:20180821000756p:plain

名前は適当でいいと思います.作成したら以下の画面になると思います.

f:id:MitubaEX:20180821001014p:plain

そしてサンプル発話リストに,受け取りたい発話サンプルを入力してください.追加後は以下のような感じになると思います.今回は「たこ焼き食べたいな」の「たこ焼き」をスロット(辞書)に登録し,「たこ焼き」という単語をClovaが取得できるようにしてみます.最後に保存を押してくださいね.

f:id:MitubaEX:20180821001232p:plain

スロットの作成する

カスタムスロットの+ボタンを押して,スロットを作成してください.

f:id:MitubaEX:20180821001653p:plain

取得したい単語を入力して保存してください.今回はお好み焼きも追加しておきます.これによりたこ焼きに加えて,お好み焼きも取得できるようになります.

f:id:MitubaEX:20180821001933p:plain

インテントにスロットを適応する

サンプル発話のどこの単語を取りたいかを指定します.取りたい単語をマウスか何かしらで選択すると,以下のような画面になると思います.

f:id:MitubaEX:20180821002233p:plain

スロットの名前は適当で大丈夫です. そしてスロットタイプは先ほど作成したスロットを選択してください.

f:id:MitubaEX:20180821002757p:plain

ここまでできたら左上のビルドを押してください.ビルドには3~5分ほどかかるので,その間にプログラムを書いていきましょう.

プログラムを作成する

今回はPythonを利用します.バージョンは3.6.5です.(3系だったらおそらく大丈夫です)

ライブラリとしては以下の二つを利用します.

install

pipを利用して,installします.

pip3 install flask
pip3 install clova-cek-sdk

pip3で入らなかったら,pipでinstallしてください

コード

基本的には,起動時やインテント取得時などでハンドラを作成していきます.そして各ハンドラでは最後にメッセージを返してあげて終了です.アプリケーションIDは各自の設定したIDに置き換えてください.

from cek import Clova

# 設定
application_id = "<Your Application ID>"
clova = Clova(application_id=application_id,
              default_language="ja", debug_mode=False)

# 起動時に実行
@clova.handle.launch
def launch_request_handler(clova_request):
    return clova.response("こんにちは,たこ焼き食べたいなと言ってください")


# 終了時に実行
@clova.handle.end
def end_handler(clova_request):
    return


# インテントを取得したら実行
@clova.handle.intent("FoodsIntent")
def intent_handler(clova_request):
    # Konamonスロットタイプの単語を取得
    food_name = clova_request.slot_value('Konamon')
    return clova.response(str(food_name))



# デフォルトはこれを実行
@clova.handle.default
def default_handler(clova_request):
    return clova.response("すみません.もう一度お願いします")


from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/', methods=['POST'])
def my_service():
    resp = clova.route(request.data, request.headers)
    resp = jsonify(resp)
    # make sure we have correct Content-Type that CEK expects
    resp.headers['Content-Type'] = 'application/json;charset-UTF-8'
    return resp


if __name__ == "__main__":
    app.run()

実行

python3 main.py

ngrokによる,外部公開

別のターミナルを開いて,以下のコマンドを実行してください. ngrokが入っていない場合は,brew cask install ngrokで入ると思います.

ngrok http 5000

## 実行結果
Session Status                online
Session Expires               7 hours, 49 minutes
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://****.ngrok.io -> localhost:5000
Forwarding                    https://****.ngrok.io -> localhost:5000

この実行結果のForwardingのhttpsの方をコピーしておいてください.

アドレスをClova Developer Centerに登録する

スキルのページで基本情報の修正を選択してください.そしてサーバー設定を選択してください.

f:id:MitubaEX:20180821011338p:plain

先ほどコピーしたngrokのアドレスをサーバーのURLに貼り付けて,保存してください.

f:id:MitubaEX:20180821011506p:plain

これであとは対話モデルをテストするだけです.

対話モデルのテスト

対話モデルのウィンドウのテストを選択してください.

f:id:MitubaEX:20180821011745p:plain

さて,サンプル発話を入力して,テストを押してみましょう.

サーバーのURLが正しくできていた場合,ちゃんとレスポンスが返ってきてテスト結果に表示されたと思います.おそらく以下のような感じ.

f:id:MitubaEX:20180821012020p:plain

ついでにお好み焼きもスロットに登録しておいたので,試してみます.

f:id:MitubaEX:20180821012224p:plain

ちゃんと返ってきました.🎉

スロットに登録していない用語も試してみます.

f:id:MitubaEX:20180821012259p:plain

Noneが返ってきました.これはPython側で値を取得しようとしたけど,値がなかったことを意味します.辞書に登録してないものも取得できたら嬉しいなと思ったりしたりしなかったり.

実機テスト

実機でテストする際はスキルを作成したLINEアカウントとClovaでのLINEアカウントを同一にしておくと,「Clova,<スキル名>を起動して」で起動してくれます.実機で試す時の設定が特に必要ないのがいいところだと思いました.

サーバーを外部サーバーにデプロイする

私はherokuを利用しましたが,みなさんお好きな場所に置いてください.デプロイについては各自検索してもらえると助かります.🙇‍♂️

まとめ

今回はスキルの作成方法をざっくり説明してきました.jsでサーバーを書いている人が多い印象でしたが,今回は個人的に好きなPythonで書きました.みなさんもぜひClovaのスキルを作成してみてくださいね.😎

もっと拡張したい場合は,ライブラリの英語の公式ドキュメントを頑張って読んでもらえると助かります.