はじめに
AI HACK 2026で、「泣きやみなさいわが子よ」という、延長保育や一時預かりの場にいる3〜6歳の子どもと、保育士・ベビーシッターが一緒に使う「保護者AIビデオメッセージ」を開発しました。
子どもが声で話すと、AIが内容と安全性を判断し、その場にいない保護者が許可した顔・声を使って短い返答を届けます。
- LLMルーター: OrcaRouter
最初に強調したいのは、このプロダクトが「AIに育児を任せるサービス」ではないことです。
子どものそばには、保育士やベビーシッターなど、信頼できる大人がいます。AIは保護者本人の代わりになるのではなく、離れている保護者の存在を感じられる短いきっかけを作ります。そのメッセージを使って、目の前の大人が子どもをあやし、寂しさに寄り添い、気持ちの切り替えを助けるためのサービスです。
デモでは母親からのメッセージを「Mama Movie」と呼んでいますが、対象を母親だけに限定しているわけではありません。
解決したかった課題
幼い子どもには、「いまできたことを伝えたい」「褒めてほしい」「会いたくて寂しい」という瞬間があります。
しかし、保育園の延長保育やベビーシッターによる一時預かりでは、子どもが保護者と長い時間会えず、お迎えを待ちながら寂しさや不安を感じることがあります。保護者も仕事などですぐに電話へ出たり、リアルタイムに応答したりできるとは限りません。
例えば、延長保育でお迎えを待っている子どもが、保育園の先生へこう話したとします。
ままにあいたい。おむかえ、まだ?
この瞬間に必要なのは、長いカウンセリングでも、AIによるお迎え時刻の推測でもありません。
「ままにあいたくなったんだね。さみしいよね。せんせいのそばで、まちながらなにをするかいっしょにきめようね」という短いメッセージが届き、それをきっかけに、先生が子どもをあやしながら、一緒に遊ぶことや待ち時間の過ごし方を提案できます。
一方で、子どもが危険や深刻な困りごとを話した場合、AIが保護者を演じ続けるべきではありません。この「返すべき場面」と「止めるべき場面」を両方設計することが、今回の中心課題でした。
子ども向けUXは「音声」と「大人の確認」が中心
3〜6歳の利用を想定し、キーボード入力を主導線にしませんでした。基本の流れは次の通りです。
- 子どもが大きなマイクボタンを押して話す
- 録音中は波形、経過時間、「きいているよ」を表示する
- 15秒で自動停止するか、もう一度ボタンを押して止める
- 音声認識された文章を、同席する大人が確認する
- 「おくる」または「もういちど」を選ぶ
- AIが安全度、感情、支援方法、返答文を決める
- 映像・音声・字幕がそろってから、一つの返答として再生する
マイク権限がない場合や音声認識に失敗した場合も、子どもを責める表現は使いません。短い案内と再試行ボタンを出し、文章入力はデモを止めないためのフォールバックとしてだけ残しました。
返答後も同じ画面から続けて話せます。会話履歴は直近6往復まで使い、「さっき話したこと」を踏まえた返答を生成します。
システム構成
処理の全体像は次の通りです。
子どもの音声
↓
音声認識(STT)
↓
同席する大人が認識文を確認
↓
OrcaRouter
├─ 安全度の判定
├─ 支援方法と感情の分類
└─ 子ども向け返答文の生成
↓
ElevenLabsで保護者の声を生成
↓
Tavus Echoへ音声を送信
↓
顔・口の動き・表情・身振りをリアルタイム描画
↓
映像 + 音声 + 字幕を再生
主な技術構成は以下です。
| 領域 | 採用技術・サービス |
|---|---|
| フロントエンド | HTML / CSS / JavaScript |
| APIサーバー | Node.js |
| LLMルーティング | OrcaRouter |
| 音声認識 | OpenAI互換STT |
| 音声クローン・TTS | ElevenLabs |
| リアルタイムアバター | Tavus Echo + Daily |
| 代替映像経路 | LiveAvatar / HeyGen / D-ID / Kling |
| 永続データ | AES-256-GCMで暗号化したローカル保存、Sites版はD1/R2 |
| テスト | Node.js標準テストランナー |
AIである必然性
固定動画を再生するだけなら、AIは必要ありません。
このプロダクトでAIが必要なのは、子どもの短く曖昧な発話に対して、会話ごとに次の判断を行うためです。
- 喜びを一緒に祝うべきか
- 寂しさへ寄り添うべきか
- 気持ちの切り替えを助けるべきか
- もう少し話を聞くべきか
- 危険な状況として大人へ引き継ぐべきか
- どんな短い言葉、声の調子、表情で返すべきか
さらに、直前の会話、子どもの呼び方、好きなものを踏まえながら、同じ質問や定型文を繰り返さない返答が必要です。
つまりAIは、単なる文章生成器ではなく、「返答してよいか」「どの表現手段を使うか」まで決めるオーケストレーターとして働きます。
OrcaRouterを判断と安全制御の中心に置いた
OrcaRouterは、1つのAPIから複数のLLMを利用し、リクエストに応じたモデル選択やコスト管理を行えるLLMルーターです。
今回、OrcaRouterを動画生成器としてではなく、後続処理を監督する判断レイヤーとして使いました。返答は自由文だけではなく、JSON Schemaに従った構造化データとして受け取ります。
{
"safetyLevel": "normal",
"supportMode": "celebrate",
"emotion": ["joy"],
"reasonCodes": ["ACHIEVEMENT_SHARED"],
"replyText": "できたこと、ちゃんとつたわったよ。いっしょによろこぼうね。",
"voiceTone": "bright",
"expression": "smiling"
}
safetyLevelは次の4種類です。
| 値 | 意味 |
|---|---|
normal |
通常の保護者AIメッセージを生成できる |
adult_required |
暴力、虐待、迷子など、大人の介入が必要 |
urgent |
自傷、呼吸困難、火事など、生命に関わる具体的危険 |
uncertain |
判定・同意・外部処理を安全に確認できない |
normal以外では、必ずsupportMode: adult_handoffにします。構造化出力が不正、タイムアウト、モデル応答を検証できない、といった場合も通常返答へ流しません。
本番デモでは、OrcaRouter経由のopenai/gpt-5.6-lunaを主モデル、openai/gpt-5.6-terraをフォールバックとして設定し、実際の応答が最後まで完走することを確認しました。
「ママに会いたい」は危険判定にしない
安全側に倒すことは重要ですが、何でも大人へ引き継げばよいわけではありません。
このサービスの中心的な利用場面は、まさに次のような分離不安です。
- 「ママに会いたい」
- 「お迎えまだ?」
- 「ママがいなくて泣いちゃう」
これらを危険入力として扱うと、日常的な寂しさに寄り添えないサービスになります。そのため、単なる寂しさや泣くことはnormalのまま、comfortまたはtransitionへ分類します。
返答は次の順番で組み立てます。
- 会いたい、寂しいという気持ちを短く受け止める
- ひとりではないことを伝える
- いま一緒にいる大人とできる小さな行動へつなぐ
反対に、次のような具体的危険では保護者風の返答を停止します。
- 「知らない人がついてくる」
- 「叩かれた」「無理やり触られた」
- 「血が止まらない」
- 「息ができない」
- 「死にたい」
この場合はADULT_HANDOFFとし、保護者の顔、クローン音声、通常返信、動画生成をすべて止めます。画面には、そばにいる信頼できる大人と一緒に確認するよう案内します。
ElevenLabsとTavusで「返答文に合う映像」を作る
保護者は大人向け画面から、本人の写真と最大2分の音声サンプルを登録できます。声の利用と顔の利用は別々に同意を取ります。
ElevenLabs Instant Voice Cloneで作成したvoice_idを使い、OrcaRouterが生成した毎回異なる返答文を日本語音声へ変換します。Tavus Echoには、この生成済み音声を24kHz・16-bit・mono PCMとして送り、顔、口の動き、表情、自然な身振りをリアルタイムに描画させます。
この役割分担にした理由は明確です。
- 何を話すか: OrcaRouter
- どんな声で話すか: ElevenLabs
- どう動いて見せるか: Tavus
Tavusの通話は、認証必須・最大2人・短時間トークン付きの非公開Dailyルームとして作成します。接続できない場合は、登録写真と音声、さらにブラウザ読み上げへ段階的に戻ります。
2026年8月15日のライブ確認では、OrcaRouter、ElevenLabsのクローン音声、Tavus Echoの非公開ルーム作成・終了までを確認できました。LiveAvatar LITEについても、サンドボックス映像と同一画面での複数ターンを確認しています。
外部サービスが失敗しても、子どもの体験を止めない
生成AIのAPIは、遅延、利用枠、ネットワーク、プロバイダー障害などで失敗します。デモでも実運用でも、「動画ができなかったので真っ白な画面」にはできません。
そこで返答メディアを4段階に分けました。
| Level | 返答方法 | 用途 |
|---|---|---|
| LEVEL 1 | 生成動画 + 音声 + 字幕 | すべて正常に生成できた場合 |
| LEVEL 2 | 事前生成動画 + 埋め込み音声 + 字幕 | 安定したデモ用動画が使える場合 |
| LEVEL 3 | 同意済み静止画 + 動的音声 + 字幕 | 映像生成を利用できない場合 |
| LEVEL 4 | 保護者らしさを外した中立案内 | 安全な保護者メディアを用意できない場合 |
重要なのは、LEVEL 4を「低品質な保護者動画」にしなかったことです。
同期していない口の動き、返答文と違う録音、本人らしくない音声を無理に返すと、幼い子どもへ誤認を与えます。そのため、必要な素材がそろわなければ、保護者になりきらない中立案内へ切り替えます。
また、requestIdと冪等キーを使い、画面の二重操作や再送で動画・音声を重複生成しないようにしています。
顔と声を扱うからこそ、同意と削除を機能にした
顔や声は、単なる設定値ではありません。登録時だけ同意を取って終わりではなく、利用停止、再開、差し替え、削除までを一つのライフサイクルとして実装しました。
- 顔、声、外部サービスへの送信を別々に同意
- ブラウザが保持するランダムな保護者プロフィールIDで家庭を分離
- 写真、元音声、生成動画、外部IDをAES-256-GCMで暗号化保存
- APIキーと
voice_idをブラウザへ返さない - 素材URLを推測困難なトークンにする
- 利用停止中はサーバー側でも生成を遮断
- 再登録・削除時に過去の素材URLを失効
- ElevenLabs上のクローンとTavus Faceも削除を試行
- 技術ログへ会話本文、写真、音声、APIキーを残さない
会話本文は同じサーバーのメモリ上に一定時間だけ保持し、再起動時に消去します。遠隔の保護者は、子ども側で発行した10分有効の6桁ペアリングコードと、別のアクセスコードを組み合わせて会話を確認できます。ペアリングコードだけでは閲覧できません。
正式提供では、これを正式な利用者認証、暗号化データベース、試行回数制限、監査、利用者自身による削除機能へ置き換える必要があります。
公開デモでFaceだけを共有し、声は共有しない
一般公開デモでは、Training済みのTavus Faceを別端末から利用できます。ただし、Face登録者のElevenLabsクローン音声、元音声、voice_id、会話履歴は共有しません。
別端末でクローン音声を使うには、その端末の利用者が自分の声を登録し、本人同意を完了する必要があります。音声未登録ならブラウザ読み上げへ戻り、Tavusのリアルタイム動画も開始しません。
顔が共有できるからといって、声まで暗黙に共有しない。この境界は、本人性の高い素材を扱ううえで重要だと考えました。
なお、これはログイン機能を実装する前のハッカソン用デモ構成です。正式提供では、アカウント、端末追加、権限失効、利用記録を実装します。
LLMコストとビジネス成立性
OrcaRouterでは、リクエストごとのモデル、トークン、レイテンシなどを記録できるようにしました。軽い分類や通常返信は低コストモデルを優先し、安全性や表現品質が重要な処理だけを高品質モデルへ回す方針です。
ただし、一般的に示されている削減率を、そのまま自分たちの実測値としては使っていません。OrcaRouterから原価を取得できない場合はnullのまま記録し、「0円」とは表示しない設計にしています。
プロダクト全体では、LLMよりもリアルタイム映像と音声クローンの固定費・従量費が大きくなります。現在の契約条件をもとに、次の仮定で1アカウント1顔の月額原価を試算しました。
- Tavus動画: 月60分以内
- AI会話: 月100回
- 音声入力: 1回最大15秒
- 為替: 1ドル150円
この条件で、API・ホスティングの直接原価は月約4,100円、為替や小さな従量変動を含む管理用原価は月約4,500円と見積もりました。売価は月7,980円を最低目安、月9,800円を推奨案としています。
これはハッカソン時点の試算で、決済手数料、サポート、監視、法務、本人確認、各サービスの価格改定は含みません。また、現在のTavus契約は本人Face枠が1つのため、そのまま複数顧客へ販売できません。商用化前にFace枠と超過単価を再確認する必要があります。
実装して分かったこと
1. 幼児向けAIでは、返答の賢さより「止まり方」が重要
LLMが自然な返答を作れるだけでは不十分でした。判定不能、同意不備、外部障害、危険入力のそれぞれについて、「何を表示しないか」「どの処理を呼ばないか」を実装する必要がありました。
2. 映像・音声・字幕は一つの返答として扱う
映像だけ先に出す、字幕と違う固定音声を流す、といった部分成功は、かえって誤認につながります。必要なメディアがそろってから再生する契約にし、そろわなければ次のLEVELへ落としました。
3. デモモードと実接続モードを明確に分ける
APIキーがなくても一連の体験を確認できるデモモードを残し、ROUTER_PROVIDER=orcarouterを明示した場合だけ、確認済みの子どもの発話を外部へ送信します。キーが環境に残っているだけでは外部送信しません。
4. 音声クローンは「似ている」だけでは足りない
短い返答でも、話す速さ、抑揚、表情との同期が体験を大きく左右しました。音声サンプルは、普段子どもへ話すときの速さと調子で1〜2分ほど録音する設計にしています。
Codexをどう使ったか
Codexは、要件整理、実装、テスト、セキュリティ境界の確認、デモ動画、提出資料の作成までに活用しました。
特に役立ったのは、最初の「リアルタイムで母親AIと話す」というアイデアを、そのまま実装せず、次の問いに分解できたことです。
- 子どもに何を誤認させてはいけないか
- AIが返答してよい範囲はどこか
- 本人素材の同意をどの単位で取るか
- 外部APIが失敗したとき何を残すか
- 削除したとき外部サービスの素材まで消せるか
実装はCodexが進め、人間3名がレビューと意思決定を担当しました。特に、顔・声の外部送信、公開デモ、記事や動画の公開は、人間の最終確認を通す運用にしています。
起動方法
Node.js 20以降が必要です。
リポジトリを取得したディレクトリで、次を実行します。
npm ci
npm start
ブラウザでhttp://127.0.0.1:4173を開きます。APIキーがなくてもデモモードで動作し、マイクを使わない場合は「デモ音声で進める」を選べます。
自動テストは次のコマンドで実行します。
npm test
実サービスへ接続する場合は、.env.exampleを参考に、APIキーをサーバー側の.envへ設定します。秘密値や保護者素材はGitへコミットしません。
現在の制約と今後
今回のMVPは、本番運用へ向けた安全境界を検証する段階です。主な制約は次の通りです。
- 子どもだけで自由利用させる設計ではない
- 医療、心理、緊急支援の代替ではない
- 正式な保護者アカウント・本人確認は未実装
- Tavus本人FaceのTrainingには時間がかかる場合がある
- 現在の契約では本人Face枠と同時接続数に制限がある
- 会話履歴の長期保存・監査・通知は本番向けに再設計が必要
- 実際の家庭や保育現場での効果検証が必要
次のステップでは、専門家を交えた安全評価、正式な認証・同意履歴・削除機能、利用時間と原価の継続計測を進めます。
おわりに
生成AIで保護者らしい顔と声を作ること自体は、以前より簡単になりました。
難しかったのは、「作れるから使う」のではなく、どの場面なら子どもの助けになり、どの場面ではAIが止まるべきかを決めることでした。
このプロダクトでは、OrcaRouterを中心に、安全判定、返答生成、音声、映像、フォールバックを一つの流れとして組み立てました。そして、AIが子どもと大人の関係を置き換えるのではなく、その場の大人が寄り添うためのきっかけになることを目指しました。
AI HACK 2026を通じて、次世代のAIプロダクトに必要なのは、生成品質だけではなく、同意、削除、失敗時の縮退、そして人間へ戻す境界まで含めた設計だと実感しました。