組み込み

OpenAI API の返事を AIアバターに話させる手順(Node.js)

OpenAI API で作った返事を、avacast の AIアバターに話させる手順です。サーバーで返事を受け取り、speak に渡すまでを Node.js で説明します。


OpenAI API の返事を AIアバターに話させるには、サーバーで OpenAI API から返事の文章を受け取り、その文章を avacast の POST /v1/sessions/:id/speak に渡します。映像と音声は WebRTC でブラウザに届くため、ブラウザ側では SDK で映像を表示するだけです。

OpenAI API の呼び出し方は、使っている SDK の版によって書き方が変わります。この記事では OpenAI の部分を llm.reply() という関数にまとめ、avacast とのつなぎ方に絞って説明します。

全体の流れ

  1. サーバーで avacast のセッションを作り、ブラウザに client_token と webrtc を返す
  2. ブラウザで SDK に渡し、映像を表示する
  3. 利用者の質問をサーバーに送る
  4. サーバーで OpenAI API に質問を渡し、返事の文章を受け取る
  5. 返事を avacast の speak に渡す

API キーは 2 つともサーバーだけが持ちます。OpenAI の API キーも avacast の API キーも、ブラウザには渡しません。

セッションを作る

Node.js のサーバー SDK を使うと、セッションの作成と発話を短く書けます。

サーバー (セッションの作成)

import { Avacast } from 'avacast';

const avacast = new Avacast(process.env.AVACAST_API_KEY);

export async function createAvatarSession() {
  const session = await avacast.sessions.create({ avatar_id: 'avt_xxxxxxxx' });
  // ブラウザへは session_id・client_token・webrtc だけを返す
  const { session_id, client_token, webrtc } = session;
  return { session_id, client_token, webrtc };
}

ブラウザでは、受け取った値を AvacastSession に渡します。表示の書き方はNext.js で AIアバターを表示する手順と同じです。

OpenAI API の返事を speak に渡す

利用者の質問を受け取るエンドポイントで、OpenAI API に返事を作らせ、そのまま avacast に渡します。

サーバー (質問を受けて話させる)

import { Avacast } from 'avacast';
import { llm } from './llm'; // OpenAI API を呼ぶ自社の関数

const avacast = new Avacast(process.env.AVACAST_API_KEY);

export async function answer(sessionId: string, question: string) {
  // そのセッションがログイン中の利用者のものかを、ここで確かめる
  const reply = await llm.reply(question);
  await avacast.sessions.speak(sessionId, reply);
  return reply;
}

llm.reply() の中では、OpenAI の SDK でモデルに質問を渡し、返事のテキストを取り出します。モデル名や引数は、お使いの SDK の書き方に合わせてください。返事を画面にも文字で出したい場合は、reply をブラウザに返して表示します。

話し言葉に向く返事にする

LLM の返事は、そのままでは長く、箇条書きや記号を含むことがあります。アバターに読ませる前提で、システムプロンプトに次のような指示を入れます。

  • 1〜2 文で答える
  • 箇条書きや記号を使わず、話し言葉で書く
  • 分からないことは分からないと答える

返事が短いほど、話し始めるまでの待ち時間も短くなります。指示の書き方はAIアバター向けのシステムプロンプトの書き方で詳しく説明しています。

長い返事とストリーミング

speak に渡せる文章は 1 回 1,000 文字までです。長い返事は句点で区切り、順に speak を呼びます。前の発話が終わるのを待つ必要はなく、1 セッションあたり 20 件までキューに積めます。

OpenAI API のストリーミングを使う場合は、文が 1 つ届くたびに speak すると、返事の全体を待たずに話し始められます。区切り方はLLM のストリーミング応答を文ごとに speak するを参照してください。

よくある質問

OpenAI の Realtime API の音声をそのまま使えますか。

avacast はテキストを受け取って、音声と口の動きを作ります。音声の入力は受け付けていないため、OpenAI API からはテキストの返事を受け取って speak に渡してください。

ブラウザから直接 OpenAI API を呼んでもよいですか。

API キーがブラウザに渡ってしまうため、避けてください。OpenAI API の呼び出しも avacast の speak も、サーバーから行います。

返事が届く前に利用者が次の質問をしたらどうなりますか。

話している途中の返事は POST /v1/sessions/:id/interrupt で止められます。止めると、キューに残っている未再生の発話も破棄されます。

月 30 分まで無料

カード登録なしで始められます。

API キーを発行

関連する記事

ブログ一覧へ