~/Library/Application Support/im.vora.vivi/characters/CHARACTER STUDIO / カスタムガイド
自分だけの VIVIを
つくろう。
透過イラストと、いくつかの JSON ファイル。アプリを再ビルドせずに、キャラクターと動きを追加できます。
VORA VIVI はデスクトップ専用です。インストール版は初回リリースを準備中です。以下は実際のアプリ検証器に基づく制作仕様です。
YOUR VIVIYOUR STYLE ✦
01 / START
動くサンプルから、はじめよう。
サンプルの .vivipack には、透過イラスト12枚のタイピングと静止した待機ポーズが入っています。ZIP として展開し、自分のイラストに置き換えてください。全動作を含むパックではありません。
02 / YOUR FOLDER
このフォルダーに入れます。
VIVI を右クリック → キャラクター → キャラクターフォルダーを開く、で実際の保存先を確認できます。次の場所に <packId>/<packVersion>/ を作成してください。
%APPDATA%\im.vora.vivi\characters\~/.local/share/im.vora.vivi/characters/Windows はエクスプローラーのアドレス欄、macOS は Finder → 移動 → フォルダへ移動を使います。Linux で XDG_DATA_HOME を設定している場合は、その場所が優先されます。
<packId>/<packVersion>/character.json03 / THE FILES
キャラクターひとつに、フォルダーひとつ。
character.json はキャラクター情報と動作の対応表、frames.json はフレームの順番と表示時間です。ファイルのパスはすべてパックのルートを基準にします。
my-vivi.starter/
└── 1.0.0/
├── character.json
├── checksums.json
└── clips/
├── idle/frames.json
└── typing/
├── frames.json
├── typing-01.png
└── … typing-12.pngcharacter.json — キャラクターとイベント
{
"schemaVersion": 1,
"packId": "my-vivi.starter",
"packVersion": "1.0.0",
"canvas": {
"width": 1024,
"height": 896
},
"defaultDisplayHeight": 160,
"clips": {
"typing": {
"frameCount": 12,
"sequence": "clips/typing/frames.json",
"entryPose": "typing.ready",
"exitPose": "typing.ready",
"loop": true
}
},
"eventBindings": {
"idle": [
"typing"
],
"chat.waiting": [
"typing"
]
}
}frames.json — フレーム順
{
"frames": [
{
"file": "clips/typing/typing-01.png",
"durationMs": 100,
"marker": "rest"
},
{
"file": "clips/typing/typing-02.png",
"durationMs": 100
}
]
}以下はサンプルの主要部分です。パックには12枚の原画と完全な JSON が含まれます。
04 / MAKE IT MOVE
全身のイラストで、自然な動きに。
一枚を揺らしたり手足だけを回転させたりせず、動作ごとの全身原画を連続させます。開始・終了ポーズと足の接地点をそろえてください。
- 透過背景の PNG または WebP。すべてのフレームを同じキャンバスサイズにします。
- 原画は最大2048×2048、表示高さは80〜320px。推奨表示高さは160pxです。
- 1動作は1〜240フレーム、1フレームは16〜30,000ms。サンプルは12フレーム・100msです。
- anchor は足の基準点、bubbleAnchor は吹き出しの起点です。座標は0〜1で指定します。
- ループの entryPose と exitPose は同じ値にします。異なるポーズはつなぎ原画と transitions で結びます。
- スクリプトや実行ファイルは含めません。展開後のパック全体は最大512MiBです。
どんなとき、どの動きを?
| イベント | 動き |
|---|---|
idle | 基本の待機 — 必須 |
chat.waiting | 最初の返答を待つ間 |
chat.streaming | 回答のストリーミング中 |
chat.complete | 回答完了 |
input.listening | 音声入力中 |
file.uploading | ファイルのアップロード中 |
notification | VORA の通知 |
calendar.reminder | カレンダーのリマインダー |
cua.working | コンピューター操作中 |
update.available | 新バージョンの通知 |
動作がないイベントには fallbacks を設定できます。循環参照は禁止です。季節・メディア別の拡張イベントは、アプリの対応仕様に合わせて追加します。
05 / TRY IT ON
できあがったら、VIVI へ。
- 簡単な方法:フォルダー内のファイルを ZIP にして拡張子を .vivipack に変更します。ZIP のルートに character.json が必要です。
- VIVI を右クリック → キャラクター → パックを読み込む、から .vivipack を選択します。検証後に適用されます。
- 直接コピー:上記の OS 別フォルダーに <packId>/<packVersion>/ を配置し、キャラクター一覧を更新して選択します。
- checksums.json がある場合は、変更ファイルの SHA-256 も更新します。個人用パックでは省略できます。
- 不正なパックは適用せず、現在のキャラクターを維持します。アプリのインストール先にある標準 VIVI を直接編集しないでください。
06 / A LITTLE HELP
うまくいかないときは。
一覧に出ません+
character.json の位置、packId、packVersion を確認して一覧を更新します。
イラストが飛んだり切れたりします+
サイズ・透過余白・anchor を全フレームでそろえ、160pxの実サイズで確認します。
フレーム数が違います+
frameCount と frames 配列の長さを一致させます。ファイル名の大文字・小文字も確認してください。
切り替えが不自然です+
前の exitPose と次の entryPose を結ぶ原画を登録します。フェードだけで代用しません。
ハッシュが一致しません+
編集後に checksums.json の SHA-256 を更新するか、個人用パックではこのファイルを省略します。