目次

  1. 1. 仕様 v2.0 概要
  2. 2. 0-1. 仕組み
  3. 3. 0-2. 準備
  4. 4. 1. Expressions
  5. 5. 2. Motions
  6. 6. 3. アップロード

【上級者向け】Live2D アバターファイルを編集して、セリフに応じた感情表現・モーションをさせる方法

最終更新日

Live2D アバター仕様 v2.0

0-1. セリフ内容に応じた表現をさせる仕組み

NoLang では、「感情」や「ジェスチャー」のタグを用意しています。

Live2D には、表情(Expression)や動き(Motion)があらかじめ設定されているものがあります。そのような Live2D であれば、あなたが Expression / Motion を NoLang の「感情」「ジェスチャー」のタグと対応づけることで、NoLang がセリフから「感情」や「ジェスチャー」を連想した時に、対応する Expression / Motion が呼び出されるようになっています。

感情・ジェスチャータグと Expression / Motion の対応の図解
感情タグ一覧
Tag 日本語例
happy 嬉しい/楽しい
amused 笑い
proud ドヤ顔
sad 悲しい
disappointed がっかり
angry 怒り
annoyed ムッ
fear 恐れ/青ざめ
surprise 驚き
disgust 不快感
gentle 優しい/穏やか
excited 興奮
thinking 考え中
embarrassed 照れ
confused 困惑/はてな
tired 眠い/疲れ
serious 真剣
love ハート目
sweating 汗/緊張
ジェスチャータグ一覧
Tag 用途例
point 指差し
nod うなずき
shake_head 首振り(否定)
bow お辞儀
wave 手振り/バイバイ
clap 拍手
thumbs_up グッドサイン
thumbs_down バッドサイン
fist_pump ガッツポーズ
facepalm 顔を覆う
head_tilt 首かしげ
jump 跳ねる
spin 回転
shrug 肩すくめ
emphasize 強調(二重線・ひらめき等)

0-2. 準備

Live2D ファイルが入ったフォルダから、拡張子が .model3.json のファイルを探し出し、開きます。

例えば、以下のような中身になっています
{
"Version": 3,
"FileReferences": {
"Moc": "hoge_0001.moc3",
"Textures": [
"hoge_0001.4096/texture_00.png"
],
"Physics": "hoge_0001.physics3.json",
"DisplayInfo": "hoge_0001.cdi3.json",
"Expressions": [
{
"Name": "expression1",
"File": "animation/costume_v0001.exp3.json"
}
],
"Motions": {
"Idle": [
{
"File": "motions/default1.motion3.json",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
},
{
"File": "motions/default5.motion3.json",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
},
{
"Type": "SL",
"File": "motions/default3.motion3.json",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
}
]
}
},
"Groups": [
{
"Target": "Parameter",
"Name": "LipSync",
"Ids": ["ParamMouthOpenY"]
}
]
}

1. Expressions(表情・装着品・エフェクトなど)の設定

1-1. 常に適用される Expression

拡張子が .exp3.json のファイルで記述された Expressions(表情・装着品・エフェクトなど)を、動画再生中に常に適用することができます。

"FileReferences""Expressions" を必要に応じて作成し、そこに以下のように Expression の "Name""NOLANG_P_<任意名>" を記述してください。

"Expressions": [
{
"Name": "NOLANG_P_<任意名>",
"File": "<PATH to .exp3.json>"
}
]

NoLang では、「"Name""NOLANG_P" で始まる、ある一つの Expression」を動画再生中、最初から最後まで適用します。

1-2. セリフ内容に応じて適用される Expression

セリフ内容に応じて適用される Expression を設定することもできます。

以下のように各 Expression の "Name""NOLANG_E_<emotion>_<任意名>" の形式で「0-1. 仕組み」の「感情タグ一覧」に記載されているタグのいずれかを記述してください。

"Expressions": [
{
"Name": "NOLANG_E_happy_<任意名>",
"File": "<PATH to .exp3.json>"
},
{
"Name": "NOLANG_E_amused_<任意名>",
"File": "<PATH to .exp3.json>"
}
]

複数の Expression を 1 つの emotion に紐づけることも可能です。その場合、NoLang で毎回適切な Expression が選択されます。

2. Motions の設定

2-1. ベース適用される Motion

拡張子が .motion3.json のファイルで記述された Motions を、動画再生中に適用することができます。

"FileReferences""Motions""Idle" を必要に応じて作成し、そこに以下のように各 Motion の "Type""S", "L", "SL" のいずれかを設定してください。

"Motions": {
"Idle": [
{
"Type": "S",
"File": "<PATH to .motion3.json>",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
},
{
"Type": "L",
"File": "<Another PATH to .motion3.json>",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
},
{
"Type": "SL",
"File": "<Another PATH to .motion3.json>",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
}
]
}

NoLang では、モーションを 3 つのタイプに分類し、処理しています。

  1. "Type": "S" → 話している時にのみ適用される Motion
  2. "Type": "L" → 聞いている時にのみ適用される Motion
  3. "Type": "SL" → 話している時にも聞いている時にも適用される Motion

"S", "L" の各々について、複数の Motion が含まれている場合は、適切なものが呼び出されます。一つも Motion が含まれていない場合は、別途アルゴリズムによりモーションが割り当てられます。

2-2. セリフ内容に合う「感情」に応じて適用される Motion

同様に、セリフ内容に合う「感情」に応じて適用される Motion を設定することもできます。

以下のように各 Motion の "Type" に「0-1. 仕組み」の「感情タグ一覧」に記載されているタグのいずれかを記述してください。

"Motions": {
"Emotion": [
{
"Type": "happy",
"File": "<PATH to .motion3.json>",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
},
{
"Type": "amused",
"File": "<Another PATH to .motion3.json>",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
}
]
}

2-3. セリフ内容に合う「ジェスチャー」に応じて適用される Motion

同様に、セリフ内容に合う「ジェスチャー」に応じて適用される Motion を設定することもできます。

以下のように各 Motion の "Type" に「0-1. 仕組み」の「ジェスチャータグ一覧」に記載されているタグのいずれかを記述してください。

"Motions": {
"Gesture": [
{
"Type": "point",
"File": "<PATH to .motion3.json>",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
},
{
"Type": "nod",
"File": "<Another PATH to .motion3.json>",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
}
]
}

3. NoLang へのアップロード

編集・保存を終えたら、関連ファイルと一緒に zip ファイルにまとめ、NoLang にアップロードしてください。

最終的に .model3.json のファイルの中身は、例えば以下のようになります。

完成形の .model3.json の例
{
"Version": 3,
"FileReferences": {
"Moc": "hoge_0001.moc3",
"Textures": [
"hoge_0001.4096/texture_00.png"
],
"Physics": "hoge_0001.physics3.json",
"DisplayInfo": "hoge_0001.cdi3.json",
"Expressions": [
{
"Name": "NOLANG_P_1",
"File": "animation/costume_v0001.exp3.json"
},
{
"Name": "NOLANG_E_happy_1",
"File": "expressions/smile.exp3.json"
},
{
"Name": "NOLANG_E_amused_1",
"File": "expressions/laugh.exp3.json"
}
],
"Motions": {
"Idle": [
{
"Type": "S",
"File": "motions/default1.motion3.json",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
},
{
"Type": "L",
"File": "motions/default5.motion3.json",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
},
{
"Type": "SL",
"File": "motions/default3.motion3.json",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
}
],
"Emotion": [
{
"Type": "happy",
"File": "motions/Happy_Pose.motion3.json",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
},
{
"Type": "amused",
"File": "motions/amused_Pose.motion3.json",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
}
],
"Gesture": [
{
"Type": "point",
"File": "motions/Point_Hand.motion3.json",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
},
{
"Type": "nod",
"File": "motions/Nod_Head.motion3.json",
"FadeInTime": 0.5,
"FadeOutTime": 0.5
}
]
}
},
"Groups": [
{
"Target": "Parameter",
"Name": "LipSync",
"Ids": ["ParamMouthOpenY"]
}
]
}