MuseとIrodoriを使った、Windows専用のデスクトップチャットアプリを作ってください。 最初に環境と実装方針を確認し、段階ごとの計画を提示してください。必要な情報が不足している場合は、実装前に確認してください。 1. 基本構成 - C#・WPF・WebView2を使用する。 - 通常のブラウザーを開いておく必要がない、独立した小窓にする。 - WebView2は1つだけ使い、Muse公式画面のDOMと通信を維持したまま、独自のHTML/CSS/JavaScriptチャットUIを重ねる。 - 非公開APIへ直接接続しない。 - ログイン状態はアプリ専用のWebView2プロファイルに保持する。 2. Museとの接続 - 初回はアプリ内の公式画面で本人がログインし、使いたいサイドチャットを選んで固定する。 - 実際のDOMを確認し、発言ID・話者・本文・画像・入力欄・応答中表示を特定する。 - 接続先が違う、ログインが切れている、入力欄を検出できない場合は送信を止める。 - 送信結果が不明な場合は自動再送しない。 - 公式画面と独自チャットUIを切り替えられるようにする。 3. チャットUI - 初期サイズ420×640。本文、複数行入力、送信ボタン、接続状態を表示する。 - Enterで送信、Shift+Enterで改行。日本語変換確定のEnterでは送信しない。 - 発言IDごとに更新し、生成途中の本文や連続した返答を重複表示しない。 - 話者は配置と色で区別し、「自分」などの表示ラベルは付けない。 - Museの返答画像だけを本文下に最大160×160で表示し、クリックで同じ小窓内に拡大する。 - 画像URLは同じWebView2内で再利用し、Cookie抽出や別HTTPクライアントによる取得は行わない。 - 過去ログの自動巡回、会話本文・画像URLの独自保存は行わない。 - 最前面表示を切り替え可能にし、位置・サイズ・接続先を保存する。 4. デスクトップマスコット - 別途指定するPSDまたは透過PNG素材を使用する。元ファイルは変更しない。 - PSDの場合はレイヤー名と座標を調べ、ベース・目・口を透過PNGと位置情報へ書き出す。 - 開眼・半目・閉眼と、必要な口差分を使用する。差分の重ね合わせで体や口元が意図せず変化しないようにする。 - 実行時には素材の書き出し用ツールを必要としない。 - 会話窓の右側に間隔8、下端揃えで透過表示する。初期高さ480。 - 移動・最前面・最小化・復帰を連動させ、マスコットのドラッグでも会話窓を動かせるようにする。 - 完全透過部分は背面をクリックできるようにする。 - 右クリックで表情と高さ360・480・600を選択し、設定を保存する。 - まばたきは開眼→半目40ms→閉眼80ms→半目60ms→開眼。待機間隔3~6秒。 - 音声再生中だけ笑い口を約160ms間隔で開閉する。選択中の目を維持し、終了・停止・エラーで待機口へ戻す。 5. Irodoriによる読み上げ - 相手の環境で指定するIrodoriフォルダーと、そのPython仮想環境を利用する。 - Irodori本体は変更せず、このアプリ側に専用Pythonワーカーを追加する。 - 参照WAVは別途指定する。参照WAVを変更・Git追加・配布物への同梱はしない。 - モデルは既存キャッシュのAratako/Irodori-TTS-v4.1-Smallを使用する。 - 初期設定はモデルCUDA/bf16、codec CUDA/fp32、40ステップ、候補1、seed 0、長さ自動、追加captionなし。 - 初回生成時に起動し、モデルと参照音声の処理結果を終了まで保持する。 - GradioやHTTPサーバーは起動しない。UTF-8標準入出力と要求IDで通信し、PCM16 WAVをメモリで受け渡す。 - キャッシュは必要なファイルをオフラインで参照する。重みの自動ダウンロード、CPUへの自動切替、推論の自動再試行は行わない。 6. 読み上げの操作と制御 - 新着のMuse本文を自動読み上げする。自分の発言と画像だけの返答は対象外。 - 上部に「自動読み上げ」と「停止」を置く。自動読み上げは初期値ONで保存する。 - Museの各本文に再生ボタンを付け、自動OFFでも手動再生できるようにする。 - 履歴を開いただけでは生成・再生しない。 - 表示本文と読み上げ用本文を分け、コードブロック・操作要素・URL・Markdown装飾を読み上げ対象から除く。絵文字や♡・♪は残す。 - 応答中表示が消え、本文が1秒間変化しなくなってから自動生成する。 - 発言順に処理し、同じ発言を自動で繰り返し再生しない。 - 長文は句読点・改行を優先して100文字程度以下に分割し、実トークン数でもモデル上限を確認する。黙って切り捨てない。 - 推論と再生はそれぞれ同時1件。先頭区間ができたら再生し、次区間を生成する。 - 再生はメモリ上のPCM WAVを使用する。SoundPlayer.PlaySyncを使う場合は、停止が即座に効くことを実機で確認する。停止できない場合は、再生を専用の非表示子プロセスに分ける。 - 停止や他発言の手動再生では、現在の再生と待ち行列を止める。進行中の推論結果は破棄し、後続区間を生成しない。 - 音声キャッシュはセッション内のメモリだけに、最大20発言・合計64MiB保持する。 - 会話切替・再接続・公式画面への切替では停止する。最小化中は音声を続ける。 - 終了時は自分が起動したワーカーと再生プロセスだけを終了する。 7. 実装順序と検証 - 最初にMuseとの接続を実証する。実チャットへの送信操作は本人に任せる。 - 接続成功後、チャットUI、画像、マスコット、読み上げの順に実装する。 - 自動テストは隔離したローカルHTML、偽の生成器、ローカル会話データを使う。 - 検証文・画像生成依頼・リアクションを実チャットへ自動送信しない。必要な場合は本人が編集できる下書きにし、本人が送信する。 - 実モデルの初回検証は、本人が承認した固定短文1件だけ。同時1・再試行0・上限5分とする。 - 実行回数、実設定、生成時間、音声長、VRAM使用量、WAV検査結果を記録する。 - エラー時は追加生成を止める。再試行には結果と規模を報告して明示了承を得る。 - 再生・停止・口パクの追加検証には、生成済みの同じ音声を再利用する。 - ビルド成果物、短い利用手順、検証結果を用意する。 - コード編集前にGitの基準点を確認し、検証・差分確認後に対象変更だけをローカルコミットする。