組み込み
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 とのつなぎ方に絞って説明します。
全体の流れ
- サーバーで avacast のセッションを作り、ブラウザに
client_tokenとwebrtcを返す - ブラウザで SDK に渡し、映像を表示する
- 利用者の質問をサーバーに送る
- サーバーで OpenAI API に質問を渡し、返事の文章を受け取る
- 返事を 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 分まで無料
カード登録なしで始められます。