独自LLMとデジタルヒューマンを接続する

1. 概要

DIP(Digital Humans Identity Portal)Gateway プロファイルを使用すると、お客様が独自で構築したチャットボットやLLMの API とデジタルヒューマンを接続して利用することができます。

Gateway プロファイル : フロントエンドから送られるリクエストを直接指定の URL (endpoint_url) に転送して応答を返却するプロファイル。

利用シーン

  • 独自 LLM 活用:自社専用にファインチューニングした大規模言語モデル(LLM)にリクエストを流し、回答を取得する場合
  • 外部 SaaS 連携:他社が提供する NLP/Semantic API を経由せずに直接呼び出す場合
  • リクエストベースカスタム処理:ユーザー発話や発話言語など、リクエストに含まれる情報に応じてカスタムロジックを実行する場合
  • レスポンスベースカスタム処理:生成された応答結果に基づき、後続のカスタム処理や外部アクションをトリガーする場合

システム構成 & シーケンス

システム構成

flowchart LR
    FE[Frontend <br> (ホステッドエクスペリエンス)]
    
    subgraph DHP[デジタルヒューマンプラットフォーム]
        GW[Gateway プロファイル]
    end
    
    CS["お客様システム<br>(独自で準備したチャットボット/LLM API)"]
    
    FE -->|HTTP POST| GW
    GW -->|HTTP POST| CS
    CS -->|応答 JSON| GW
    GW -->|応答 JSON| FE

Notion image

シーケンス図

⚠️

デジタルヒューマンとの会話は、ユーザーがデジタルヒューマンを呼び出したとき、またはユーザーが発話したときに開始されます。これらのトリガーにより、デジタルヒューマンプラットフォームからお客様システムのエンドポイントへリクエストが送信されます。

sequenceDiagram
    participant FE as Frontend <br> (ホステッドエクスペリエンス)
    
    box デジタルヒューマンプラットフォーム
        participant GW as Gateway プロファイル
    end
    
    participant CS as お客様システム<br/>(独自で準備したチャットボット/LLM API)

    Note over FE: 🎤 デジタルヒューマンを呼び出しまたは<br/>ユーザーが発話
    FE->>GW: HTTP POST (STT テキスト化したユーザ発話・フロントエンド情報)
    GW->>CS: HTTP POST (顧客サーバーへ転送)
    CS-->>GW: 応答 JSON
    GW-->>FE: Websocket(フロントエンドへ発話要求)
Notion image
  1. ユーザーの発話を受信 フロントエンド → Gatewayプロファイル
      • ユーザーが話した内容を音声認識(STT)でテキスト化
      • テキスト化された発話内容とフロントエンド情報をHTTP POSTで送信
  1. お客様システムへの転送 Gatewayプロファイル → お客様システム
      • 受信したリクエストをそのまま設定済みのendpoint_urlへ転送
      • お客様が独自に準備したチャットボットやLLM APIが処理を実行
  1. AIからの応答生成 お客様システム → Gatewayプロファイル
      • チャットボット/LLMが生成した応答をJSON形式で返却
      • 応答にはデジタルヒューマンが話すべき内容が含まれる
  1. デジタルヒューマンによる発話 Gatewayプロファイル → フロントエンド
      • 受信したJSONをWebsocket経由でフロントエンドに即座に送信
      • フロントエンドがデジタルヒューマンに応答内容を発話させる

2. Gateway プロファイルの設定手順(DIP 管理画面)

  1. ログイン後、対象のペルソナページで「Gateway」で NLP アカウント を作成します。
  1. パラメータ設定
      • APIキー:使用しません。空白はNGですので、dummy 等を入力してください。
      • endpoint_url:リクエストを転送する先のお客様システムのエンドポイント URL を指定

3. Gatewayプロファイル → エンドポイント のリクエスト形式

リクエスト JSON サンプル

{
  "digital_human_id": "<実際のdigital_human_id>",
  "metadata": {
    "browser_detected_locales": "ja-JP:en-US",
    "custom": {},
    "persona_id": "<実際のpersona_id>",
    "prompt_id": "<実際のprompt_id>",
    "session_id": "<フロントエンドのsession_id>",
    "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...",
    "user_screen_height": 1350,
    "user_screen_width": 2560,
    "user_spoken_locale": "ja-jp",
    "user_timezone": "Asia/Tokyo"
  },
  "prompt": "ユーザー発話"
}

各フィールド説明

フィールド
常に含まれる
説明
digital_human_id    
string
●      
デジタルヒューマンの固有ID。ルーティング用            
metadata                      
object
●      
以下のサブフィールドを含む                      
└ browser_detected_locales
string
           
ブラウザ設定のロケール情報(例: ja-JP:en-US)        
└ custom                      
any    
●      
フロントエンド設定のcustomMetadata(文字列/オブジェクト)
└ persona_id                  
string
●      
デジタルヒューマンのpesonaId             
└ prompt_id                  
string
●      
リクエストID                                
└ session_id                  
string
●      
セッションID                                
└ user_agent                  
string
●      
ブラウザのUA情報                                
└ user_screen_height          
number
●      
表示画面 高さ(px)                                    
└ user_screen_width          
number
           
表示画面 幅(px)                                      
└ user_spoken_locale          
string
●      
音声認識されたユーザーのロケール(例:ja-jp)        
└ user_timezone              
string
●      
ユーザーのタイムゾーン(例: Asia/Tokyo)        
prompt                        
string
●      
ユーザーの発話テキスト                      

4. エンドポイント → Gatewayプロファイル のレスポンス形式

レスポンス JSON サンプル

{
  "answer": "テスト応答",
  "instructions": {
    "displayHtml": {
      "html": "test"
    }
    // その他: customMetadata etc.
  }
}

各フィールド説明

フィールド
必須 / 任意
説明
answer
string
任意
ユーザへの応答テキスト。空の場合は発話しません。
instructions
object
任意
デジタルヒューマンに対する指示。Instructionsのみの指示で、発話なしにコンテンツを表示するなどの指示が可能です。 displayHtmlcustomMetadata など

タイムアウト

  • リクエスト送信後5分以内にレスポンスがない場合、Gateway プロファイルはタイムアウトとして処理を終了します。

5. サンプル実装コード

Node.js (Express)

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json());

app.post('/gateway', (req, res) => {
  const { digital_human_id, metadata, prompt } = req.body;

  // 1. prompt に対する処理(例: Chatbot API 呼び出し)
  const replyText = `受け取ったプロンプト: ${prompt}`;

  // 2. レスポンス生成
  const responseBody = {
    answer: replyText,
    instructions: {
      displayHtml: { html: `<p>${replyText}</p>` }
    }
  };

  res.json(responseBody);
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Gateway プロファイルサーバー起動: http://localhost:${PORT}/gateway`);
});

Python (FastAPI)

from fastapi import FastAPI, Request
from typing import Any, Dict, Optional
from pydantic import BaseModel, Extra

class Metadata(BaseModel):
    # 既存フィールドをすべて Optional[Any] とし、default=None を付与
    browser_detected_locales:  Optional[Any] = None
    custom:                   Optional[Any] = None
    persona_id:               Optional[Any] = None
    prompt_id:                Optional[Any] = None
    session_id:               Optional[Any] = None
    user_agent:               Optional[Any] = None
    user_screen_height:       Optional[Any] = None
    user_screen_width:        Optional[Any] = None
    user_spoken_locale:       Optional[Any] = None 
    user_timezone:            Optional[Any] = None

    class Config:
        # 定義外のフィールドも受け入れる
        extra = Extra.allow


class GatewayRequest(BaseModel):
    digital_human_id: Optional[str]    = None
    metadata:         Optional[Metadata] = None
    prompt:           Optional[str]     = None

app = FastAPI()

@app.post("/gateway")
async def gateway(req: GatewayRequest):
    # 1. prompt に対する処理(例: Chatbot API 呼び出し)
    reply_text = f"受け取ったプロンプト: {req.prompt}"

    # 2. レスポンス生成
    return {
        "answer": reply_text,
        "instructions": {
            "displayHtml": {"html": f"<p>{reply_text}</p>"}
        }
    }
 

6. 非同期発話(Speak APIを使用する)

  • リクエスト/レスポンスを伴わない、あるいはレスポンスタイムアウトの可能性があり、非同期で発話指示を行うには SpeakAPI を使用します。
  • Gateway プロファイルへのリクエストには即時応答として answer: "" を返却し、バックグラウンドで LLM 処理を実行します。
  • 発話リクエストは SpeakAPI エンドポイントへ以下情報を含めて HTTP POST することでトリガーします:
    • persona_identifier
      • 通常の Gateway リクエストには含まれないため、customMetadata に登録してリクエストパラメータのmetadata.custom で受け取るか、endpoint_url のクエリパラメータに含めて受け渡してください。
      • デジタルヒューマンのペルソナを一意に識別する文字列です。
    • session_id
      • 会話セッションを識別するセッションのIDであり、ユニークなIDです。
 
お役に立ちましたか?
😞
😐
🤩

最終更新日 July 16, 2025