スマートスピーカースキルの対話モデル変換ツール

この記事は [スマートスピーカー2 Advent Calendar 2018 1日目](https://qiita.com/advent-calendar/2018/smart-speaker-2) の記事です。

# はじめに

現在、Google Home（Google Assistant）、Amazon Echo（Alexa）、LINE Clovaの3プラットフォームでスキル開発が行えますが、それぞれ実装方法は異なります。
しかし3プラットフォームとも共通しているのが、対話モデルをWeb画面で入力し、処理をエンドポイントのFaaSなり（AWS Lambda、Firebase Functions）で実行させるという仕組みです。

複数プラットフォームで同じスキルをリリースする場合、エンドポイントはNode.jsをはじめとしたプログラム言語となるので、コアロジックを分離させて設計すれば移植は比較的容易となります。
しかし対話モデルはUI/構造が三者三様であり、インポート/エクスポート可能ではあるもののファイル形式/データ構造もバラバラです。

[ Dialogflow (Google Assistant) コンソール画面 ]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207109/7edf1182-8b9e-eb13-0cd7-c65cfeca0725.png)

[ Alexa コンソール画面 ]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207109/45ee9306-04df-9864-b394-4379425ec8c5.png)

[ Clova コンソール画面 ]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207109/61522731-a936-bb95-985b-92dcad9817e4.png)

そのためスキル移植の際はプラットフォームごとにインテント、スロットを打ち直さなければなりません。
これはエクスポートデータを直に編集するにもファイル形式/データ構造がバラバラなためツラみが強く、かといってWeb画面からGUIポチポチもなかなかのツラみです。
そもそもこんなところで時間を食うのはスキル開発の本質ではありません。

なので私自身のスキル開発効率化のため作成した対話モデル変換ツールをご紹介させて頂こうと思います。



# Dialogflow2AlexaSkillJson
まずはGoogle Assistantの中身実装で一般的に使われているDialogflowからAlexaへの対話モデル変換ツールです。

[Dialogflow2AlexaSkillJson (GitHub)](https://github.com/miso-develop/dialogflow2alexa-skill-json)

私自身のスキル開発経験の流れとして`Google Assistant -> Alexa`という順番でスキル開発を行っていたため、最初のAlexaスキル作成時に作ったのがこちらのツールになります。
現仕様としては`Google Assistant -> Alexa`は変換可能ですが、その逆の`Alexa -> Google Assistant`は対応していません。

情報量としてはDialogflowの方が多く、特にインテント、エンティティーにそれぞれIDが振られていたりファイルが細かく分割されていたりします。
また対話モデルの仕様としてDialogflowよりもAlexaの方が厳密だったりと（数字は漢数字でないといけなかったり、英単語をスロットに使えなかったり）、変換されたJSONをそのまま突っ込むだけだとちょいちょいコンソールに怒られます。
ただ何がダメかは親切に教えてくれるのでそれに沿って手直ししていけばなんとかなります。

## 使い方

### インストール
以下のコマンドを実行。

```
git clone https://github.com/miso-develop/dialogflow2alexa-skill-json
cd dialogflow2alexa-skill-json
npm i
```

### Dialogflowのエクスポート
* Dialogflowの[コンソール](https://console.dialogflow.com/api-client/)にてAgent名横の歯車をポチ
* 「Export and Import」タブをポチ
* 「EXPORT AS ZIP」ボタンをポチ
* zipファイルを保存

### Alexa Skill Jsonの生成
以下のコマンドを実行。

```
node index.js dialogflow.zip
```

同ディレクトリに`alexa-skill.json`が生成されます。

### Alexa Skillへ反映
* Alexaの[コンソール](https://developer.amazon.com/alexa/console/ask/build/)にて「Build」タブをポチ
* 「JSON Editor」をポチ
* `alexa-skill.json`を「Drag and drop a .json file」にドラッグ&ドロップ
* `Skill Invocation Name（スキル名）`を手入力して下さい



# Alexa2Clova
続いてAlexaからClovaへの対話モデル変換ツールです。

[Alexa2Clova (GitHub)](https://github.com/miso-develop/alexa2clova)

こちらは`Alexa -> Clova`と`Clova -> Alexa`の双方向への変換に対応しています。
AlexaとClovaは仕様が似ているため比較的すんなり移植できます。
難点としてはClovaの対話モデルが各インテント/スロットごとにTSVをインポート/エクスポートしなければならない点です。
AlexaはJSONをコンソールにポイっと投げ込むだけなのでとても楽ちんです。

## 使い方

### インストール
以下のコマンドを実行。 

```
git clone https://github.com/miso-develop/alexa2clova .
```

### AlexaスキルモデルJSONからClovaスキルモデルTSVを出力

#### alexa.jsonの作成
「index.js」と同じディレクトリに「alexa.json」を作成。
「alexa developer console」の「JSON Editor」のJSONをコピペ。

```
touch alexa.json
## ↑にJSON Editorの中身をコピペ！
```

#### TSVのエクスポート

```
node index.js alexa.json
```

`alexa2clova`ディレクトリとその配下に`intents`ディレクトリと`slots`ディレクトリが作成され、TSVが出力されます。
あとは「Clova Developer Center」の対話モデル画面からアップロード！



### ClovaスキルモデルTSVからAlexaスキルモデルJSONを出力

#### Clovaスキルモデルのダウンロード
「Clova Developer Center」の対話モデル画面よりインテント、スロットタイプをそれぞれダウンロード。
「index.js」と同じディレクトリに「clova」ディレクトリを作成し、ダウンロードしたTSVを格納。

```
mkdir clova
## ↑にダウンロードしたTSVを格納！
```

#### JSONのエクスポート

```
node index.js -r clova
```

「clova2alexa.json」が出力されます。
あとは「alexa developer console」の「JSON Editor」にD&D！



# まとめ
以上、ご紹介させて頂いたツールにより以下の関係の対話モデル変換が可能となります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/207109/d237aaf4-7fde-5e2b-3870-9de9b3ac93b2.png)

また、どのプラットフォームの対話モデルをどのプラットフォームへ変換できるのかは以下の表のようになります。
`Google Assistant -> Clova`はDialogflow2Alexa、Alexa2Clovaを順にかましていけば変換可能です。

| 変換元 | 変換先 | ツール |
| --- | --- | --- |
| Google Assistant | Alexa | Dialogflow2Alexa　|
| Google Assistant | Clova | Dialogflow2Alexa <br> Alwxa2Clova |
| Alexa | Google Assistant | 未対応 |
| Alexa | Clova | Alexa2Clova |
| Clova | Google Assistant | 未対応 |
| Clova | Alexa | Alexa2Clova |



# さいごに
こんな感じで私自身が必要に駆られた際に必要な分だけ作ったツールではありますが、スマートスピーカースキルをクロスプラットフォーム展開する際には効率化のために必須なツールだと思います。

現状`Google Assistant -> Alexa`、`Alexa <-> Clova`でツールが分かれてしまっていたり、
Google Assistantへの変換対応をできていなかったり、Pull Requestを見逃してしまっていたり、
いつか訪れるであろうプラットフォーム側仕様変更に対する対応修正に怯えていたりと、
一人でメンテしていくにはなかなか時間がとれない状況なのでOSSっぽく一緒に開発するよって方いらっしゃいましたら是非ともご協力頂けると嬉しいです。。。
何卒、何卒、、、

[田中みそ](https://twitter.com/miso_develop)