
【個人開発】1年かけて自分用の配信アシスタント型AIを作った話
この記事はyasunaさん(https://x.com/yasun_ai) 主催の
「AIキャラ・AITuber Advent Calendar 2024」の19日目の記事となります。

■記事の対象ユーザ
1.個人開発者の生態に興味がある
2.配信アシスタント型AIキャラに興味がある
3.カズヤ弟が1年配信サボり気味だった理由が気になるリスナーさん

■ようするに?
配信アシスタント型AIの開発について、この1年の振り返りと開発中のアプリの紹介をしているよ。
0.はじめに
私はカズヤ弟ゲームCHというライブ配信中心のチャンネルを細々と運営しているのですが、ゲーム実況をしていると代り映えのない作業シーンや喋り疲れてしまった時にどうしても”間"が生まれてしまうことがあります。
こういった「”間”を埋めてくれて、あわよくば配信を盛り上げてくれる存在」が居てくれたらいいなぁと前々から思っていました。
折しも2023年はChatGPTをはじめとする高性能なAIが安価で手軽に利用できるようになった年で、後述のナマリカルテさんのChatGPTで動くデスクトップマスコット「Vcot」のリリースをきっかけにAIを配信に利用する取り組みをはじめました。まず次章でこの1年間の振り返りをしていきます。

1.配信アシスタント型AIを作るようなるまで
2023/11 Vcotを使った配信
ナマリカルテさん(https://x.com/NamariKarte)が2023/11/4にリリースした”インターネット老人会の心をくすぐる”、デスクトップマスコット「Vcot」。
これはChatGPTのAPIキーとVRMモデルがあれば簡単にデスクトップ常駐型のAIマスコットが配置できるというもので、リリース翌日に早速試してみた配信がこちら。
「Vcot」には音声認識機能もあったのですが当時は不具合で動いておらず、配信内では指定されたプロンプトを元にランダムに独り言をつぶやくという機能のみに留まっていました。
この配信で「ゲームプレイ中にランダムに割り込まれると配信のテンポが非常に悪くなる」というトリビアを得たため「Vcot」を配信アシスタントにするのは残念ながら諦めることに…。

2024/03 AITuber本で実装した独自アプリでの配信
12-1月はStreamDiffusionに、2月はパルワールドに全振りしていたため11月に買ったきりで触れていなかったサルドラさん(https://x.com/sald_ra)の「AITuber本」。
この本では以下の機能が作れるようになる情報がまとめられています。
1.Youtubeからコメントを取得
2.LLMに回答を考えさせる
3.VOICEVOXに音声を作らせる
4.OBSで配信する

私の配信では1~2の機能を取り込んで、トリガーワード「#AI」を含むコメントを入れると画面下部のAI回答欄にテキストを返す仕組みとして2024年3月開始のユニコーンオーバーロード配信で導入。

このシリーズの配信では
・コメント駆動型のため自発的にAIがコメントしない
・配信者自身も配信中は利用できない
・リスナーもわざわざトリガーワードを入力する必要がある
といった仕様から、あまり使用率は高くなく存在感は薄いものに・・・。

2024/06 AITuberKitを使った配信を…しなかった話
そういった課題を解決するために独自開発すべきかどうか悩んでい
た頃に流れて来たのがニケちゃんさん(https://x.com/tegnike)の「AITuberKit」
「Vcot」には「LLMはChatGPTのみ」「音声はVOICEVOXのみ」「更新が止まったしまった」という難点がありましたが、「AITuber Kit」は次々と出てくるAIの新技術をニケちゃんさんがハンパない速度で実装してくれているという個人開発らしからぬプロダクト。
キャラクター名表示が表示されなかったり、字幕表示のデザインやフォント設定が変更できなかったり等の細かいところについては「逆に考えるんだ、自分で改修すればいいやと」といじってみることに。

AITuberキットを改修して名前表示とカスタムCSS追加機能を仮実装。時間経過でコメントが消えるから多少ゲーム画面を侵害しても大丈夫な安心設計。
— カズヤ弟 (@dodo_ria) June 19, 2024
今は固定15秒だけど、音声の終了待って消すようにするのは結構手間な気がしていて、回答を50文字とかで制限するほうが対策は楽なのよね...#AITuberKit pic.twitter.com/7Gcm823Y1x
しかし、ここで問題が。
音声認識機能がChrome系のブラウザだと上手く動かないことが判明。
(当時調べてみたところChromium由来の仕様っぽいことが判りChromium側の改修待ちという状態だった。今はもう治っているかも?)
泣く泣く採用を諦め、独自アプリを開発する方向に舵を切ることに・・・😇
2024/10 配信アシスタント型AIアプリの稼働
独自アプリ開発をはじめた6月、ものすごいタイムリーな本が出版されました。「Pythonで作る」「リアルタイムマルチモーダル対話システム」ということで、まさしく一番の課題だったリアルタイムでの音声認識について詳しく触れられている一冊です。
実装当初は音声認識部分をfaster-whisperなどの高速な文字起こしソフトを使って対応しようとしていましたが、いかに文字起こしが早くても「発話完了→文字起こし」のタイムラグでリアルタイム性が損なわれていました。
本書の第三章「音声対話システム」ではGoogleSpeechAPIを用いて音声ストリームを入力し即時で文字起こしさせる方法が紹介されており、この方法を採用することで(GoogleのAPI利用料はかかりますが)高速で文字起こしするプログラムを作ることが出来ました。
大変参考になったのですが、サルドラさんのAITuber本と比べるとまるで大学の教科書を読んでるような文章の固さがあり、読むのにすごいカロリーが・・・

1番時間が掛かったのは文字起こし部分なんですが「どうせ作るなら色々機能を持たせたい!」とゲーム実況をサボりにサボって以下のような機能も持たせています。
■LLM系
・ChatGPTのAPIのみ利用→Dify連携もできるように追加
■表示系
・表情差分を登録して、口パク+瞬き画像を表示する機能
・発言時にだけキャラ画像と字幕がフェードインしてくる機能
・クロマキー用の背景を設定する機能(OBSでの透過処理用)
■データ系
・アプリ内にSQLiteでDBを構築し、過去の発言(配信者、リスナー、AIキャラ)を保存。AIが回答生成時に参照させられるようにする機能
・OBSからゲーム画面のスクリーンショットを取得してAIに認識させる機能
■機能系
・誰もしゃべらない時間が一定時間あると独り言をしゃべる機能
・停止用トリガーワードで発言を止める機能
・DBにリスナー毎の好感度を保存、好感度によって対応が変わる機能
それらを反映したシステム構成図がこちら。(ちょっと古くてDBがない)

出来上がったシステムは10月の「Tiny Glade」の単発実況にてお披露目。
アバターに選ばれたのは綾鷹、noteでAI系の記事を書く時に各種モデルとして使っていたKhaula(ハウラ)ちゃん。
画像はStableDiffusionで表情差分を作成し、音声はVOICEVOXのもち子さん(ノーマル)を使わせて貰っています。


結局PyAudioのデバイス握ってる部分っぽかったのが解決できず再生処理をsimpleAudioで作り直したら嘘みたいにスムーズに治った。
— カズヤ弟 (@dodo_ria) October 13, 2024
「クソがっ!1日飛んだぞ!!!(Envy」 pic.twitter.com/gWeEEPglcc
試験配信後、諸々のバグ修正と並行して「せっかくならオリジナル音声がいいな!」ってことでStyleBertVITS2を使って新たなKhaulaちゃんボイスを作成。10末からはじめた三國志8REMAKE配信ではシステム側もStyleBertVITS2に対応させて運用を開始しています。
その時調べた内容は単独で記事にしているのでStyleBertVITS2って何?って方はご参考まで。
こうして「Vcot」で配信アシスタントを作ろうと思ってから1年。
2024年の正月に「こんなの作れたらいいなー」と言っていたものを何だかんだ形にすることが出来ました。

2.今後の展開について
一旦は開発完了したものの、作ってるうちにやりたいことも増えていて
今度は外部に公開できるようにと、公開リポジトリを作ってちゃんと基本設計から作り直しをはじめています。(まだ1stコミット程度)
「png-streamer-assistant」ってリポジトリ名ですが、うちの兄者から「静止画の表情差分を使った配信スタイルは海外では”PNG Tuber”と呼ばれ、割とメジャーらしい」という情報をうけてと命名しました。
目下やりたいことが多すぎるのですが、まずは現行プログラムの機能が完成したら公開していこうと思っています。
やりたいことリスト
1.人様にお見せできるコードにする
現行プログラムは流出させてはいけないAPIキーや、各種APIのエンドポイントなどの設定がハードコーディングでたっぷり埋め込まれていて「動けばいいや」状態になってしまっています。折角作ったものなので公開はしたいもののとても人様にお見せできるコードになっていないのが現状です。
2.プログラム間の結合度を落とす
現行プログラムは録音・リアルタイム文字起こしする機能からブラウザで表示する部分まで結合度が高く、どれかを別のプログラムで代替することができません。ニケちゃんさんの様に新しいAI技術が出る度に対応していければいいのですが、そこまでは手が回らないので別システムからでも呼び出せるように結合度を下げて最悪、単品でも動作するように作り替えています。

3.オートパイロットモードの追加
要するにAITuberみたいになるモードです。ゲーム画面とリスナーのコメント、ゲーム情報、過去の記憶を参照しながらAIキャラだけで自発的にゲーム実況するような機能を想定しています。自分は喋らずにプレイするだけでAIキャラが実況してくれるなら、休日だけじゃなくて平日夜も別ゲーを配信できちゃいそうですよね。
4.ショートカットキー操作
現行プログラムでは、配信者は全て音声で制御していますが中々にこの制御が難しく「いちいち呼びかけて対話モードに切り替えないといけない」
「喋った内容が正確に理解されない」など課題を抱えています。
私がよくやるゲームタイトルには幸いにもモンハンやフロムゲーの様な手が離せないものがあまりないので、ショートカットキーを押すことくらいはできるかなと思っています。
ショートカットに「対話モードへの切替」とか「挨拶して」・「画面みてボケて!」とかいうディレクター的な指示を割り当てれば配信でのレスポンス向上を期待できるじゃんね!ってことです。

5.AIキャラの記憶管理
最近はAI Tuber開発者が皆様が試行錯誤されている問題ですね。現行プログラムにも一応機能としては実装されてるんですが、正直全く活かせてないのでどの程度記憶が使えているかも判らない状況なので、まずは効果測定からかなと・・・。キャラのパーソナライズのためにも短期・中期・長期記憶を配信毎に徐々に忘れていけるような記憶整理機能が作れたらいいなぁ。
6.2人目のキャラ
開発最初期からアメとムチ方式で私に辛辣なキャラ(Khaulaちゃん)と私に優しいキャラ(男性キャラ。名前も決まっている)の2人体制を考えているんですが開発工数が足りないせいで理不尽にムチだけ打たれるドM的状況になっています。現行のプログラムでは1キャラ固定の運用しかできないため、基本設計から変える必要があります。

新プログラムの進捗状況
本当だったらこの記事を書くまでに、ある程度動くものを作っておいて
記事の中でプログラムの紹介を~とか思ってたんですが、想像以上にフロント側アプリ開発に手間取ってしまい間に合いませんでした。😇
システムを構成するアプリは4つありますが、フロント側のアプリだけが、
今週になってようやく完成したような進捗具合です。
・表示用のフロントアプリ
・メインのサーバアプリ
・録音・文字起こしアプリ
・アクティブじゃなくてもショートカット認識できるコントローラアプリ
フロントアプリは、アプリ内で設定したキャラクターID、感情ID、ボイスID+メッセージをWebSocketで渡すと「キャラ名表示」「セリフの順次表示」「指定された感情の口パク画像表示」「指定されたボイスで発話」してくれるアプリで、動かすと以下のツイートのような感じになります。
先週実装した内容をコミット忘れで盛大にぶっ壊してしまったのでリカバリーに時間がかかったけど・・・
— カズヤ弟 (@dodo_ria) December 8, 2024
辛うじてVOICEVOX対応だけは今週出来たぞ・・・😇
まだSBV2もAivisも、何なら来週はDMMも待っている pic.twitter.com/zslI2TSr2u
何とか休み中に各種TTS対応を終えることが出来て
— カズヤ弟 (@dodo_ria) December 15, 2024
ひとまずフロント側の全機能FIXできました。
・WebSocketでテキスト/キャラID/感情ID/ボイスID貰う
・表情差分は4枚の画像で登録
・OBS用に完全透過やフェード機能付き
というか #にじボイス 何もチューニングしてないのにこのクオリティなんなのさ!? pic.twitter.com/zGmX6ME15u
この調子でバックエンド側やコントローラーを作りこみ、年内にはv0.1.0として公開できるように・・・頑・・・張・・・(日記はここで途絶えている。
余談.締め切り駆動型開発について
締め切りが無いと本気になれないよね。じゃあ締め切りを設けて自分を追い込めばいいじゃんという精神的開発手法。社会的にはデスマーチの苗木。
今年の後半は目標を立てて自分を追い詰める方向で開発を進めているおかげで長男じゃなくても我慢して開発が続けられています。
例えば11月の生成AIなんでも展示会のような発表の場だったり、今回のアドカレのような執筆イベントだったり、DiscordのLT会だったり・・・。そういうイベントで何かしなきゃ!っていうのはダレがちな個人開発においては割と有効なのでは🤔と思います。
その分ゲーム実況の時間とか睡眠時間とか健康が削られている気がしますが、新アプリが安定稼働したら休みたい配信しまくるぞー!
終われ