【無料】CocoroAI - VRM対応 AIデスクトップマスコット
- ダウンロード商品CocoroAI¥ 0
- ダウンロード商品寄付(内容は同じです)¥ 100
デスクトップ上に3Dモデルを表示するデスクトップマスコットです。 ・VRM0.xの読み込みに対応 ・待機モーション94種 ・テキストチャットと音声対話(長期記憶搭載) - 別途LLMが必要です - 発話にはVOICEVOX/SHAREVOX/AivisSpeechが必要です - 音声認識にはAmiVoice/Wisperが必要です ・REST APIによる通知機能 ・自動デスクトップキャプチャによる能動的なコミュニケーション ・MCP対応 要望がありましたら、DMやマシュマロなどでお気軽にどうぞ! バグ報告もお願いします! マシュマロ https://marshmallow-qa.com/xbhcs0t4pwcvha7?t=F0vqZW&utm_medium=url_text&utm_source=promotion
使い方
CocoroAI.exe をダブルクリックで起動してください キャラクター上で右クリックでメニューが表示されます カーソルから逃げる機能は、Shiftを押している間は無効化されます しゃある様が解説記事を書いてくださいました! https://zenn.dev/sharl/articles/2d3adb1288f4ac
チャットと長期記憶
LiteLLM対応サービスが使用可能です(ローカルLLMも対応) 指定方法は https://docs.litellm.ai/docs/providers を参照ください 会話内容(短期記憶)が context.db に保存されますので情報の扱いにご注意ください 長期記憶を使用する場合は埋め込みモデルの設定をしてください 1536次元のモデルを前提としています。それ以外だと十分な性能が発揮されません(未検証) 長期記憶は CocoroAI\UserData\Memory に保存されます。リセットしたい場合はMemoryフォルダを丸ごと削除してください 初回使用時に設定してある埋め込みモデルでDBが初期化されます
MCP
・stdioのみ対応しています ・npmからVoltaに変更したら改善したという事例がありました ・環境変数が継承されずnpxが実行できないことがあるようです。その場合は以下のようにcmd経由にすると動くかもしれません。 "playwright": { "command": "cmd", "args": [ "/c", "npx", "@playwright/mcp@latest" ] }
アップデート方法
■データインポーター.bat を実行してください
既知の不具合
・一部LLMで記憶機能が動作しません(現状わかっているのはollama/mistrqal, ollama/qwen3:8b, lm_studio系です) 見つけたらご連絡を頂けるとありがたいです
注意事項
・CocoroShell のリバースエンジニアリングを禁じます。 ・本アプリを使用して発生したいかなる損害についても当方は一切の責任を負いません。
その他
キャラクター表示機能以外はOSSです https://github.com/hirona98/CocoroDock https://github.com/hirona98/CocoroCore https://github.com/hirona98/CocoroMemory
アップデート履歴
[2025-07-26: Ver. 3.5.0 Beta] ・Aivis Cloud APIに対応しました ・マウスから逃げる先を指定出来るようにしました ・ローカルLLMでURLを指定できるようにしました ・キャラクター設定とアニメーション設定を複製できるようにしました ・Style-Bert-VITS2に対応しました ・デスクトップウォッチの反応をキャラクターらしくなるよう修正しました ・起動時の位置が復元されない不具合を修正しました ・アニメーションが固定されてしまう不具合を修正しました [2025-07-17: Ver. 3.4.0 Beta] ・通知での画像認識に対応(同時に5枚まで) ・ログ表示機能追加(設定ウインドウ左下ボタン) ・複数のウェイクワードに対応(カンマ区切り) ・マウスドラッグが外れてしまう問題を修正 ・無効アニメーションが指定できなかった不具合を修正 ・記憶参照時にローカル時刻になっていなかったため修正 [2025-07-13: Ver. 3.3.1 Beta] ・記憶が思い出せない問題を修正しました ・OCRによるデスクトップウォッチフィルタリング機能 [2025-07-12: Ver. 3.3.0 Beta] ・MCPの設定変更機能を追加しました ・起動パラメータを変更しました(起動できない環境対応) [2025-07-10: Ver. 3.2.0 Beta] ・MCPに対応しました ・マウスドラッグが途中でキャンセルされてしまうことがあったため改善しました ・メッセージ送信時に正面を向くようにしました ・記憶機能を改善しました [2025-07-04: Ver. 3.1.1 Beta] ・キャラクター位置復元機能をOFF出来るようにしました ・全員の記憶が混濁していたため修正しました(選択中のキャラクターに統合されます) [2025-06-29: Ver. 3.1.0 Beta] ・マイク感度調節機能を追加しました [2025-06-28: Ver. 3.0.2 Beta] ・記憶の参照を改善しました ・text-embedding-3-large 使用時に記憶が欠落する問題を修正しました ・Ollamaで画像処理が出来なかった問題を修正しました ・吹き出し非表示設定を追加しました ・音声認識/音声合成/デスクトップウォッチのクイック切り替えスイッチを追加しました ・ステータスバー表示を改善しました ・終了処理を高速化しました [2025-06-22: Ver. 3.0.0 Beta] ・デスクトップウォッチ機能をつけました ・画像送信に対応しました ・音声認識でAmiVoiceに対応しました ・終了時のキャラクター位置を保存するようにしました ・音声認識とテキストチャットでコンテキストを引き継ぐようにしました ・チャットウインドウのテキストをコピー可能にしました ・設定ウインドウをモードレス化しました ・ステータスバーの情報量を増やしました ・キャラクタープロンプトにVRM0.xで存在しない表情 "Surprised" があったため削除しました ・キャラクターの傾きが間違ってしまうことがあったため修正しました ・プロセスが残ることがあったため修正しました [2025-06-08: Ver. 2.4.0 Beta] ・立っている時と座っている時のループ回数を指定できるようにしました ・UnlitをMToonに変換する機能をつけました(VRM読み込みで色がおかしい場合に使ってください) ・影を落とさないメッシュを指定できるようにしました [2025-06-08: Ver. 2.3.0 Beta] ・通知APIを実装しました ・座り姿勢の角度を調整しました ・パスに全角があると記憶機能が動かない不具合を修正しました [2025-06-03: Ver. 2.2.1 Beta] ・特定のVRMが読み込めない不具合を修正しました ・メッセージ送信時にモーションが急に遷移する不具合を修正しました [2025-06-01: Ver. 2.2.0 Beta] ・モーションを追加しました(追加後94種) ・モーションのON/OFF機能をつけました [2025-05-25: Ver. 2.1.0 Beta] ・長期記憶機能を追加しました ・Speech-to-Text に対応しました(OpenAIのみ) [2025-05-22: Ver. 2.0.1 Beta] ・会話内容を引き継いでいなかった不具合を修正(コンテキストを含んでいなかったため修正) [2025-05-17: Ver. 2.0.0 Beta] ・対応LLMを追加しました ・キャラクター設定変更時、自動的に再起動するよう変更しました ・キャラクター上でホイールスクロールしたときのキャラクターサイズの変更機能を廃止しました ・exeを自己完結型にして.NET Runtime のインストールを不要にしました ・今後の機能追加のためにプログラム構成を大幅変更しました [2025-05-06: Ver. 1.2.1 Beta] ・起動後に設定画面でOKを押すまでチャット機能が使用できなかった不具合を修正しました ・TTSが無効のときにデバッグ用の設定が使用されてしまう不具合を修正しました [2025-04-30: Ver. 1.2.0 Beta] ・右ドラッグで触ったときに仮想キー入力する機能を追加しました(デフォルトはWin+Tab) [2025-04-27: Ver. 1.1.0 Beta] ・表示設定の項目を追加しました [2025-04-21: Ver. 1.0.1 Beta] ・カーソルから逃げる機能の説明を追加しました ・背景が単色でないときに自動的に移動する機能を追加しました(動作不安定です) [2025-04-19: Ver. 1.0.0 Beta] ・公開
Windows用通知スクリプト例
== 実行例 == .\send-notification.ps1 -Message "複数画像テスト" -ImagePath "C:\temp\image1.png","C:\temp\image2.jpg" -From "テストアプリ" == スクリプト例 == #!/usr/bin/env pwsh <# .SYNOPSIS CocoroAI通知APIに画像付きメッセージを送信するスクリプト .DESCRIPTION 指定したメッセージと画像ファイルをCocoroAIのnotification APIに送信します。 複数の画像ファイル(最大5枚)を一度に送信可能です。 .PARAMETER Message 送信するメッセージ(必須) .PARAMETER From 送信者名(デフォルト: "PowerShell") .PARAMETER ImagePath 画像ファイルのパス(複数指定可能、最大5枚) .PARAMETER Port CocoroAI Dockのポート番号(デフォルト: 55604) .PARAMETER Hostname CocoroAI Dockのホスト(デフォルト: "localhost") .EXAMPLE .\send-notification.ps1 -Message "こんにちは" -ImagePath "C:\temp\image1.png" .EXAMPLE .\send-notification.ps1 -Message "複数画像テスト" -ImagePath "C:\temp\image1.png","C:\temp\image2.jpg" -From "テストアプリ" .EXAMPLE .\send-notification.ps1 -Message "作業完了報告" -ImagePath "C:\screenshots\*.png" #> param( [Parameter(Mandatory = $true, HelpMessage = "送信するメッセージを入力してください")] [string]$Message, [Parameter(Mandatory = $false)] [string]$From = "PowerShell", [Parameter(Mandatory = $false)] [string[]]$ImagePath, [Parameter(Mandatory = $false)] [int]$Port = 55604, [Parameter(Mandatory = $false)] [string]$Hostname = "localhost" ) # エラーハンドリング設定 $ErrorActionPreference = "Stop" function Convert-ImageToBase64 { param([string]$FilePath) if (-not (Test-Path $FilePath)) { throw "画像ファイルが見つかりません: $FilePath" } $extension = [System.IO.Path]::GetExtension($FilePath).ToLower() $mimeType = switch ($extension) { ".png" { "image/png" } ".jpg" { "image/jpeg" } ".jpeg" { "image/jpeg" } ".gif" { "image/gif" } ".webp" { "image/webp" } default { throw "サポートされていない画像形式です: $extension (対応形式: .png, .jpg, .jpeg, .gif, .webp)" } } try { $bytes = [System.IO.File]::ReadAllBytes($FilePath) $base64 = [System.Convert]::ToBase64String($bytes) return "data:$mimeType;base64,$base64" } catch { throw "画像ファイルの読み込みに失敗しました: $FilePath - $($_.Exception.Message)" } } function Send-Notification { param( [string]$Message, [string]$From, [string[]]$Images, [string]$Url ) # リクエストボディを作成 $body = @{ from = $From message = $Message } if ($Images -and $Images.Count -gt 0) { $body.images = $Images } $jsonBody = $body | ConvertTo-Json -Depth 10 # HTTPリクエストを送信 try { Write-Host "送信中..." -ForegroundColor Yellow Write-Host "宛先: $Url" -ForegroundColor Gray Write-Host "送信者: $From" -ForegroundColor Gray Write-Host "メッセージ: $Message" -ForegroundColor Gray if ($Images) { Write-Host "画像数: $($Images.Count)枚" -ForegroundColor Gray } $response = Invoke-RestMethod -Uri $Url -Method POST -Body $jsonBody -ContentType "application/json" -TimeoutSec 30 Write-Host "✅ 送信完了!" -ForegroundColor Green return $true } catch { $errorMessage = if ($_.Exception.Response) { $reader = New-Object System.IO.StreamReader($_.Exception.Response.GetResponseStream()) $errorBody = $reader.ReadToEnd() $reader.Close() try { $errorJson = $errorBody | ConvertFrom-Json $errorJson.error } catch { $errorBody } } else { $_.Exception.Message } Write-Host "❌ 送信失敗: $errorMessage" -ForegroundColor Red return $false } } # メイン処理 try { Write-Host "=== CocoroAI 通知送信スクリプト ===" -ForegroundColor Cyan $url = "http://${Hostname}:${Port}/api/v1/notification" # 画像の処理 $base64Images = @() if ($ImagePath -and $ImagePath.Count -gt 0) { Write-Host "画像ファイルを処理中..." -ForegroundColor Yellow # ワイルドカードを展開 $expandedPaths = @() foreach ($path in $ImagePath) { Write-Host " チェック中: $path" -ForegroundColor Gray try { # Get-ChildItemを使用してワイルドカードを正しく展開 $resolvedItems = Get-ChildItem -Path $path -File -ErrorAction Stop $expandedPaths += $resolvedItems.FullName Write-Host " ✅ 見つかりました: $($resolvedItems.Count)ファイル" -ForegroundColor Green } catch { # ワイルドカードでない場合は直接パスをチェック if (Test-Path $path -PathType Leaf) { $expandedPaths += (Resolve-Path $path).Path Write-Host " ✅ 直接パスで見つかりました" -ForegroundColor Green } else { Write-Warning "パスが見つかりません: $path" # ディレクトリが存在するかチェック $dir = Split-Path $path -Parent if (Test-Path $dir) { Write-Host " ディレクトリは存在します: $dir" -ForegroundColor Yellow $files = Get-ChildItem -Path $dir -File | Select-Object -First 5 Write-Host " ディレクトリ内のファイル例:" -ForegroundColor Yellow $files | ForEach-Object { Write-Host " $($_.Name)" -ForegroundColor Yellow } } else { Write-Host " ディレクトリも存在しません: $dir" -ForegroundColor Red } } } } if ($expandedPaths.Count -eq 0) { throw "有効な画像ファイルが見つかりませんでした" } if ($expandedPaths.Count -gt 5) { Write-Warning "画像が5枚を超えています。最初の5枚のみ送信します。" $expandedPaths = $expandedPaths[0..4] } foreach ($imagePath in $expandedPaths) { Write-Host " 処理中: $(Split-Path $imagePath -Leaf)" -ForegroundColor Gray $base64Image = Convert-ImageToBase64 -FilePath $imagePath $base64Images += $base64Image # ファイルサイズチェック(概算) $fileSizeKB = (Get-Item $imagePath).Length / 1KB Write-Host " サイズ: $([math]::Round($fileSizeKB))KB" -ForegroundColor Gray } # 全体サイズチェック(Base64は約1.33倍になる) $totalSizeMB = ($base64Images | ForEach-Object { $_.Length }) | Measure-Object -Sum | ForEach-Object { $_.Sum / 1MB } if ($totalSizeMB -gt 15) { throw "画像の合計サイズが15MBを超えています: $([math]::Round($totalSizeMB, 2))MB" } Write-Host "✅ $($base64Images.Count)枚の画像を準備完了 (合計: $([math]::Round($totalSizeMB, 2))MB)" -ForegroundColor Green } # 通知を送信 $success = Send-Notification -Message $Message -From $From -Images $base64Images -Url $url if ($success) { exit 0 } else { exit 1 } } catch { Write-Host "❌ エラー: $($_.Exception.Message)" -ForegroundColor Red Write-Host "詳細: $($_.ScriptStackTrace)" -ForegroundColor DarkRed exit 1 }