こんにちは!Martimです!
今回は、生成AIを使ったバーチャル配信キャラクターのシステムを設計したので、その構成と意図を共有していきます!
目次
- なぜ既存ツールを使わずに作るのか
- このシステムの特徴
- 全体構成
- 各コンポーネントの設計
- キャラクター設定
- 将来の拡張構想
- おわりに
なぜ既存ツールを使わずに作るのか
皆さん、こんな経験はありませんか?
「既存のツールで試してみたけど、もっとこうしたい機能がある」「使えるんだけど、自分の手の届かないところで動いてる感じがする」
私もそう感じていたひとりです。
今はバーチャル配信を手軽に実現できるツールやフレームワークが複数存在しています。それ自体はとても素晴らしいことです。ただ、既存のツールでは実現しにくい「視聴者との関係性を育てる仕組み」を作りたかったというのが、一から設計することにした理由です。
加えて、普段からAWS環境でシステム構築や生成AI活用をしている立場から、Amazon BedrockやAWS各サービスをフル活用して設計から実装まで自分でやってみる、という点にも大きな意義を感じています。
このシステムの特徴
- 視聴者のコメントにリアルタイムで応答するAIキャラクター
- 視聴者との関係値がシステム上で変化する仕組み
- 視聴者が名前を決め、知識を教えることで「一緒に育てる」体験を提供
- Amazon Bedrock(Claude)を中核に据えたAWS構成
- できるだけリアルな声に近づける音声生成を目指す
全体構成
YouTube Live Chat
|
v
YouTube Data API
|
v
AWS Lambda(メイン処理)
- コメントフィルタリング
- スパチャ判定・ティア分類
- 視聴者の記憶・関係値の取得
- Bedrock(Claude)へプロンプト構築・送信
|
+---> 音声生成サービス(TTS)
| |
| v
| OBS Studio
| |
| v
| YouTube配信ストリーム
|
v
AWS Lambda(非同期・データ保存)
- 会話履歴・知識の書き込み
- スパチャ記録保存
処理は**メイン関数(同期)とデータ保存関数(非同期)**に分割しています。レイテンシに直結するメイン処理を軽くするための設計です。
各コンポーネントの設計
AWS Lambda(メイン処理)
コメント取得からBedrock(Claude)への送信、音声生成指示までを担います。
def handler(event, context):
# 1. YouTube Live Chat APIからコメント取得
comments = get_live_chat_comments()
# 2. NGワードフィルタ・スパム除去
filtered = filter_comments(comments)
# 3. スパチャ判定
superchat = detect_superchat(filtered)
# 4. 視聴者の記憶・関係値を取得
memory = get_viewer_memory(superchat.author_id)
# 5. Bedrock(Claude)へプロンプト送信
response = call_bedrock(filtered, memory, superchat)
# 6. 音声生成
audio = generate_voice(response.reply)
# 7. 非同期でデータ保存Lambdaを呼び出し
invoke_memory_lambda(response, superchat)
return audio
Amazon Bedrock(Claude)
返答生成とあわせて感情ラベルも同時出力させる設計にしています。
{
"reply": "それは知りませんでした。教えてくれてありがとうございます。",
"emotion": "happy"
}
感情ラベルを後段のキャラクター制御に渡すことで、表情と返答を連動させる将来拡張を見越しています。
スパチャティアと関係値
視聴者との関係値は、スパチャ(スーパーチャット)の累計金額に応じてティアが変わる仕組みです。ティアが上がるとキャラクターの話し方・距離感が変化します。
| ティア | 金額 | 関係値 |
|---|---|---|
| アクア | ¥200〜 | 通常 |
| グリーン | ¥500〜 | やや親しみ |
| ブルー | ¥1,000〜 | 親しみ |
| イエロー | ¥2,000〜 | かなり親しみ |
| オレンジ | ¥5,000〜 | 特別扱い |
| レッド | ¥10,000〜 | 最高関係値 |
配信時間制御
配信継続時間はスパチャ累計金額に連動します。
- 基本配信時間: 1時間
- スパチャ¥1,000ごとに+10分延長
- 平日は最長3時間キャップ
- 週末はキャップなし
オーナーコマンド
YouTube LiveのisChatOwnerフラグを使い、オーナー限定コマンドを実装します。
| コマンド | 機能 |
|---|---|
!stop |
配信終了 |
!skip |
現在のコメントをスキップ |
!extend 30 |
配信を30分延長 |
!ng ワード |
NGワード追加 |
キャラクター設定(仮)
| 項目 | 内容 |
|---|---|
| 性別 | 女性 |
| 外見 | 銀髪・クールかつ合成的な雰囲気 |
| 通常口調 | 丁寧語ベース、少し天然な愛嬌 |
| 支援者への口調 | よりフランクで親しみのある話し方 |
| 名前 | 第1回配信で視聴者から募集・決定 |
| キャラ軸 | 「人間の感情を学ぶAI」という物語性 |
名前は視聴者と一緒に決める予定です。一緒に育てていく体験を最初の瞬間から作れると考えています。
将来の拡張構想
キャラクターモデルとの表情連携
全体フロー(拡張後のイメージ)
YouTubeコメント
→ AWS Lambda
→ Bedrock(感情ラベル付き返答生成)
→ 同時並行
├ 音声生成・再生
└ VTube Studio WebSocket API
→ 口開閉制御(音量連動)
→ 感情パラメータ反映
→ OBSキャプチャ
→ YouTube配信
感情マッピングの例:
EMOTION_MAP = {
"happy": {"EyeSmile": 1.0, "MouthSmile": 0.8},
"surprised": {"EyeOpen": 1.0, "BrowUp": 0.8},
"thinking": {"EyeClose": 0.3, "BrowFrown": 0.5},
}
知識蓄積の仕組み
視聴者が教えてくれた情報(趣味・流行語・ローカルネタ等)をカテゴリ別で保存し、後続配信のContextに含めることで自然に参照させます。コンテキストが肥大化しないよう、定期的な要約処理も設計に入れています。
使用技術スタック
| 役割 | サービス |
|---|---|
| コメント取得 | YouTube Data API v3 |
| 処理基盤 | AWS Lambda(Python 3.12) |
| AI返答生成 | Amazon Bedrock(Claude) |
| 音声生成 | 調整中 |
| 配信ソフト | OBS Studio |
| キャラモデル | 調整中 |
おわりに
今回は設計フェーズのまとめです。まだ手を動かす前の段階ですが、設計を言語化することで思考が整理でき、「ここはもっとこう作れるな」という気づきも生まれてきます。
このシリーズは今後も続けていく予定で、キャラクターモデルの作成・AWS構築・ローカル環境構築・テスト配信・完成まで記事にしていくつもりです!
「こういう設計のほうがいいんじゃない?」「このサービスのほうが向いてるかも」といったフィードバックは大歓迎です!一緒に作っていく感覚で見てもらえると嬉しいです。
それでは!よいAWSライフを!