新規のExtensionを作成する際、すでに持っている技術やサービスを、どうすればユーザーが心地よく利用できるか考慮して設計する必要があります。このドキュメントは、ユーザーの役に立つサービスを提供するために、Extensionを設計する際に守るべき事項についてのガイドラインを提供します。
ウェブサービスの情報照会、ショッピングおよび宅配サービス、対話型のゲーム、放送またはリアルタイムのブリーフィング、IoTデバイスの制御、その他の音声を使用したアクティビティやサービスを提供するExtensionを作成することができます。Extensionを設計するとき、以下の内容に準ずる必要があります。ちなみに、ここで扱っている内容はExtension設計の基本推奨事項で、簡単な例を挙げながら説明されています。お持ちのビジネス経験とサービスの特性によって、もっと多くの可能性を持つExtensionに設計・実装することもできます。
Extensionの設計は、まず最初にExtensionの目標を設定することから始まります。Extensionの目標とは、具体的にユーザーに何をどうやって届けるかを決めることです。Extensionの目標を設定すると、これからユーザーにどんな機能を提供して、ユーザーがその機能をどんなシナリオで使用するか予測する根拠となります。Extensionの目標として、次のような根本的で抽象的な目標が一例として挙げられます。
ユーザーにピザの宅配サービスを提供する。
このように設定したExtensionの目標は、もっと具体的な目標に書き換えることができます。具体的な目標を定義する際、次の項目を参考する必要があります。
以下は、ピザの宅配サービスを考慮して作成した具体的な目標の例です。
目標ID | カテゴリ | 目標 |
---|---|---|
#1 | サービスの呼び出し | ユーザーが「ピザボットを起動して」とCLOVAに呼びかけると、ピザの宅配サービスを使用できる。 |
#2 | 利用の提案や推奨 | ピザの宅配サービスが開始されると、ユーザーはピザの注文に必要なアクションの案内を受けることができる。 |
#3 | サービス提供者の確認および選択 | ユーザーはピザのサービス提供者を選択できる。 |
#4 | メニューの確認および選択 | ユーザーはピザのメニューを確認して選択できる。 |
#5 | 注文および支払い | ユーザーはピザの種類、数量および配達先の住所を入力して、ピザを注文できる。 |
#6 | 利用の提案や推奨 | ユーザーがピザのサービス提供者を選択すると、最近の注文履歴からピザの種類、配達先および支払い方法が提案される。 |
#7 | メニューの提案や推奨 | ユーザーが他のメニューをリクエストすると、別のメニューを推奨される。 |
#8 | 注文および支払い | ユーザーはカメラを使用してクーポンを利用できる。 |
#9 | 配達状況の確認 | 注文が完了すると、ユーザーはピザの準備状況および配達状況を確認できる。 |
#10 | サービス終了 | ユーザーが希望する作業を完了すると、サービスを終了できる。 |
... | ... | ... |
メモ
こうして作成された目標は、ユーザーシナリオのスクリプトを作成する時や、対話モデルを定義する際の基盤情報となります。また、Extensionを配布する際にその情報を登録する必要があります。その情報に基づいて、Extensionが正しく動作するか審査を受けることになります。
ユーザーシナリオのスクリプトは、ユーザーとCLOVAの対話をあらかじめ想定したものです。具体的な目標に基づき、様々なユーザーシナリオで起こるユーザーとCLOVAの対話を予測することで、サービスの利便性、流れなどを点検することができます。目標を設定するで決めた具体的な目標に基づいて、予想されるユーザーシナリオのスクリプトを作成します。後ほど対話モデルを登録する際に再使用できます。
ユーザーシナリオのスクリプトは、次の事項を考慮して作成することをお勧めします。
以下は、ユーザーシナリオのスクリプトを作成した例です。
発話の主体 | サンプル発話 | 関連する目標ID |
---|---|---|
ユーザー | ピザボットを起動して。 | #1 |
Extension | 登録されたピザ屋は、XXピザとYYピザがあります。どちらにしますか? | #2、#3 |
ユーザー | XXピザにして。 | #3 |
Extension | コンビネーションピザ、ペパロニピザ、スーパー・シュプリームピザがあります。どれを注文しますか? | #4 |
ユーザー | コンビネーションピザを注文して。 | #4 |
Extension | XXピザのXX店に、コンビネーションピザ1枚、コーラ1.5リットル1本を新宿区新宿4丁目1-6に配達します。合計金額は2,300円、お支払い方法は配達員に現金払いです。よろしいですか? | #3、#4、#6 |
ユーザー | 他のメニューにして。 | #7 |
Extension | スーパー・シュプリームピザ1枚、コーラ1.5リットル1本を新宿区新宿4丁目1-6に配達します。合計金額は2,650円、お支払い方法は配達員に現金払いです。よろしいですか? | #2、#7 |
ユーザー | うん。 | #5 |
Extension | 注文が完了しました。 | #2 |
ユーザー | ピザボットを終了して。 | #10 |
新しくExtensionを作成する際には、スキル名 と 呼び出し名 を設定する必要があります。 スキル名 とは、スキルストアに表示されるCustom Extensionの表示名です。また、呼び出し名 は、ユーザーがExtensionを起動する際にCLOVAに話しかけるための名称です。
スキル名と呼び出し名は、必ずしも同じ表記である必要はありません。ただし、スキル名と呼び出し名の内容が大きく異なる場合や、コンテンツの内容と無関係な名称、またはユーザーを混乱させる可能性のあるものは避けてください。
スキル名/呼び出し名は、次の条件を満たしていることが必要です。
単語1語のスキル名/呼び出し名は、許可されません。2語以上であっても「スポーツニュース」等の汎用的な言葉は、審査中に他者が取得して使用できなくなる場合があります。また、ビルトインスキルに影響する可能性がある場合は、将来的に登録された呼び出し名でスキルを起動できなくなることがありますので、あらかじめご了承ください。これらの状況を避けるために、呼び出し名には開発者名やサービス名等をかけ合わせることを推奨します。
例外として、独自のブランドまたはサービス名等は1語であったとしても利用することができますが、他者の知的財産権を侵害するものはこの限りではありません。
人名や地名、場所のみで構成されたスキル名/呼び出し名は許可されません。
例外として、スキル名/呼び出し名の一部として使用することは可能です。
CLOVAの機能に影響があるフレーズを含めることはできません。
なお、呼び出し名は、呼び名やスキルを実行するフレーズと組み合わせたときに、自然な言い回しである必要があります。
他のスキルで利用されているスキル名/呼び出し名は使用しないでください。また、呼び出し名が他スキルと類似している場合や、システムに悪影響する場合も許可されない可能性があります。
以下に該当する場合は、呼び出し名が許可されません。
CLOVA Extensions Kit利用規約を遵守しなければなりません。第三者の権利の侵害したり、わいせつな表現を用いたりした呼び出し名であってはなりません。
メモ
一部例外がある場合がありますので、判断が難しい場合は、審査時にコメントを記載いただきますようお願いいたします。
呼び出し名は、音声認識結果によって表記がゆらぐ可能性があります。スキルを正しく呼び出すために、呼び出し名(メイン) の他に 呼び出し名(サブ) を設定することが可能です。
呼び出し名(サブ) とは、表記や音声認識のゆらぎを補ってスキルを起動しやすくするものです。
例えば、「ネコちゃんの鳴き声」という表記のみが呼び出し名(メイン)に登録されている場合、音声認識の結果が「ねこちゃんの泣き声」となってゆらぎが発生すると、スキルを正しく起動できないことがあります。
このような場合は、次のように 呼び出し名(サブ) を設定すると、スキルを起動しやすくすることができます。
呼び出し名(メイン) | 呼び出し名(サブ) |
---|---|
ネコちゃんの鳴き声 | ねこちゃんの泣き声 猫チャンのなき超え ねこちゃんとなきごえ ねこちゃんこ鍋 |
呼び出し名(サブ)を定義する際は発話テストを行って音声認識結果を確認し、実際に認識された表記を設定することを推奨します。
呼び出し名(サブ)を定義する際は、対話モデルのテストの発話履歴機能を利用して、次のようなパターンでCLOVAデバイスに呼びかけた場合の音声認識結果を確認します。
発話テストを複数回繰り返し、その中で多かった認識結果から<呼び出し名>にあたる部分の表記を抜き出してExtensionの基本情報の呼び出し名(サブ)に入力します。
CLOVAデバイスの実機を使用して発話履歴(音声認識の結果)を確認する手順については、CLOVAデバイスでテストするを参照してください。
メモ
「を起動して」などの実行フレーズを含まない、「ねぇCLOVA、<呼び出し名>」といった呼び出し名だけによるスキル起動は、CLOVAの既存機能に影響がない場合のみ可能です。
なお、CLOVAの機能拡張が行われた場合や、音声認識結果の表記のゆらぎが再度発生した場合は、呼び出し名のみでスキルを起動できなくなる可能性があります。
音声から認識されたユーザーのリクエストは、まずサービスの提供に必要なフォーマット(JSON)に変換され、Extensionに渡されます。例えば、ピザの宅配サービスを提供するCustom Extensionがあると仮定します。その場合、ユーザーから「ペパロニピザを2枚注文して」のようなリクエストが入力されます。CLOVAの対話モデルとは、このようなユーザーのリクエストを、次のようにサービスの提供に必要な標準形式(JSON)に変換するルールを定義したものです。
対話モデルをCLOVA Developer Centerで定義するには、まず対話モデルとは何であるかを理解する必要があります。対話モデルをきちんと理解せずに定義してしまうと、パフォーマンスが低いか、ユーザーのリクエストを正しく処理できないExtensionになる可能性があります。ユーザーの実際の意図をうまく把握する対話モデルを作成するためには、対話モデルを作成する前に、まず以下の内容を理解して、設計に反映する必要があります。
インテントは、Extensionが処理するユーザーのリクエストを区分したカテゴリーです。主にユーザーの発話で使われた動詞型の要素によって区別されます。インテントには、カスタムインテントとビルトインインテントの2種類があります。
カスタムインテントはビルトインインテントとは違って、提供するサービスに特化したユーザーリクエストのカテゴリーを定義します。次のような内容が定義されています。
先ほど例として挙げたピザの宅配サービスの場合、次のようなリクエストのカテゴリーが考えられます。
ピザの宅配サービス(Extension)の対話モデルを定義するということは、メニュー確認インテント、注文インテント、配達状況確認インテントのようにインテントのリストを宣言して、それぞれのインテントが必要とする情報(スロット)とサンプル発話を列挙するということです。従って、対話モデルを定義する際、一番最初に、Extensionが処理するリクエストのカテゴリーを定義し、列挙する必要があります。これはExtensionを開発する際に、ビジネスロジックでプログラムの分岐を分ける基準にもなります。
ユーザーリクエストのカテゴリーを区分したら、次はカテゴリーごとに名前を定義します。 これがインテント名です。ピザの宅配サービスの「注文インテント」のようなものは、あくまで抽象的な概念です。それをExtensionが認識できる具体的な名前、つまり識別しやすい文字列として宣言してください。例えば、「注文インテント」は、「OrderPizza」のような名前で宣言することができます。
次に、「OrderPizza」インテントがユーザーの発話から取得する情報(スロット)を定義し、処理できる様々なサンプル発話を列挙します。
ビルトインインテントは、CLOVAプラットフォームが一部の共通したユーザーリクエストのカテゴリーを決め、それを共有するために宣言した仕様です。頻繁に発生するインテントとして、次のようなリクエストがあらかじめ定義されています。
ビルトインインテントの名前 | 意図 | ユーザーのサンプル発話 |
---|---|---|
Clova.CancelIntent |
対話キャンセルのリクエスト | キャンセル |
Clova.FallbackIntent |
予想していない発話の入力を処理するリクエスト | (予想していない発話) |
Clova.GuideIntent |
ヘルプのリクエスト | 使い方を教えて |
Clova.NextIntent |
次のコンテンツをリクエストする | 次、次の曲を再生して |
Clova.PauseIntent |
再生を一時停止するようにリクエストする | ちょっと止めて、止めて |
Clova.PreviousIntent |
前のコンテンツをリクエストする | 前、前の曲を再生して |
Clova.ResumeIntent |
再生を再開するようにリクエストする | 再生を再開して、再び再生して |
Clova.YesIntent |
肯定の返事(はい、Yes) | はい |
Clova.NoIntent |
否定の返事(いいえ、No) | いいえ |
スロットは、ユーザーの発話から取得される情報です。ユーザーの発話で使われた名詞型の要素がスロットになります。カスタムインテントを定義する際、そのインテントが必要とするスロットを一緒に定義する必要があります。ソフトウェアの開発に例えると、インテントは特定のカテゴリーのユーザーリクエストを処理する関数またはハンドラーで、スロットはその関数やハンドラーに必要なパラメータに該当します。先ほど例として挙げた「ペパロニピザを2枚注文して」というユーザーの発話の場合、「OrderPizza」インテントを処理するには、「ペパロニピザ」のような、ピザの種類に関する情報と、「2枚」のような数量に関する情報が必要なことがわかります。インテントを定義する際、そのインテントがどんな情報(スロット)を必要とするかをあらかじめ把握しておく必要があります。
また、スロットを宣言する際には、そのスロットがどんなタイプの情報かを区分する必要があります。それがスロットタイプです。スロットタイプには、ビルトインスロットタイプとカスタムスロットタイプの2種類があります。
ビルトインスロットタイプは、CLOVAであらかじめ定義されている情報のタイプです。すべてのサービス(Extension)に共通で使用できる情報の表現が定義されています。ビルトインスロットタイプは、主に時間、場所、数量などのような情報を認識する必要がある場合に使用されます。上記の発話の場合、「2枚」に該当する情報を認識するためにビルトインスロットタイプを使用することができます。CLOVAは、次のようなビルトインスロットタイプを提供しています。
ビルトインスロットタイプ | 説明 |
---|---|
CLOVA.JP_ADDRESS_KEN |
国内の行政地域のうち、都道府県名を提供します(例:"東京都"、"京都府"、"福岡県"、"北海道") |
CLOVA.JP_ADDRESS_SHI |
国内の行政地域のうち、市町村名を提供します(例:"武蔵野市"、"奥多摩町"、"小笠原村" ) |
CLOVA.JP_ADDRESS_KU |
国内の行政地域のうち、東京特別区(23区)名と行政区名を提供します(例:"新宿区"、"中村区"、"淀川区") |
CLOVA.WORLD_COUNTRY |
世界の国名に相当する表現を提供します(例:"カナダ"、"日本"、"大韓民国"、"フランス") |
CLOVA.WORLD_CITY |
世界の都市名表現を提供します(例:"ワシントンD.C."、"ローマ") |
ビルトインスロットタイプ | 説明 |
---|---|
CLOVA.DATETIME |
日付や時刻表現を提供します。現在の日付またはそれより先の日時を返します。(例:"1日"、"10分30秒"、"午前9時"、"1時間前"、"12時"、"正午"、"2017年8月4日") |
CLOVA.DATETIME_RECENT |
日付や時刻表現を提供します。現在の日付またはそれより前の日時を返します。(例:"火曜日"、"7月29日"、"7月") |
CLOVA.DURATION |
期間の表現を提供します(例:"1秒間"、"1分間"、"1時間"、"1週間"、"1日間"、"一ヶ月"、"1年間") |
CLOVA.OFFICIALDATE |
公休日を提供します(例:"元日"、"成人の日") |
CLOVA.ORDER |
順序表現を提供します(例:"次"、"前") |
CLOVA.RELATIVETIME |
相対的な時間表現を提供します(例:"これから"、"後で"、"しばらく後"、"今"、"さっき") |
ビルトインスロットタイプ | 説明 |
---|---|
CLOVA.WHOLE_NUMBER |
0と正の整数、数字で構成された文字列の表現を提供します(例:"0123 4567") |
ビルトインスロットタイプ | 説明 |
---|---|
CLOVA.UNIT |
CLOVA.UNIT_xxxx のすべてを含む単位表現を提供します |
CLOVA.UNIT_GENERAL |
一般な助数詞(単位)を提供します(例:"個"、"枚"、"本"、"台"、"体"、"回"、"件") |
CLOVA.UNIT_AREA |
面積を表す単位を提供します(例:"平方メートル"、"坪") |
CLOVA.UNIT_CURRENCY |
通貨名コードを提供します(例:"円"、"ドル"、"ユーロ") |
CLOVA.UNIT_INFORMATION |
データの単位を提供します(例:"ビット"、"バイト") |
CLOVA.UNIT_LENGTH |
長さ・距離を表す単位を提供します(例:"メートル"、"キロメートル"、"マイル") |
CLOVA.UNIT_RATIO |
割合・比率を表す単位を提供します(例:"パーセント"、"倍") |
CLOVA.UNIT_SPEED |
速度を表す単位を提供します(例:"メートル毎秒") |
CLOVA.UNIT_TEMPERATURE |
温度を表す単位を提供します(例:"度"、"℃") |
CLOVA.UNIT_VOLUME |
体積・容積を表す単位を提供します(例:"ミリリットル") |
CLOVA.UNIT_WEIGHT |
重量を表す単位を提供します(例:"キログラム"、"ミリグラム") |
ビルトインスロットタイプ | 説明 |
---|---|
CLOVA.NUMBER |
数値 または 数値と単位の組み合わせ表現を提供します(例:1234個と発話した場合、"1234" または "1234個") |
CLOVA.GENERIC_NUMBER |
数値と一般な助数詞(単位)の組み合わせ表現を提供します(例:"3杯") |
CLOVA.AREA |
数値と面積を表す単位の組み合わせ表現を提供します(例:"20坪") |
CLOVA.INFORMATION |
数値とデータの単位の組み合わせ表現を提供します(例:"6ギガバイト") |
CLOVA.LENGTH |
数値と長さ・距離を表す単位の組み合わせ表現を提供します(例:"2.2キロメートル") |
CLOVA.MONEY |
数値と通貨単位の組み合わせ表現を提供します(例:"88円") |
CLOVA.RATIO |
数値と割合・比率を表す単位の組み合わせ表現を提供します(例:"100倍") |
CLOVA.SPEED |
数値と速度を表す単位の組み合わせ表現を提供します(例:"75キロメートル毎時") |
CLOVA.TEMPERATURE |
数値と温度を表す単位の組み合わせ表現を提供します(例:"36.5度") |
CLOVA.VOLUME |
数値と体積・容積を表す単位の組み合わせ表現を提供します(例:"5リットル") |
CLOVA.WEIGHT |
数値と重量を表す単位の組み合わせ表現を提供します(例:"30mg") |
カスタムスロットタイプは、提供するサービス(Extension)のドメインに特化した情報のタイプを定義したものです。カスタムスロットタイプは、主に固有名詞または一般名詞を指定して作成します。例えば、上記の発話で「OrderPizza」インテントで、ピザの種類に該当する情報(スロット)をユーザーの発話から把握する必要があります。また、ピザの種類を示す表現は、ピザに関するサービスでのみ使用される可能性が高いです。従って、「PIZZA_TYPE」のようなカスタムスロットタイプを定義し、そのカスタムスロットタイプに、ピザの宅配サービスで注文できる「ペパロニピザ」「コンビネーションピザ」「チーズピザ」などの項目が使用されると宣言することができます。
ただし、同じ意味を持つ言葉でも、実際の発話では様々な言い方で表現されることがあります。「バーベキューピザ」は「BBQピザ」のような同義語を持ち、「シュリンプ・ゴールドクラストピザ」のような長い名前の場合、「シュリンプ・ゴルクラ」のようによく使われる短縮表現が存在する可能性もあります。従って、カスタムスロットタイプを定義する際には、概念的に区別される項目だけでなく、その項目ごとに代表語と同義語・類義語を定義する必要があります。そうすることで、ユーザーの発話を認識する際に、様々な言い方で表現される同義語や類義語を代表語に変換できます。また、Extensionがインテントを処理する際に、同じ概念に該当する情報の表現のゆれを解消し、統一した値でExtensionに渡すことができます。
上記のようにスロットタイプを定義したら、次はそれぞれのインテントで使用するスロットの名前を定義し、そのスロットがどんなスロットタイプを持つか宣言する必要があります。例えば、「OrderPizza」インテントは、ピザの種類に関する情報のために「pizzaType」、ピザの数量に関する情報のために「pizzaAmount」というスロットを宣言し、スロットごとにあらかじめ定義した「PIZZA_TYPE」のカスタムスロットタイプと、すでに提供されている「CLOVA.NUMBER」のビルトインスロットタイプを指定することができます。
現在、同義語の登録数の上限は、1つのスロットタイプ毎に代表語と同義語を合わせて20万件となっています。詳細についてはカスタムスロットタイプを追加するを参照してください。
インテントを定義する際、様々なサンプル発話を列挙することができます。サンプル発話は、CLOVAが同じ意図を持つ様々な言い方を認識するにあたって必要な基本データであり、ユーザーの発話のうち、スロットに該当する情報を把握する際に利用されます。サンプル発話を適切に入力しておくと、ユーザーの意図を正しく認識する対話モデルを作成することができます。サンプル発話は、可能な限り次の事項に従って作成することを強くお勧めします。
サンプル発話をたくさん入力しながらも、パターンが重複しないようにするという推奨事項について、以下の図を参照してください。
例えば、ピザの宅配サービスで、注文に関するインテント(OrderPizza)に、以下のようなサンプル発話を作成したと仮定します。
ペパロニピザ1枚頼んで。
ペパロニピザ1枚注文してちょうだい。
ペパロニピザ1枚出前取って。
ペパロニピザ1枚宅配でお願い。
CLOVAが上記のサンプル発話で学習した場合、"ペパロニ"
や"1枚"
という値がユーザーの発話に含まれると、その発話はOrderPizza
インテントとして認識される可能性が高いです。例えば、「ペパロニピザ1枚いくらなの?」などのように、メニューの検索を予想した発話が、ピザの注文をリクエストした発話として処理される可能性があります。
そのようなことを防ぐために、サンプル発話は以下のように作成することを推奨します。
ペパロニピザ2枚頼んで。
BBQピザ1つ出前取ってくれる?
コンビネーション3つ宅配でお願い。
シュリンプ・ゴルクラピザ早くお願い、お腹空いてるの。
この例では発話が名詞(ピザの種類)、名詞(数量)、動詞(意図)のパターンで構成されていて、日常で使用される助詞、語尾、副詞、感嘆詞なども含まれています。発話のパターンをすべて洗い出すと、これらのパターンを再利用して、スロットの値を変えながらサンプル発話を推奨基準まで追加します。その際、次の事項に注意してください。
"ペパロニ"
と"頼む"
という値の組み合わせが重複しています。バーベキュー5つ早く注文して。
ペパロニ1枚食べるからね。
ベジタリアンピザお願い。
おいしいチーズピザを4つ注文してちょうだい。
「OrderPizza」インテントに関する発話をテキストで列挙し、スロットに該当する部分を次のように表示します。
<pizzaType>ペパロニピザ</pizzaType><pizzaAmount>2枚</pizzaAmount>頼んで。
<pizzaType>BBQピザ</pizzaType><pizzaAmount>1つ</pizzaAmount>出前取ってくれる?
<pizzaType>コンビネーション</pizzaType><pizzaAmount>3つ</pizzaAmount>宅配でお願い。
<pizzaType>シュリンプ・ゴルクラピザ</pizzaType>早くお願い、お腹空いてるの。
<pizzaType>バーベキュー</pizzaType><pizzaAmount>5つ</pizzaAmount>早く注文して。
<pizzaType>ペパロニ</pizzaType><pizzaAmount>1枚</pizzaAmount>食べるからね。
<pizzaType>ベジタリアンピザ</pizzaType>お願い。
おいしい<pizzaType>チーズピザ</pizzaType>を<pizzaAmount>4つ</pizzaAmount>注文してちょうだい。
...
メモ
対話モデルのテストや、統計機能の「発話」データ(スキル設定画面で統計を選択して表示)を参照して調整することにより、完成度を高めることができます。対話モデルをテストする際には、サンプル発話の作成者ではなく、第三者がテストすることをお勧めします。そうすることで、新たな発話パターンを見つけることができます。
CLOVA Developer Centerで対話モデルを登録すると、登録されたCustom Extensionが次のようなJSONメッセージを受信します。
// カスタムインテント: ペパロニピザ2枚注文してちょうだい。
{
"version": "0.1.0",
"session": {
"new": false,
"sessionAttributes": {},
"sessionId": "a29cfead-c5ba-474d-8745-6c1a6625f0c5",
"user": {
"userId": "U399a1e08a8d474521fc4bbd8c7b4148f",
"accessToken": "XHapQasdfsdfFsdfasdflQQ7"
}
},
"context": {
"System": {
"application": {
"applicationId": "com.example.extension.pizzabot"
},
"user": {
"userId": "U399a1e08a8d474521fc4bbd8c7b4148f",
"accessToken": "XHapQasdfsdfFsdfasdflQQ7"
},
"device": {
"deviceId": "096e6b27-1717-33e9-b0a7-510a48658a9b"
}
}
},
"request": {
"type": "IntentRequest",
"intent": {
"name": "OrderPizza",
"slots": {
"pizzaAmount": {
"name": "pizzaAmount",
"value": "2"
},
"pizzaType": {
"name": "pizzaType",
"value": "ペパロニ"
}
}
}
}
}
// ビルトインインテント: キャンセルして
{
"version": "0.1.0",
"session": {
"new": false,
"sessionAttributes": {},
"sessionId": "a29cfead-c5ba-474d-8745-6c1a6625f0c5",
"user": {
"userId": "U399a1e08a8d474521fc4bbd8c7b4148f",
"accessToken": "XHapQasdfsdfFsdfasdflQQ7"
}
},
"context": {
"System": {
"application": {
"applicationId": "com.example.extension.pizzabot"
},
"user": {
"userId": "U399a1e08a8d474521fc4bbd8c7b4148f",
"accessToken": "XHapQasdfsdfFsdfasdflQQ7"
},
"device": {
"deviceId": "096e6b27-1717-33e9-b0a7-510a48658a9b"
}
}
},
"request": {
"type": "IntentRequest",
"intent": {
"name": "Clova.CancelIntent",
"slots": {}
}
}
}
Extensionは、ユーザーのリクエストを処理し、その結果をCLOVAを介してユーザーに伝える必要があります。CLOVAは、基本的にユーザーとの対話に音を使用し、リクエストを受け付けるときはもちろん、ユーザーに返事をするときも音を使用します。CLOVAは、音を使用した応答タイプとして、以下のものを提供します。Extensionは、ユーザーシナリオに応じ、適切なタイプの応答を提供する必要があります。
メモ
音声出力タイプ、オーディオコンテンツの再生タイプ共に、音源(.mp3)のリソースはHTTPSのみ許可されます。
文字で表された情報を音声合成技術を用いて加工し、音声(TTS)で出力するタイプです。主に、ユーザーの質問やリクエストに対する返事として使用されます。応答は1つ以上の音声出力(TTS)で構成されます。また、短い効果音(.mp3)を一緒に提供することができます。
音声出力タイプで応答を作成するとき、以下のルールに従う必要があります。
以下は、音声出力タイプのサンプルです。
//例1:短い案内フレーズ
「首都名を当てるクイズです」
//例2:詳しい説明と問題で構成された応答
1番目のTTS:「各国の首都名を当てるクイズを途中でやめるには「やめる」と言ってください。問題を再度聞きたいときには「もう一度」、他の問題に移るときには「他の問題」と言ってください」
2番目のTTS:「アメリカの首都はどこですか」
//例3:効果音が含まれた応答
1番目の効果音(.mp3):正解の効果音を再生する
2番目のTTS:「正解です」
メモ
音声出力タイプの応答に関する実装の説明については、Custom Extensionレスポンスを返すを参照してください。
音楽のように長い間オーディオコンテンツを再生するタイプで、主に音楽を提供するスキルで使用されます。このタイプは、長時間オーディオコンテンツを再生するときだけでなく、一時停止、再開、停止するときにも使用されます。オーディオコンテンツ再生タイプで応答するには、Extensionが以下のようにオーディオ再生をコントロールできる必要があります。
AudioPlayer.Play
)を返す必要があります。以下は、オーディオコンテンツ再生タイプの簡単なユーザーシナリオです。
「クラシックボックスを起動して」
「どんなクラシック音楽を再生しますか?」(TTS)
「ヴィヴァルディの四季を再生して」
「はい。ヴィヴァルディの四季を再生します」(TTS)
ヴィヴァルディの四季第1楽章を再生するよう指示する (AudioPlayer.Play)
「ねぇCLOVA、ちょっと止めて」
再生を停止するよう指示する (PlaybackController.Pause)
「ねぇCLOVA、再開して」
再生を再開するよう指示する (PlaybackController.Resume)
「ねぇCLOVA、次へ」
ヴィヴァルディの四季第2楽章を再生するよう指示する (AudioPlayer.Play)
メモ
オーディオコンテンツ再生タイプで応答する方法については、オーディオコンテンツを提供するを参照してください。
Extensionでオーディオコンテンツを提供する場合、必ずCLOVAでサポートされている音声圧縮形式で提供する必要があります。
CLOVAでは、以下の音声圧縮形式がサポートされています。
音声圧縮形式 | ファイルの拡張子 | 転送方式 | ライセンス費用 |
---|---|---|---|
MPEG-1 or MPEG-2 Audio Layer III | .mp3 | HLS(HTTP Live Streaming) v3 | 無料 |
メモ
CLOVAが対応するオーディオ圧縮フォーマットと配信方式は、さらに増える可能性があります。
注意
CLOVAでサポートされていない音声圧縮形式でオーディオを提供すると、クライアントがオーディオを正常に再生できないことがあります。
開発者は、スキル(Extension)を開発した後、CLOVA事務局による審査を受け、適切であると判断されたスキルのみスキルストアで公開することができます。CLOVA事務局が以下のコンテンツガイドラインに違反する、または違反する恐れがあると判断するスキルは、審査で不適切とされ、申請が却下・配布中止となる場合があります。
審査をリクエストする際は、事前にこのガイドラインを確認してください。ただし、以下の項目に該当する場合でも、CLOVA事務局の判断により公開可能となることがあります。
開発したスキルが以下の項目に該当する場合は、申請が却下あるいは保留となる場合があります。
なお、CLOVA事務局は別途権利確認書類を求めることがあります。
なお、事前に承諾があった場合でも、CLOVA事務局が不適切と判断するものは、却下・配布中止、保留となる場合があります。
メモ
一部例外がある場合がありますので、判断が難しい場合は、審査時にコメントを記載いただきますようお願いいたします。
新規にExtensionを開発する際には、ユーザーがどんなフレーズを発話するか予測してシナリオを作成し、Extensionに適用します。Extensionの公開後は、実際のユーザーの使い方が予想と必ず一致するとは限らず、またユーザーのすべての使用パターンを網羅できていない可能性もあります。ユーザーは想定していない方法でExtensionを使用する可能性があるのです。UXを向上させるためには、Extensionを公開してからも、Extensionの機能や対話の流れを継続的に改善する必要があります。
Extensionを登録した後、CLOVAプラットフォームで提供される統計データ(CLOVA Analytics)を分析し、随時Extensionをアップデートする必要があります。