要求外のアクション - スピーチAPI
要求外のアクション概要
🇯🇵 🇺🇸英文ドキュメントではUnsolicited Responses(未承諾応答)と表現されていますが、日本語版では要求外のアクション
あるいはスピーチAPI
と表現します。
要求外のアクション(スピーチAPI)とは、エンドユーザーから質問などの発話要求なしにデジタルヒューマンが話すアクションを指します。デジタルヒューマンがアイドル状態の場合に、あなたの意思で一方的に話しかけたり、任意のタイミングで発話指示をすることができます。
ユーザーが質問しているときや、デジタルヒューマンが会話AIからの要求で話しているときには利用出来ません。
要求外のアクション
あるいはスピーチAPI
はお客様のJWTシークレットに基づいて認証され、SDKからはアクセスできません。
このドキュメントは独自でオーケストレーションレイヤーを実装した場合に参照してください。デジタルヒューマン株式会社が提供するオーケストレーションレイヤーを使用している場合はこちらをご覧下さい。要求外のアクションの送信
デジタルヒューマンを喋らせる為には、HTTP POSTリクエストで応答と指示をUneeQサーバーに送ることができます。
リクエストの仕様
Digital Humanに一方的な応答をさせるために、POST要求が以下の要求形式を使用して/api/v1/avatar/${sessionId}/speakに送信されます。
ヘッダー
Key | Value |
Content-Type | application/json |
パスバリアブル
Field | Type | Description |
sessionId | String | 現在の会話のカスタマーセッションID |
ボディ
このペイロードは、文字列化されたJSONである必要があります。
Field | Type | Description |
answer | String | デジタルヒューマンが話すように設定したテキスト |
answerAvatar | String | デジタルヒューマンの指示を含む文字列化されたJSON |
sessionIdJwt | String | 顧客セッションIDは、顧客JWT secretを使用して暗号化。 |
セッションIDJWT | SessionIdJWT
これは、次のJSONを顧客のJWTシークレットで暗号化することによって取得されます。
{ "sessionId": "<customer-session-id>" }
▼以下は、2つの異なる方法でsessionIdJWTを生成するサンプルJavaScriptコードです。
Install jsonwebtoken package https://www.npmjs.com/package/jsonwebtoken
npm install jsonwebtoken
デフォルトの同期サイン (HMAC SHA256)
var jwt = require('jsonwebtoken'); var token = jwt.sign({ sessionId: '<customer-session-id>' }, '<customer-JWT-secret>');
▼外部ライブラリを使用せずにエンコードする
function base64url(source) { // Encode in classical base64 encodedSource = CryptoJS.enc.Base64.stringify(source); // Remove padding equal characters encodedSource = encodedSource.replace(/=+$/, ''); // Replace characters according to base64url specifications encodedSource = encodedSource.replace(/\+/g, '-'); encodedSource = encodedSource.replace(/\ //g, '_'); return encodedSource; } var header = { "typ": "JWT", "alg": "HS256" }; var data = { "sessionId": "<customer-session-id>" }; var secret = "<customer-JWT-secret>"; // encode header var stringifiedHeader = CryptoJS.enc.Utf8.parse(JSON.stringify(header)); var encodedHeader = base64url(stringifiedHeader); // encode data var stringifiedData = CryptoJS.enc.Utf8.parse(JSON.stringify(data)); var encodedData = base64url(stringifiedData); // build token var token = encodedHeader + "." + encodedData; // sign token var signature = CryptoJS.HmacSHA256(token, secret); signature = base64url(signature); var signedToken = token + "." + signature; const payload = JSON.stringify({ answer: "Is it there anything else I can help you with?", answerAvatar: JSON.stringify({ "instructions": { "expressionEvent": [ { "start": 0.1, "value": 1, "duration": 3, "expression": "browsUpDown" }, { "start": 3, "value": -1, "duration": 3, "expression": "browsUpDown" } ] } }), sessionIdJwt: signedToken });
応答フォーマット仕様
応答は、コンテンツタイプがapplication/ jsonのJSONになります。
Code | Status | Response | Reason |
204 | No Content | 非送信請求応答が正常に送信されました | |
400 | Bad Request | { "error": ERROR_DESCRIPTION } | リクエストの本文/ヘッダーが無効です |
401 | Unauthorized | { "error": ERROR_DESCRIPTION } | sessionIdJWTが無効です |
403 | Forbidden | { "error": ERROR_DESCRIPTION } | 承認に失敗しました |
406 | Not Acceptable | { "error": Avatar response queue limit reached } | 5つの既存のメッセージがまだ配信されていないときにメッセージの発言が要求されました |
500 | Server Error | { "error": ERROR_DESCRIPTION } | サーバーでエラーが発生しました |
レスポンスリミットの説明
現在、APIは一度に最大5つのメッセージをキューに入れることができます。もし5つ以上のメッセージが要求された場合、APIは406 Not Acceptableを返します。既存のメッセージが完全に発話されるまで、つまりデジタルヒューマンによって発話が完了するまで、新しいメッセージは受け付けられません。
セキュリティ
このAPIは、顧客のJWTSecretを使用して保護されています。リクエストのペイロードにはセッションIDが署名されている必要があり、有効なクライアントからのものであることが確認されます。
このAPIは、フロントエンドアプリではなく、常にバックエンドサービスで実行する必要があります。
最終更新日 January 1, 2023