modify animation setting, update supportting onnx for mmvc v.1.5.x

This commit is contained in:
wataru 2023-04-03 01:22:44 +09:00
parent 9718afaa0d
commit 586d83c550
40 changed files with 6933 additions and 6223 deletions

1
.gitignore vendored
View File

@ -26,6 +26,7 @@ server/model_so-vits-svc-40/
server/model_so-vits-svc-40_mahiro/
server/model_so-vits-svc-40_amitaro/
server/model_so-vits-svc-40_tsukuyomi/
server/model_so-vits-svc-40_kikotokurage
model_DDSP-SVC/
server/model_sovits
server/test

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,7 @@
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.4",
"@types/node": "^18.15.11",
"@types/react": "^18.0.31",
"@types/react": "^18.0.32",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -51,7 +51,7 @@
"webpack-dev-server": "^4.13.2"
},
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.99",
"@dannadori/voice-changer-client-js": "^1.0.101",
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,7 @@
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.4",
"@types/node": "^18.15.11",
"@types/react": "^18.0.31",
"@types/react": "^18.0.32",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -51,7 +51,7 @@
"webpack-dev-server": "^4.13.2"
},
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.99",
"@dannadori/voice-changer-client-js": "^1.0.101",
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",

View File

@ -1,40 +1,40 @@
[
{ "mode": "normal", "z_index": 0, "number": 10, "layer_path": "ROOT_全身" },
{ "mode": "normal", "z_index": 1, "number": 500, "layer_path": "ROOT_!目_*通常" },
{ "mode": "normal", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*通常→" },
{ "mode": "normal", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "normal", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*∩∩" },
{ "mode": "normal", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "normal", "z_index": 2, "number": 800, "layer_path": "ROOT_!口_*にこ" },
{ "mode": "normal", "z_index": 2, "number": 100, "layer_path": "ROOT_!口_*おすまし" },
{ "mode": "normal", "z_index": 3, "number": 1000, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "normal", "z_index": 3, "number": 1000, "layer_path": "ROOT_!眉_*通常" },
{ "mode": "normal", "z_index": 4, "number": 1000, "layer_path": "ROOT_表情_なし" },
{ "mode": "normal", "z_index": 4, "number": 1000, "layer_path": "ROOT_表情_赤面" },
{ "mode": "normal", "z_index": 5, "number": 1000, "layer_path": "ROOT_漫符_なし" },
{ "mode": "normal", "z_index": 0, "number": 1, "layer_path": "ROOT_全身" },
{ "mode": "normal", "z_index": 1, "number": 50, "layer_path": "ROOT_!目_*通常" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*通常→" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*∩∩" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "normal", "z_index": 2, "number": 80, "layer_path": "ROOT_!口_*にこ" },
{ "mode": "normal", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*おすまし" },
{ "mode": "normal", "z_index": 3, "number": 100, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "normal", "z_index": 3, "number": 100, "layer_path": "ROOT_!眉_*通常" },
{ "mode": "normal", "z_index": 4, "number": 100, "layer_path": "ROOT_表情_なし" },
{ "mode": "normal", "z_index": 4, "number": 100, "layer_path": "ROOT_表情_赤面" },
{ "mode": "normal", "z_index": 5, "number": 100, "layer_path": "ROOT_漫符_なし" },
{ "mode": "talking", "z_index": 0, "number": 10, "layer_path": "ROOT_全身" },
{ "mode": "talking", "z_index": 1, "number": 500, "layer_path": "ROOT_!目_*通常" },
{ "mode": "talking", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*通常→" },
{ "mode": "talking", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "talking", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*∩∩" },
{ "mode": "talking", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "talking", "z_index": 2, "number": 100, "layer_path": "ROOT_!口_*お" },
{ "mode": "talking", "z_index": 2, "number": 50, "layer_path": "ROOT_!口_*え" },
{ "mode": "talking", "z_index": 2, "number": 100, "layer_path": "ROOT_!口_* -" },
{ "mode": "talking", "z_index": 2, "number": 50, "layer_path": "ROOT_!口_*う" },
{ "mode": "talking", "z_index": 2, "number": 100, "layer_path": "ROOT_!口_*にこ" },
{ "mode": "talking", "z_index": 3, "number": 200, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "talking", "z_index": 3, "number": 400, "layer_path": "ROOT_!眉_*通常" },
{ "mode": "talking", "z_index": 3, "number": 400, "layer_path": "ROOT_!眉_*ドヤ" },
{ "mode": "talking", "z_index": 4, "number": 200, "layer_path": "ROOT_表情_なし" },
{ "mode": "talking", "z_index": 4, "number": 1000, "layer_path": "ROOT_表情_赤面" },
{ "mode": "talking", "z_index": 5, "number": 100, "layer_path": "ROOT_漫符_なし" },
{ "mode": "talking", "z_index": 5, "number": 1000, "layer_path": "ROOT_漫符_*♪" },
{ "mode": "talking", "z_index": 0, "number": 10, "layer_path": "ROOT_全身" },
{ "mode": "talking", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*え" },
{ "mode": "talking", "z_index": 3, "number": 10, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "talking", "z_index": 4, "number": 10, "layer_path": "ROOT_表情_なし" },
{ "mode": "talking", "z_index": 5, "number": 10, "layer_path": "ROOT_漫符_なし" }
{ "mode": "talking", "z_index": 0, "number": 1, "layer_path": "ROOT_全身" },
{ "mode": "talking", "z_index": 1, "number": 50, "layer_path": "ROOT_!目_*通常" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*通常→" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*∩∩" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*お" },
{ "mode": "talking", "z_index": 2, "number": 5, "layer_path": "ROOT_!口_*え" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_* -" },
{ "mode": "talking", "z_index": 2, "number": 5, "layer_path": "ROOT_!口_*う" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*にこ" },
{ "mode": "talking", "z_index": 3, "number": 20, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "talking", "z_index": 3, "number": 40, "layer_path": "ROOT_!眉_*通常" },
{ "mode": "talking", "z_index": 3, "number": 40, "layer_path": "ROOT_!眉_*ドヤ" },
{ "mode": "talking", "z_index": 4, "number": 20, "layer_path": "ROOT_表情_なし" },
{ "mode": "talking", "z_index": 4, "number": 100, "layer_path": "ROOT_表情_赤面" },
{ "mode": "talking", "z_index": 5, "number": 10, "layer_path": "ROOT_漫符_なし" },
{ "mode": "talking", "z_index": 5, "number": 100, "layer_path": "ROOT_漫符_*♪" },
{ "mode": "talking", "z_index": 0, "number": 1, "layer_path": "ROOT_全身" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*" },
{ "mode": "talking", "z_index": 2, "number": 1, "layer_path": "ROOT_!口_*え" },
{ "mode": "talking", "z_index": 3, "number": 1, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "talking", "z_index": 4, "number": 1, "layer_path": "ROOT_表情_なし" },
{ "mode": "talking", "z_index": 5, "number": 1, "layer_path": "ROOT_漫符_なし" }
]

View File

@ -2,5 +2,5 @@
"charaName": "あみたろ",
"psdFile": "/assets/settings/image.psd",
"motionFile": "/assets/settings/motion.json",
"motionSpeedRate": 0.1
"motionSpeedRate": 1
}

View File

@ -2,13 +2,13 @@
{ "mode": "normal", "z_index": 0, "number": 40, "layer_path": "ROOT_normal2" },
{ "mode": "normal", "z_index": 0, "number": 100, "layer_path": "ROOT_normal3" },
{ "mode": "talking", "z_index": 0, "number": 40, "layer_path": "ROOT_normal1" },
{ "mode": "talking", "z_index": 0, "number": 50, "layer_path": "ROOT_talk2" },
{ "mode": "talking", "z_index": 0, "number": 100, "layer_path": "ROOT_talk1" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_normal2" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_talk-u1" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_talk-u2" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_talk-u3" },
{ "mode": "talking", "z_index": 0, "number": 40, "layer_path": "ROOT_talk-u4" },
{ "mode": "talking", "z_index": 0, "number": 100, "layer_path": "ROOT_normal1" }
{ "mode": "talking", "z_index": 0, "number": 5, "layer_path": "ROOT_talk2" },
{ "mode": "talking", "z_index": 0, "number": 10, "layer_path": "ROOT_talk1" },
{ "mode": "talking", "z_index": 0, "number": 11, "layer_path": "ROOT_talk-u2" },
{ "mode": "talking", "z_index": 0, "number": 11, "layer_path": "ROOT_talk-u1" },
{ "mode": "talking", "z_index": 0, "number": 11, "layer_path": "ROOT_talk-u3" },
{ "mode": "talking", "z_index": 0, "number": 11, "layer_path": "ROOT_talk-u1" },
{ "mode": "talking", "z_index": 0, "number": 11, "layer_path": "ROOT_talk-u2" },
{ "mode": "talking", "z_index": 0, "number": 11, "layer_path": "ROOT_talk-u1" },
{ "mode": "talking", "z_index": 0, "number": 4, "layer_path": "ROOT_talk-u4" }
]

View File

@ -2,5 +2,5 @@
"charaName": "​黄琴海月",
"psdFile": "/assets/settings/image.psd",
"motionFile": "/assets/settings/motion.json",
"motionSpeedRate": 4
"motionSpeedRate": 1
}

View File

@ -1,14 +1,40 @@
[
{ "mode": "normal", "z_index": 0, "number": 40, "layer_path": "ROOT_normal2" },
{ "mode": "normal", "z_index": 0, "number": 100, "layer_path": "ROOT_normal3" },
{ "mode": "normal", "z_index": 0, "number": 1, "layer_path": "ROOT_全身" },
{ "mode": "normal", "z_index": 1, "number": 50, "layer_path": "ROOT_!目_*通常" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*通常→" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*∩∩" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "normal", "z_index": 2, "number": 80, "layer_path": "ROOT_!口_*にこ" },
{ "mode": "normal", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*おすまし" },
{ "mode": "normal", "z_index": 3, "number": 100, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "normal", "z_index": 3, "number": 100, "layer_path": "ROOT_!眉_*通常" },
{ "mode": "normal", "z_index": 4, "number": 100, "layer_path": "ROOT_表情_なし" },
{ "mode": "normal", "z_index": 4, "number": 100, "layer_path": "ROOT_表情_赤面" },
{ "mode": "normal", "z_index": 5, "number": 100, "layer_path": "ROOT_漫符_なし" },
{ "mode": "talking", "z_index": 0, "number": 40, "layer_path": "ROOT_normal1" },
{ "mode": "talking", "z_index": 0, "number": 50, "layer_path": "ROOT_talk2" },
{ "mode": "talking", "z_index": 0, "number": 100, "layer_path": "ROOT_talk1" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_normal2" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_talk-u1" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_talk-u2" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_talk-u3" },
{ "mode": "talking", "z_index": 0, "number": 40, "layer_path": "ROOT_talk-u4" },
{ "mode": "talking", "z_index": 0, "number": 100, "layer_path": "ROOT_normal1" }
{ "mode": "talking", "z_index": 0, "number": 1, "layer_path": "ROOT_全身" },
{ "mode": "talking", "z_index": 1, "number": 50, "layer_path": "ROOT_!目_*通常" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*通常→" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*∩∩" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*お" },
{ "mode": "talking", "z_index": 2, "number": 5, "layer_path": "ROOT_!口_*え" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_* -" },
{ "mode": "talking", "z_index": 2, "number": 5, "layer_path": "ROOT_!口_*う" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*にこ" },
{ "mode": "talking", "z_index": 3, "number": 20, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "talking", "z_index": 3, "number": 40, "layer_path": "ROOT_!眉_*通常" },
{ "mode": "talking", "z_index": 3, "number": 40, "layer_path": "ROOT_!眉_*ドヤ" },
{ "mode": "talking", "z_index": 4, "number": 20, "layer_path": "ROOT_表情_なし" },
{ "mode": "talking", "z_index": 4, "number": 100, "layer_path": "ROOT_表情_赤面" },
{ "mode": "talking", "z_index": 5, "number": 10, "layer_path": "ROOT_漫符_なし" },
{ "mode": "talking", "z_index": 5, "number": 100, "layer_path": "ROOT_漫符_*♪" },
{ "mode": "talking", "z_index": 0, "number": 1, "layer_path": "ROOT_全身" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*" },
{ "mode": "talking", "z_index": 2, "number": 1, "layer_path": "ROOT_!口_*え" },
{ "mode": "talking", "z_index": 3, "number": 1, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "talking", "z_index": 4, "number": 1, "layer_path": "ROOT_表情_なし" },
{ "mode": "talking", "z_index": 5, "number": 1, "layer_path": "ROOT_漫符_なし" }
]

View File

@ -1,6 +1,6 @@
{
"charaName": "​黄琴海月",
"charaName": "あみたろ",
"psdFile": "/assets/settings/image.psd",
"motionFile": "/assets/settings/motion.json",
"motionSpeedRate": 4
"motionSpeedRate": 1
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,7 @@
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.4",
"@types/node": "^18.15.11",
"@types/react": "^18.0.31",
"@types/react": "^18.0.32",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -51,8 +51,8 @@
"webpack-dev-server": "^4.13.2"
},
"dependencies": {
"@dannadori/psdanimator": "^1.0.17",
"@dannadori/voice-changer-client-js": "^1.0.99",
"@dannadori/psdanimator": "^1.0.19",
"@dannadori/voice-changer-client-js": "^1.0.101",
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",

View File

@ -1,40 +1,40 @@
[
{ "mode": "normal", "z_index": 0, "number": 10, "layer_path": "ROOT_全身" },
{ "mode": "normal", "z_index": 1, "number": 500, "layer_path": "ROOT_!目_*通常" },
{ "mode": "normal", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*通常→" },
{ "mode": "normal", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "normal", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*∩∩" },
{ "mode": "normal", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "normal", "z_index": 2, "number": 800, "layer_path": "ROOT_!口_*にこ" },
{ "mode": "normal", "z_index": 2, "number": 100, "layer_path": "ROOT_!口_*おすまし" },
{ "mode": "normal", "z_index": 3, "number": 1000, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "normal", "z_index": 3, "number": 1000, "layer_path": "ROOT_!眉_*通常" },
{ "mode": "normal", "z_index": 4, "number": 1000, "layer_path": "ROOT_表情_なし" },
{ "mode": "normal", "z_index": 4, "number": 1000, "layer_path": "ROOT_表情_赤面" },
{ "mode": "normal", "z_index": 5, "number": 1000, "layer_path": "ROOT_漫符_なし" },
{ "mode": "normal", "z_index": 0, "number": 1, "layer_path": "ROOT_全身" },
{ "mode": "normal", "z_index": 1, "number": 50, "layer_path": "ROOT_!目_*通常" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*通常→" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*∩∩" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "normal", "z_index": 2, "number": 80, "layer_path": "ROOT_!口_*にこ" },
{ "mode": "normal", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*おすまし" },
{ "mode": "normal", "z_index": 3, "number": 100, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "normal", "z_index": 3, "number": 100, "layer_path": "ROOT_!眉_*通常" },
{ "mode": "normal", "z_index": 4, "number": 100, "layer_path": "ROOT_表情_なし" },
{ "mode": "normal", "z_index": 4, "number": 100, "layer_path": "ROOT_表情_赤面" },
{ "mode": "normal", "z_index": 5, "number": 100, "layer_path": "ROOT_漫符_なし" },
{ "mode": "talking", "z_index": 0, "number": 10, "layer_path": "ROOT_全身" },
{ "mode": "talking", "z_index": 1, "number": 500, "layer_path": "ROOT_!目_*通常" },
{ "mode": "talking", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*通常→" },
{ "mode": "talking", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "talking", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*∩∩" },
{ "mode": "talking", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "talking", "z_index": 2, "number": 100, "layer_path": "ROOT_!口_*お" },
{ "mode": "talking", "z_index": 2, "number": 50, "layer_path": "ROOT_!口_*え" },
{ "mode": "talking", "z_index": 2, "number": 100, "layer_path": "ROOT_!口_* -" },
{ "mode": "talking", "z_index": 2, "number": 50, "layer_path": "ROOT_!口_*う" },
{ "mode": "talking", "z_index": 2, "number": 100, "layer_path": "ROOT_!口_*にこ" },
{ "mode": "talking", "z_index": 3, "number": 200, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "talking", "z_index": 3, "number": 400, "layer_path": "ROOT_!眉_*通常" },
{ "mode": "talking", "z_index": 3, "number": 400, "layer_path": "ROOT_!眉_*ドヤ" },
{ "mode": "talking", "z_index": 4, "number": 200, "layer_path": "ROOT_表情_なし" },
{ "mode": "talking", "z_index": 4, "number": 1000, "layer_path": "ROOT_表情_赤面" },
{ "mode": "talking", "z_index": 5, "number": 100, "layer_path": "ROOT_漫符_なし" },
{ "mode": "talking", "z_index": 5, "number": 1000, "layer_path": "ROOT_漫符_*♪" },
{ "mode": "talking", "z_index": 0, "number": 10, "layer_path": "ROOT_全身" },
{ "mode": "talking", "z_index": 1, "number": 10, "layer_path": "ROOT_!目_*" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*え" },
{ "mode": "talking", "z_index": 3, "number": 10, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "talking", "z_index": 4, "number": 10, "layer_path": "ROOT_表情_なし" },
{ "mode": "talking", "z_index": 5, "number": 10, "layer_path": "ROOT_漫符_なし" }
{ "mode": "talking", "z_index": 0, "number": 1, "layer_path": "ROOT_全身" },
{ "mode": "talking", "z_index": 1, "number": 50, "layer_path": "ROOT_!目_*通常" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*通常→" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*∩∩" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*お" },
{ "mode": "talking", "z_index": 2, "number": 5, "layer_path": "ROOT_!口_*え" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_* -" },
{ "mode": "talking", "z_index": 2, "number": 5, "layer_path": "ROOT_!口_*う" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*にこ" },
{ "mode": "talking", "z_index": 3, "number": 20, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "talking", "z_index": 3, "number": 40, "layer_path": "ROOT_!眉_*通常" },
{ "mode": "talking", "z_index": 3, "number": 40, "layer_path": "ROOT_!眉_*ドヤ" },
{ "mode": "talking", "z_index": 4, "number": 20, "layer_path": "ROOT_表情_なし" },
{ "mode": "talking", "z_index": 4, "number": 100, "layer_path": "ROOT_表情_赤面" },
{ "mode": "talking", "z_index": 5, "number": 10, "layer_path": "ROOT_漫符_なし" },
{ "mode": "talking", "z_index": 5, "number": 100, "layer_path": "ROOT_漫符_*♪" },
{ "mode": "talking", "z_index": 0, "number": 1, "layer_path": "ROOT_全身" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*" },
{ "mode": "talking", "z_index": 2, "number": 1, "layer_path": "ROOT_!口_*え" },
{ "mode": "talking", "z_index": 3, "number": 1, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "talking", "z_index": 4, "number": 1, "layer_path": "ROOT_表情_なし" },
{ "mode": "talking", "z_index": 5, "number": 1, "layer_path": "ROOT_漫符_なし" }
]

View File

@ -2,5 +2,5 @@
"charaName": "あみたろ",
"psdFile": "/assets/settings/image.psd",
"motionFile": "/assets/settings/motion.json",
"motionSpeedRate": 0.1
"motionSpeedRate": 1
}

View File

@ -2,13 +2,13 @@
{ "mode": "normal", "z_index": 0, "number": 40, "layer_path": "ROOT_normal2" },
{ "mode": "normal", "z_index": 0, "number": 100, "layer_path": "ROOT_normal3" },
{ "mode": "talking", "z_index": 0, "number": 40, "layer_path": "ROOT_normal1" },
{ "mode": "talking", "z_index": 0, "number": 50, "layer_path": "ROOT_talk2" },
{ "mode": "talking", "z_index": 0, "number": 100, "layer_path": "ROOT_talk1" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_normal2" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_talk-u1" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_talk-u2" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_talk-u3" },
{ "mode": "talking", "z_index": 0, "number": 40, "layer_path": "ROOT_talk-u4" },
{ "mode": "talking", "z_index": 0, "number": 100, "layer_path": "ROOT_normal1" }
{ "mode": "talking", "z_index": 0, "number": 5, "layer_path": "ROOT_talk2" },
{ "mode": "talking", "z_index": 0, "number": 10, "layer_path": "ROOT_talk1" },
{ "mode": "talking", "z_index": 0, "number": 11, "layer_path": "ROOT_talk-u2" },
{ "mode": "talking", "z_index": 0, "number": 11, "layer_path": "ROOT_talk-u1" },
{ "mode": "talking", "z_index": 0, "number": 11, "layer_path": "ROOT_talk-u3" },
{ "mode": "talking", "z_index": 0, "number": 11, "layer_path": "ROOT_talk-u1" },
{ "mode": "talking", "z_index": 0, "number": 11, "layer_path": "ROOT_talk-u2" },
{ "mode": "talking", "z_index": 0, "number": 11, "layer_path": "ROOT_talk-u1" },
{ "mode": "talking", "z_index": 0, "number": 4, "layer_path": "ROOT_talk-u4" }
]

View File

@ -2,5 +2,5 @@
"charaName": "​黄琴海月",
"psdFile": "/assets/settings/image.psd",
"motionFile": "/assets/settings/motion.json",
"motionSpeedRate": 4
"motionSpeedRate": 1
}

View File

@ -1,14 +1,40 @@
[
{ "mode": "normal", "z_index": 0, "number": 40, "layer_path": "ROOT_normal2" },
{ "mode": "normal", "z_index": 0, "number": 100, "layer_path": "ROOT_normal3" },
{ "mode": "normal", "z_index": 0, "number": 1, "layer_path": "ROOT_全身" },
{ "mode": "normal", "z_index": 1, "number": 50, "layer_path": "ROOT_!目_*通常" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*通常→" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*∩∩" },
{ "mode": "normal", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "normal", "z_index": 2, "number": 80, "layer_path": "ROOT_!口_*にこ" },
{ "mode": "normal", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*おすまし" },
{ "mode": "normal", "z_index": 3, "number": 100, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "normal", "z_index": 3, "number": 100, "layer_path": "ROOT_!眉_*通常" },
{ "mode": "normal", "z_index": 4, "number": 100, "layer_path": "ROOT_表情_なし" },
{ "mode": "normal", "z_index": 4, "number": 100, "layer_path": "ROOT_表情_赤面" },
{ "mode": "normal", "z_index": 5, "number": 100, "layer_path": "ROOT_漫符_なし" },
{ "mode": "talking", "z_index": 0, "number": 40, "layer_path": "ROOT_normal1" },
{ "mode": "talking", "z_index": 0, "number": 50, "layer_path": "ROOT_talk2" },
{ "mode": "talking", "z_index": 0, "number": 100, "layer_path": "ROOT_talk1" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_normal2" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_talk-u1" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_talk-u2" },
{ "mode": "talking", "z_index": 0, "number": 110, "layer_path": "ROOT_talk-u3" },
{ "mode": "talking", "z_index": 0, "number": 40, "layer_path": "ROOT_talk-u4" },
{ "mode": "talking", "z_index": 0, "number": 100, "layer_path": "ROOT_normal1" }
{ "mode": "talking", "z_index": 0, "number": 1, "layer_path": "ROOT_全身" },
{ "mode": "talking", "z_index": 1, "number": 50, "layer_path": "ROOT_!目_*通常" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*通常→" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*∩∩" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*微笑" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*お" },
{ "mode": "talking", "z_index": 2, "number": 5, "layer_path": "ROOT_!口_*え" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_* -" },
{ "mode": "talking", "z_index": 2, "number": 5, "layer_path": "ROOT_!口_*う" },
{ "mode": "talking", "z_index": 2, "number": 10, "layer_path": "ROOT_!口_*にこ" },
{ "mode": "talking", "z_index": 3, "number": 20, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "talking", "z_index": 3, "number": 40, "layer_path": "ROOT_!眉_*通常" },
{ "mode": "talking", "z_index": 3, "number": 40, "layer_path": "ROOT_!眉_*ドヤ" },
{ "mode": "talking", "z_index": 4, "number": 20, "layer_path": "ROOT_表情_なし" },
{ "mode": "talking", "z_index": 4, "number": 100, "layer_path": "ROOT_表情_赤面" },
{ "mode": "talking", "z_index": 5, "number": 10, "layer_path": "ROOT_漫符_なし" },
{ "mode": "talking", "z_index": 5, "number": 100, "layer_path": "ROOT_漫符_*♪" },
{ "mode": "talking", "z_index": 0, "number": 1, "layer_path": "ROOT_全身" },
{ "mode": "talking", "z_index": 1, "number": 1, "layer_path": "ROOT_!目_*" },
{ "mode": "talking", "z_index": 2, "number": 1, "layer_path": "ROOT_!口_*え" },
{ "mode": "talking", "z_index": 3, "number": 1, "layer_path": "ROOT_!眉_*平行" },
{ "mode": "talking", "z_index": 4, "number": 1, "layer_path": "ROOT_表情_なし" },
{ "mode": "talking", "z_index": 5, "number": 1, "layer_path": "ROOT_漫符_なし" }
]

View File

@ -1,6 +1,6 @@
{
"charaName": "​黄琴海月",
"charaName": "あみたろ",
"psdFile": "/assets/settings/image.psd",
"motionFile": "/assets/settings/motion.json",
"motionSpeedRate": 4
"motionSpeedRate": 1
}

View File

@ -26,7 +26,7 @@ export const usePsdAnimation = (): PsdAnimationStateAndMethod => {
const canvas = document.getElementById(TSUKUYOMI_CANVAS) as HTMLCanvasElement
// const c = generateConfig(psdFile, canvas, 640, 480, true)
const c = generateConfig(psd, canvas, 640, 640, false)
c.processorURL = "https://cdn.jsdelivr.net/npm/@dannadori/psdanimator@1.0.17/dist/process.js"
c.processorURL = "https://cdn.jsdelivr.net/npm/@dannadori/psdanimator@1.0.19/dist/process.js"
c.transfer = [c.canvas]
await w.init(c)
console.log("[psd animator] Initialized")

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,7 @@
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.4",
"@types/node": "^18.15.11",
"@types/react": "^18.0.31",
"@types/react": "^18.0.32",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -51,7 +51,7 @@
"webpack-dev-server": "^4.13.2"
},
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.99",
"@dannadori/voice-changer-client-js": "^1.0.101",
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,7 @@
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.4",
"@types/node": "^18.15.11",
"@types/react": "^18.0.31",
"@types/react": "^18.0.32",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -51,7 +51,7 @@
"webpack-dev-server": "^4.13.2"
},
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.99",
"@dannadori/voice-changer-client-js": "^1.0.101",
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,7 @@
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.4",
"@types/node": "^18.15.11",
"@types/react": "^18.0.31",
"@types/react": "^18.0.32",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -51,7 +51,7 @@
"webpack-dev-server": "^4.13.2"
},
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.99",
"@dannadori/voice-changer-client-js": "^1.0.101",
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",

View File

@ -1,16 +1,16 @@
{
"name": "@dannadori/voice-changer-client-js",
"version": "1.0.99",
"version": "1.0.101",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@dannadori/voice-changer-client-js",
"version": "1.0.99",
"version": "1.0.101",
"license": "ISC",
"dependencies": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
"amazon-chime-sdk-js": "^3.12.0",
"buffer": "^6.0.3",
"localforage": "^1.10.0",
"react": "^18.2.0",
@ -18,24 +18,24 @@
"socket.io-client": "^4.6.1"
},
"devDependencies": {
"@types/audioworklet": "^0.0.38",
"@types/node": "^18.15.0",
"@types/react": "18.0.28",
"@types/audioworklet": "^0.0.41",
"@types/node": "^18.15.11",
"@types/react": "18.0.32",
"@types/react-dom": "18.0.11",
"eslint": "^8.36.0",
"eslint-config-prettier": "^8.7.0",
"eslint": "^8.37.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-react": "^7.32.2",
"eslint-webpack-plugin": "^4.0.0",
"npm-run-all": "^4.1.5",
"prettier": "^2.8.4",
"prettier": "^2.8.7",
"raw-loader": "^4.0.2",
"rimraf": "^4.4.0",
"rimraf": "^4.4.1",
"ts-loader": "^9.4.2",
"typescript": "^4.9.5",
"webpack": "^5.76.1",
"typescript": "^5.0.3",
"webpack": "^5.77.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1"
"webpack-dev-server": "^4.13.2"
}
},
"node_modules/@aws-crypto/ie11-detection": {
@ -1428,14 +1428,14 @@
}
},
"node_modules/@eslint/eslintrc": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz",
"integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz",
"integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^9.5.0",
"espree": "^9.5.1",
"globals": "^13.19.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
@ -1451,9 +1451,9 @@
}
},
"node_modules/@eslint/js": {
"version": "8.36.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz",
"integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==",
"version": "8.37.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz",
"integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -1686,9 +1686,9 @@
"integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
},
"node_modules/@types/audioworklet": {
"version": "0.0.38",
"resolved": "https://registry.npmjs.org/@types/audioworklet/-/audioworklet-0.0.38.tgz",
"integrity": "sha512-wChYxkstf8v8y6IFucqzZvKUMLvaXxHnY8Tjyi81AzhuP3ut7B4grzX2sxwbB+lowde8RvzFg1e8NGu5ui2qMg==",
"version": "0.0.41",
"resolved": "https://registry.npmjs.org/@types/audioworklet/-/audioworklet-0.0.41.tgz",
"integrity": "sha512-8BWffzGoSRz436IviQVPye75YYWfac4OKdcLgkZxb3APZxSmAOp2SMtsH1yuM1x57/z/J7bsm05Yq98Hzk1t/w==",
"dev": true
},
"node_modules/@types/body-parser": {
@ -1829,9 +1829,9 @@
"dev": true
},
"node_modules/@types/node": {
"version": "18.15.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.0.tgz",
"integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w=="
"version": "18.15.11",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz",
"integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q=="
},
"node_modules/@types/prop-types": {
"version": "15.7.5",
@ -1852,9 +1852,9 @@
"dev": true
},
"node_modules/@types/react": {
"version": "18.0.28",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
"integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
"version": "18.0.32",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.32.tgz",
"integrity": "sha512-gYGXdtPQ9Cj0w2Fwqg5/ak6BcK3Z15YgjSqtyDizWUfx7mQ8drs0NBUzRRsAdoFVTO8kJ8L2TL8Skm7OFPnLUw==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
@ -2259,9 +2259,9 @@
}
},
"node_modules/amazon-chime-sdk-js": {
"version": "3.11.0",
"resolved": "https://registry.npmjs.org/amazon-chime-sdk-js/-/amazon-chime-sdk-js-3.11.0.tgz",
"integrity": "sha512-YBYnT/P2BxqcUoHvsjVbqKRmWnjC02ofz6DVANJXbaMEjZj5Ih55COFcYYJa0+0MPNMuvGDC6Z8PS+xjfjkgHg==",
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/amazon-chime-sdk-js/-/amazon-chime-sdk-js-3.12.0.tgz",
"integrity": "sha512-h71cPO67TO2ZkLlhyWyB7NDYf7abK7/aqOX8Ojju7jn+x3MZXUSmF0K9bdRHiII+7MILyK/7Yf8JmpcCswuq8Q==",
"dependencies": {
"@aws-crypto/sha256-js": "^2.0.1",
"@aws-sdk/client-chime-sdk-messaging": "^3.0.0",
@ -3230,15 +3230,15 @@
}
},
"node_modules/eslint": {
"version": "8.36.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz",
"integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==",
"version": "8.37.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz",
"integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.4.0",
"@eslint/eslintrc": "^2.0.1",
"@eslint/js": "8.36.0",
"@eslint/eslintrc": "^2.0.2",
"@eslint/js": "8.37.0",
"@humanwhocodes/config-array": "^0.11.8",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@ -3249,8 +3249,8 @@
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.1.1",
"eslint-visitor-keys": "^3.3.0",
"espree": "^9.5.0",
"eslint-visitor-keys": "^3.4.0",
"espree": "^9.5.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
@ -3287,9 +3287,9 @@
}
},
"node_modules/eslint-config-prettier": {
"version": "8.7.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz",
"integrity": "sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==",
"version": "8.8.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz",
"integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==",
"dev": true,
"bin": {
"eslint-config-prettier": "bin/cli.js"
@ -3374,12 +3374,15 @@
}
},
"node_modules/eslint-visitor-keys": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
"integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-webpack-plugin": {
@ -3407,14 +3410,14 @@
}
},
"node_modules/espree": {
"version": "9.5.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz",
"integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==",
"version": "9.5.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz",
"integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==",
"dev": true,
"dependencies": {
"acorn": "^8.8.0",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^3.3.0"
"eslint-visitor-keys": "^3.4.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -4828,6 +4831,16 @@
"node": ">=0.10.0"
}
},
"node_modules/launch-editor": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz",
"integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==",
"dev": true,
"dependencies": {
"picocolors": "^1.0.0",
"shell-quote": "^1.7.3"
}
},
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@ -5830,9 +5843,9 @@
}
},
"node_modules/prettier": {
"version": "2.8.4",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz",
"integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==",
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
"integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
"dev": true,
"bin": {
"prettier": "bin-prettier.js"
@ -6246,9 +6259,9 @@
}
},
"node_modules/rimraf": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
"integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
"integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
"dev": true,
"dependencies": {
"glob": "^9.2.0"
@ -7179,16 +7192,16 @@
}
},
"node_modules/typescript": {
"version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz",
"integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=4.2.0"
"node": ">=12.20"
}
},
"node_modules/ua-parser-js": {
@ -7333,9 +7346,9 @@
}
},
"node_modules/webpack": {
"version": "5.76.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz",
"integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==",
"version": "5.77.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.77.0.tgz",
"integrity": "sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.3",
@ -7457,9 +7470,9 @@
}
},
"node_modules/webpack-dev-server": {
"version": "4.11.1",
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz",
"integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==",
"version": "4.13.2",
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz",
"integrity": "sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==",
"dev": true,
"dependencies": {
"@types/bonjour": "^3.5.9",
@ -7481,6 +7494,7 @@
"html-entities": "^2.3.2",
"http-proxy-middleware": "^2.0.3",
"ipaddr.js": "^2.0.1",
"launch-editor": "^2.6.0",
"open": "^8.0.9",
"p-retry": "^4.5.0",
"rimraf": "^3.0.2",
@ -7490,7 +7504,7 @@
"sockjs": "^0.3.24",
"spdy": "^4.0.2",
"webpack-dev-middleware": "^5.3.1",
"ws": "^8.4.2"
"ws": "^8.13.0"
},
"bin": {
"webpack-dev-server": "bin/webpack-dev-server.js"
@ -7506,6 +7520,9 @@
"webpack": "^4.37.0 || ^5.0.0"
},
"peerDependenciesMeta": {
"webpack": {
"optional": true
},
"webpack-cli": {
"optional": true
}
@ -7526,6 +7543,27 @@
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/webpack-dev-server/node_modules/ws": {
"version": "8.13.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
"integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
"dev": true,
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
},
"node_modules/webpack-merge": {
"version": "5.8.0",
"resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
@ -9083,14 +9121,14 @@
"dev": true
},
"@eslint/eslintrc": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz",
"integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz",
"integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^9.5.0",
"espree": "^9.5.1",
"globals": "^13.19.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
@ -9100,9 +9138,9 @@
}
},
"@eslint/js": {
"version": "8.36.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz",
"integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==",
"version": "8.37.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz",
"integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==",
"dev": true
},
"@humanwhocodes/config-array": {
@ -9298,9 +9336,9 @@
"integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
},
"@types/audioworklet": {
"version": "0.0.38",
"resolved": "https://registry.npmjs.org/@types/audioworklet/-/audioworklet-0.0.38.tgz",
"integrity": "sha512-wChYxkstf8v8y6IFucqzZvKUMLvaXxHnY8Tjyi81AzhuP3ut7B4grzX2sxwbB+lowde8RvzFg1e8NGu5ui2qMg==",
"version": "0.0.41",
"resolved": "https://registry.npmjs.org/@types/audioworklet/-/audioworklet-0.0.41.tgz",
"integrity": "sha512-8BWffzGoSRz436IviQVPye75YYWfac4OKdcLgkZxb3APZxSmAOp2SMtsH1yuM1x57/z/J7bsm05Yq98Hzk1t/w==",
"dev": true
},
"@types/body-parser": {
@ -9441,9 +9479,9 @@
"dev": true
},
"@types/node": {
"version": "18.15.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.0.tgz",
"integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w=="
"version": "18.15.11",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz",
"integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q=="
},
"@types/prop-types": {
"version": "15.7.5",
@ -9464,9 +9502,9 @@
"dev": true
},
"@types/react": {
"version": "18.0.28",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
"integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
"version": "18.0.32",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.32.tgz",
"integrity": "sha512-gYGXdtPQ9Cj0w2Fwqg5/ak6BcK3Z15YgjSqtyDizWUfx7mQ8drs0NBUzRRsAdoFVTO8kJ8L2TL8Skm7OFPnLUw==",
"dev": true,
"requires": {
"@types/prop-types": "*",
@ -9819,9 +9857,9 @@
"requires": {}
},
"amazon-chime-sdk-js": {
"version": "3.11.0",
"resolved": "https://registry.npmjs.org/amazon-chime-sdk-js/-/amazon-chime-sdk-js-3.11.0.tgz",
"integrity": "sha512-YBYnT/P2BxqcUoHvsjVbqKRmWnjC02ofz6DVANJXbaMEjZj5Ih55COFcYYJa0+0MPNMuvGDC6Z8PS+xjfjkgHg==",
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/amazon-chime-sdk-js/-/amazon-chime-sdk-js-3.12.0.tgz",
"integrity": "sha512-h71cPO67TO2ZkLlhyWyB7NDYf7abK7/aqOX8Ojju7jn+x3MZXUSmF0K9bdRHiII+7MILyK/7Yf8JmpcCswuq8Q==",
"requires": {
"@aws-crypto/sha256-js": "^2.0.1",
"@aws-sdk/client-chime-sdk-messaging": "^3.0.0",
@ -10531,15 +10569,15 @@
"dev": true
},
"eslint": {
"version": "8.36.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz",
"integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==",
"version": "8.37.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz",
"integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.4.0",
"@eslint/eslintrc": "^2.0.1",
"@eslint/js": "8.36.0",
"@eslint/eslintrc": "^2.0.2",
"@eslint/js": "8.37.0",
"@humanwhocodes/config-array": "^0.11.8",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@ -10550,8 +10588,8 @@
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.1.1",
"eslint-visitor-keys": "^3.3.0",
"espree": "^9.5.0",
"eslint-visitor-keys": "^3.4.0",
"espree": "^9.5.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
@ -10579,9 +10617,9 @@
}
},
"eslint-config-prettier": {
"version": "8.7.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz",
"integrity": "sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==",
"version": "8.8.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz",
"integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==",
"dev": true,
"requires": {}
},
@ -10639,9 +10677,9 @@
}
},
"eslint-visitor-keys": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
"integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
"dev": true
},
"eslint-webpack-plugin": {
@ -10658,14 +10696,14 @@
}
},
"espree": {
"version": "9.5.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz",
"integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==",
"version": "9.5.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz",
"integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==",
"dev": true,
"requires": {
"acorn": "^8.8.0",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^3.3.0"
"eslint-visitor-keys": "^3.4.0"
}
},
"esquery": {
@ -11688,6 +11726,16 @@
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true
},
"launch-editor": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz",
"integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==",
"dev": true,
"requires": {
"picocolors": "^1.0.0",
"shell-quote": "^1.7.3"
}
},
"levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@ -12435,9 +12483,9 @@
"dev": true
},
"prettier": {
"version": "2.8.4",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz",
"integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==",
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
"integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
"dev": true
},
"prettier-linter-helpers": {
@ -12734,9 +12782,9 @@
"dev": true
},
"rimraf": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
"integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
"integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
"dev": true,
"requires": {
"glob": "^9.2.0"
@ -13444,9 +13492,9 @@
}
},
"typescript": {
"version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz",
"integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==",
"dev": true
},
"ua-parser-js": {
@ -13544,9 +13592,9 @@
}
},
"webpack": {
"version": "5.76.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz",
"integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==",
"version": "5.77.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.77.0.tgz",
"integrity": "sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.3",
@ -13653,9 +13701,9 @@
}
},
"webpack-dev-server": {
"version": "4.11.1",
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz",
"integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==",
"version": "4.13.2",
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz",
"integrity": "sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==",
"dev": true,
"requires": {
"@types/bonjour": "^3.5.9",
@ -13677,6 +13725,7 @@
"html-entities": "^2.3.2",
"http-proxy-middleware": "^2.0.3",
"ipaddr.js": "^2.0.1",
"launch-editor": "^2.6.0",
"open": "^8.0.9",
"p-retry": "^4.5.0",
"rimraf": "^3.0.2",
@ -13686,7 +13735,7 @@
"sockjs": "^0.3.24",
"spdy": "^4.0.2",
"webpack-dev-middleware": "^5.3.1",
"ws": "^8.4.2"
"ws": "^8.13.0"
},
"dependencies": {
"rimraf": {
@ -13697,6 +13746,13 @@
"requires": {
"glob": "^7.1.3"
}
},
"ws": {
"version": "8.13.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
"integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
"dev": true,
"requires": {}
}
}
},

View File

@ -1,6 +1,6 @@
{
"name": "@dannadori/voice-changer-client-js",
"version": "1.0.99",
"version": "1.0.101",
"description": "",
"main": "dist/index.js",
"directories": {
@ -26,28 +26,28 @@
"author": "wataru.okada@flect.co.jp",
"license": "ISC",
"devDependencies": {
"@types/audioworklet": "^0.0.38",
"@types/node": "^18.15.0",
"@types/react": "18.0.28",
"@types/audioworklet": "^0.0.41",
"@types/node": "^18.15.11",
"@types/react": "18.0.32",
"@types/react-dom": "18.0.11",
"eslint": "^8.36.0",
"eslint-config-prettier": "^8.7.0",
"eslint": "^8.37.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-react": "^7.32.2",
"eslint-webpack-plugin": "^4.0.0",
"npm-run-all": "^4.1.5",
"prettier": "^2.8.4",
"prettier": "^2.8.7",
"raw-loader": "^4.0.2",
"rimraf": "^4.4.0",
"rimraf": "^4.4.1",
"ts-loader": "^9.4.2",
"typescript": "^4.9.5",
"webpack": "^5.76.1",
"typescript": "^5.0.3",
"webpack": "^5.77.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1"
"webpack-dev-server": "^4.13.2"
},
"dependencies": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
"amazon-chime-sdk-js": "^3.12.0",
"buffer": "^6.0.3",
"localforage": "^1.10.0",
"react": "^18.2.0",

View File

@ -34,16 +34,12 @@ ADD dummy /
RUN git clone -b v1.5.0.0_SiFiGAN https://github.com/isletennos/MMVC_Trainer.git
WORKDIR /MMVC_Trainer/
#RUN git checkout c242d3d1cf7f768af70d9735082ca2bdd90c45f3
RUN git checkout 8cca023f5f709c70c2c2fc3e880cb1a119e18f44
RUN git checkout 0fa4662a8741a127cc0bdb6ccdecfc17bdcba709
RUN git clone https://github.com/isletennos/MMVC_Client.git
WORKDIR /MMVC_Trainer/MMVC_Client
#RUN git checkout 3374a1177b73e3f6d600e5dbe93af033c36ee120
RUN git checkout 1424609e53c79e2d629add10ae4bfb16fc0c3c82
RUN git checkout 461cb231b57cbb17243110eaac8435d9cca24a26
WORKDIR /
# ↓ テストスクリプトはTrainerのrootに置くとmodelsがconflictする。

View File

@ -0,0 +1,257 @@
import sys
import os
if sys.platform.startswith('darwin'):
baseDir = [x for x in sys.path if x.endswith("Contents/MacOS")]
if len(baseDir) != 1:
print("baseDir should be only one ", baseDir)
sys.exit()
modulePath = os.path.join(baseDir[0], "DDSP-SVC")
sys.path.append(modulePath)
else:
sys.path.append("DDSP-SVC")
import io
from dataclasses import dataclass, asdict, field
from functools import reduce
import numpy as np
import torch
import onnxruntime
import pyworld as pw
import ddsp.vocoder as vo
import librosa
providers = ['OpenVINOExecutionProvider', "CUDAExecutionProvider", "DmlExecutionProvider", "CPUExecutionProvider"]
@dataclass
class DDSP_SVCSettings():
gpu: int = 0
dstId: int = 0
f0Detector: str = "dio" # dio or harvest
tran: int = 20
noiceScale: float = 0.3
predictF0: int = 0 # 0:False, 1:True
silentThreshold: float = 0.00001
extraConvertSize: int = 1024 * 32
clusterInferRatio: float = 0.1
framework: str = "PyTorch" # PyTorch or ONNX
pyTorchModelFile: str = ""
onnxModelFile: str = ""
configFile: str = ""
speakers: dict[str, int] = field(
default_factory=lambda: {}
)
# ↓mutableな物だけ列挙
intData = ["gpu", "dstId", "tran", "predictF0", "extraConvertSize"]
floatData = ["noiceScale", "silentThreshold", "clusterInferRatio"]
strData = ["framework", "f0Detector"]
class DDSP_SVC:
def __init__(self, params):
self.settings = DDSP_SVCSettings()
self.net_g = None
self.onnx_session = None
self.raw_path = io.BytesIO()
self.gpu_num = torch.cuda.device_count()
self.prevVol = 0
self.params = params
print("DDSP-SVC initialization:", params)
def loadModel(self, config: str, pyTorch_model_file: str = None, onnx_model_file: str = None, clusterTorchModel: str = None):
self.settings.configFile = config
# model
model, args = vo.load_model(pyTorch_model_file)
# hubert
self.model = model
self.args = args
vec_path = self.params["hubert"]
self.encoder = vo.Units_Encoder(
args.data.encoder,
vec_path,
args.data.encoder_sample_rate,
args.data.encoder_hop_size,
device="cpu")
# f0dec
self.f0_detector = vo.F0_Extractor(
self.settings.f0Detector,
44100,
512,
float(50),
float(1100))
return self.get_info()
def update_setteings(self, key: str, val: any):
if key == "onnxExecutionProvider" and self.onnx_session != None:
if val == "CUDAExecutionProvider":
if self.settings.gpu < 0 or self.settings.gpu >= self.gpu_num:
self.settings.gpu = 0
provider_options = [{'device_id': self.settings.gpu}]
self.onnx_session.set_providers(providers=[val], provider_options=provider_options)
else:
self.onnx_session.set_providers(providers=[val])
elif key in self.settings.intData:
setattr(self.settings, key, int(val))
if key == "gpu" and val >= 0 and val < self.gpu_num and self.onnx_session != None:
providers = self.onnx_session.get_providers()
print("Providers:", providers)
if "CUDAExecutionProvider" in providers:
provider_options = [{'device_id': self.settings.gpu}]
self.onnx_session.set_providers(providers=["CUDAExecutionProvider"], provider_options=provider_options)
elif key in self.settings.floatData:
setattr(self.settings, key, float(val))
elif key in self.settings.strData:
setattr(self.settings, key, str(val))
else:
return False
return True
def get_info(self):
data = asdict(self.settings)
data["onnxExecutionProviders"] = self.onnx_session.get_providers() if self.onnx_session != None else []
files = ["configFile", "pyTorchModelFile", "onnxModelFile"]
for f in files:
if data[f] != None and os.path.exists(data[f]):
data[f] = os.path.basename(data[f])
else:
data[f] = ""
return data
def get_processing_sampling_rate(self):
return 44100
def get_unit_f0(self, audio_buffer, tran):
if (self.settings.gpu < 0 or self.gpu_num == 0) or self.settings.framework == "ONNX":
dev = torch.device("cpu")
else:
dev = torch.device("cpu")
# dev = torch.device("cuda", index=self.settings.gpu)
wav_44k = audio_buffer
f0 = self.f0_detector.extract(wav_44k, uv_interp=True, device=dev)
f0 = torch.from_numpy(f0).float().to(dev).unsqueeze(-1).unsqueeze(0)
f0 = f0 * 2 ** (float(10) / 12)
# print("f0:", f0)
print("wav_44k:::", wav_44k)
c = self.encoder.encode(torch.from_numpy(audio_buffer).float().unsqueeze(0).to(dev), 44100, 512)
# print("c:", c)
return c, f0
def generate_input(self, newData: any, inputSize: int, crossfadeSize: int):
# newData = newData.astype(np.float32) / 32768.0
# newData = newData.astype(np.float32) / self.hps.data.max_wav_value
if hasattr(self, "audio_buffer"):
self.audio_buffer = np.concatenate([self.audio_buffer, newData], 0) # 過去のデータに連結
else:
self.audio_buffer = newData
convertSize = inputSize + crossfadeSize + self.settings.extraConvertSize
hop_size = int(self.args.data.block_size * 44100 / self.args.data.sampling_rate)
print("hopsize", hop_size)
if convertSize % hop_size != 0: # モデルの出力のホップサイズで切り捨てが発生するので補う。
convertSize = convertSize + (hop_size - (convertSize % hop_size))
print("convsize", convertSize)
self.audio_buffer = self.audio_buffer[-1 * convertSize:] # 変換対象の部分だけ抽出
crop = self.audio_buffer[-1 * (inputSize + crossfadeSize):-1 * (crossfadeSize)]
rms = np.sqrt(np.square(crop).mean(axis=0))
vol = max(rms, self.prevVol * 0.0)
self.prevVol = vol
c, f0 = self.get_unit_f0(self.audio_buffer, self.settings.tran)
return (c, f0, convertSize, vol)
def _onnx_inference(self, data):
if hasattr(self, "onnx_session") == False or self.onnx_session == None:
print("[Voice Changer] No onnx session.")
return np.zeros(1).astype(np.int16)
c = data[0]
f0 = data[1]
convertSize = data[2]
vol = data[3]
if vol < self.settings.silentThreshold:
return np.zeros(convertSize).astype(np.int16)
c, f0, uv = [x.numpy() for x in data]
audio1 = self.onnx_session.run(
["audio"],
{
"c": c,
"f0": f0,
"g": np.array([self.settings.dstId]).astype(np.int64),
"uv": np.array([self.settings.dstId]).astype(np.int64),
"predict_f0": np.array([self.settings.dstId]).astype(np.int64),
"noice_scale": np.array([self.settings.dstId]).astype(np.int64),
})[0][0, 0] * self.hps.data.max_wav_value
audio1 = audio1 * vol
result = audio1
return result
pass
def _pyTorch_inference(self, data):
if hasattr(self, "model") == False or self.model == None:
print("[Voice Changer] No pyTorch session.")
return np.zeros(1).astype(np.int16)
if self.settings.gpu < 0 or self.gpu_num == 0:
dev = torch.device("cpu")
else:
dev = torch.device("cpu")
# dev = torch.device("cuda", index=self.settings.gpu)
c = data[0]
f0 = data[1]
convertSize = data[2]
vol = data[3]
if vol < self.settings.silentThreshold:
return np.zeros(convertSize).astype(np.int16)
with torch.no_grad():
c.to(dev)
f0.to(dev)
vol = torch.from_numpy(np.array([vol] * c.shape[1])).float().to(dev).unsqueeze(-1).unsqueeze(0)
spk_id = torch.LongTensor(np.array([[1]])).to(dev)
# print("vol", vol)
print("input", c.shape, f0.shape)
seg_output, _, (s_h, s_n) = self.model(c, f0, vol, spk_id=spk_id)
seg_output = seg_output.squeeze().cpu().numpy()
print("SEG:", seg_output)
return seg_output
def inference(self, data):
if self.settings.framework == "ONNX":
audio = self._onnx_inference(data)
else:
audio = self._pyTorch_inference(data)
return audio
def destroy(self):
del self.net_g
del self.onnx_session

View File

@ -17,7 +17,7 @@ import onnxruntime
import pyworld as pw
from models import SynthesizerTrn
from voice_changer.MMVCv15.client_modules import convert_continuos_f0, spectrogram_torch, TextAudioSpeakerCollate, get_hparams_from_file, load_checkpoint
from voice_changer.MMVCv15.client_modules import convert_continuos_f0, spectrogram_torch, get_hparams_from_file, load_checkpoint
providers = ['OpenVINOExecutionProvider', "CUDAExecutionProvider", "DmlExecutionProvider", "CPUExecutionProvider"]
@ -56,34 +56,39 @@ class MMVCv15:
if pyTorch_model_file != None:
self.settings.pyTorchModelFile = pyTorch_model_file
else:
self.settings.pyTorchModelFile = ""
if onnx_model_file:
self.settings.onnxModelFile = onnx_model_file
else:
self.settings.onnxModelFile = ""
print("self.settings.onnxModelFile::", self.settings.onnxModelFile)
# PyTorchモデル生成
self.net_g = SynthesizerTrn(
spec_channels=self.hps.data.filter_length // 2 + 1,
segment_size=self.hps.train.segment_size // self.hps.data.hop_length,
inter_channels=self.hps.model.inter_channels,
hidden_channels=self.hps.model.hidden_channels,
upsample_rates=self.hps.model.upsample_rates,
upsample_initial_channel=self.hps.model.upsample_initial_channel,
upsample_kernel_sizes=self.hps.model.upsample_kernel_sizes,
n_flow=self.hps.model.n_flow,
dec_out_channels=1,
dec_kernel_size=7,
n_speakers=self.hps.data.n_speakers,
gin_channels=self.hps.model.gin_channels,
requires_grad_pe=self.hps.requires_grad.pe,
requires_grad_flow=self.hps.requires_grad.flow,
requires_grad_text_enc=self.hps.requires_grad.text_enc,
requires_grad_dec=self.hps.requires_grad.dec
)
if pyTorch_model_file != None:
self.net_g = SynthesizerTrn(
spec_channels=self.hps.data.filter_length // 2 + 1,
segment_size=self.hps.train.segment_size // self.hps.data.hop_length,
inter_channels=self.hps.model.inter_channels,
hidden_channels=self.hps.model.hidden_channels,
upsample_rates=self.hps.model.upsample_rates,
upsample_initial_channel=self.hps.model.upsample_initial_channel,
upsample_kernel_sizes=self.hps.model.upsample_kernel_sizes,
n_flow=self.hps.model.n_flow,
dec_out_channels=1,
dec_kernel_size=7,
n_speakers=self.hps.data.n_speakers,
gin_channels=self.hps.model.gin_channels,
requires_grad_pe=self.hps.requires_grad.pe,
requires_grad_flow=self.hps.requires_grad.flow,
requires_grad_text_enc=self.hps.requires_grad.text_enc,
requires_grad_dec=self.hps.requires_grad.dec
)
self.net_g.eval()
load_checkpoint(pyTorch_model_file, self.net_g, None)
# utils.load_checkpoint(pyTorch_model_file, self.net_g, None)
# ONNXモデル生成
self.onxx_input_length = 8192
if onnx_model_file != None:
ort_options = onnxruntime.SessionOptions()
ort_options.intra_op_num_threads = 8
@ -91,10 +96,15 @@ class MMVCv15:
onnx_model_file,
providers=providers
)
inputs_info = self.onnx_session.get_inputs()
for i in inputs_info:
# print("ONNX INPUT SHAPE", i.name, i.shape)
if i.name == "sin":
self.onxx_input_length = i.shape[2]
return self.get_info()
def update_setteings(self, key: str, val: any):
if key == "onnxExecutionProvider" and self.onnx_session != None:
if key == "onnxExecutionProvider" and self.settings.onnxModelFile != "": # self.onnx_session != None:
if val == "CUDAExecutionProvider":
if self.settings.gpu < 0 or self.settings.gpu >= self.gpu_num:
self.settings.gpu = 0
@ -104,7 +114,7 @@ class MMVCv15:
self.onnx_session.set_providers(providers=[val])
elif key in self.settings.intData:
setattr(self.settings, key, int(val))
if key == "gpu" and val >= 0 and val < self.gpu_num and self.onnx_session != None:
if key == "gpu" and val >= 0 and val < self.gpu_num and self.settings.onnxModelFile != "": # self.onnx_session != None:
providers = self.onnx_session.get_providers()
print("Providers:", providers)
if "CUDAExecutionProvider" in providers:
@ -122,7 +132,7 @@ class MMVCv15:
def get_info(self):
data = asdict(self.settings)
data["onnxExecutionProviders"] = self.onnx_session.get_providers() if self.onnx_session != None else []
data["onnxExecutionProviders"] = self.onnx_session.get_providers() if self.settings.onnxModelFile != "" else []
files = ["configFile", "pyTorchModelFile", "onnxModelFile"]
for f in files:
if data[f] != None and os.path.exists(data[f]):
@ -170,44 +180,46 @@ class MMVCv15:
if convertSize % self.hps.data.hop_length != 0: # モデルの出力のホップサイズで切り捨てが発生するので補う。
convertSize = convertSize + (self.hps.data.hop_length - (convertSize % self.hps.data.hop_length))
# ONNX は固定長
if self.settings.framework == "ONNX":
convertSize = self.onxx_input_length
self.audio_buffer = self.audio_buffer[-1 * convertSize:] # 変換対象の部分だけ抽出
f0 = self._get_f0(self.settings.f0Detector, self.audio_buffer) # f0 生成
spec = self._get_spec(self.audio_buffer)
f0 = self._get_f0(self.settings.f0Detector, self.audio_buffer) # torch
f0 = (f0 * self.settings.f0Factor).unsqueeze(0).unsqueeze(0)
spec = self._get_spec(self.audio_buffer) # torch
sid = torch.LongTensor([int(self.settings.srcId)])
data = TextAudioSpeakerCollate(
sample_rate=self.hps.data.sampling_rate,
hop_size=self.hps.data.hop_length,
f0_factor=self.settings.f0Factor
)([(spec, sid, f0)])
return data
return [spec, f0, sid]
def _onnx_inference(self, data):
if hasattr(self, "onnx_session") == False or self.onnx_session == None:
if self.settings.onnxModelFile == "":
print("[Voice Changer] No ONNX session.")
return np.zeros(1).astype(np.int16)
spec, spec_lengths, sid_src, sin, d = data
spec, f0, sid_src = data
spec = spec.unsqueeze(0)
spec_lengths = torch.tensor([spec.size(2)])
sid_tgt1 = torch.LongTensor([self.settings.dstId])
sin, d = self.net_g.make_sin_d(f0)
(d0, d1, d2, d3) = d
audio1 = self.onnx_session.run(
["audio"],
{
"specs": spec.numpy(),
"lengths": spec_lengths.numpy(),
"sin": sin.numpy(),
"d0": d[0][:1].numpy(),
"d1": d[1][:1].numpy(),
"d2": d[2][:1].numpy(),
"d3": d[3][:1].numpy(),
"d0": d0.numpy(),
"d1": d1.numpy(),
"d2": d2.numpy(),
"d3": d3.numpy(),
"sid_src": sid_src.numpy(),
"sid_tgt": sid_tgt1.numpy()
})[0][0, 0] * self.hps.data.max_wav_value
return audio1
def _pyTorch_inference(self, data):
if hasattr(self, "net_g") == False or self.net_g == None:
if self.settings.pyTorchModelFile == "":
print("[Voice Changer] No pyTorch session.")
return np.zeros(1).astype(np.int16)
@ -217,15 +229,14 @@ class MMVCv15:
dev = torch.device("cuda", index=self.settings.gpu)
with torch.no_grad():
spec, spec_lengths, sid_src, sin, d = data
spec = spec.to(dev)
spec_lengths = spec_lengths.to(dev)
spec, f0, sid_src = data
spec = spec.unsqueeze(0).to(dev)
spec_lengths = torch.tensor([spec.size(2)]).to(dev)
f0 = f0.to(dev)
sid_src = sid_src.to(dev)
sin = sin.to(dev)
d = tuple([d[:1].to(dev) for d in d])
sid_target = torch.LongTensor([self.settings.dstId]).to(dev)
audio1 = self.net_g.to(dev).voice_conversion(spec, spec_lengths, sin, d, sid_src, sid_target)[0, 0].data * self.hps.data.max_wav_value
audio1 = self.net_g.to(dev).voice_conversion(spec, spec_lengths, f0, sid_src, sid_target)[0, 0].data * self.hps.data.max_wav_value
result = audio1.float().cpu().numpy()
return result

View File

@ -1,6 +1,5 @@
from features import SignalGenerator, dilated_factor
from scipy.interpolate import interp1d
import torch
import numpy as np
@ -9,90 +8,8 @@ import os
hann_window = {}
class TextAudioSpeakerCollate():
""" Zero-pads model inputs and targets
"""
def __init__(
self,
sample_rate,
hop_size,
f0_factor=1.0,
dense_factors=[0.5, 1, 4, 8],
upsample_scales=[8, 4, 2, 2],
sine_amp=0.1,
noise_amp=0.003,
signal_types=["sine"],
):
self.dense_factors = dense_factors
self.prod_upsample_scales = np.cumprod(upsample_scales)
self.sample_rate = sample_rate
self.signal_generator = SignalGenerator(
sample_rate=sample_rate,
hop_size=hop_size,
sine_amp=sine_amp,
noise_amp=noise_amp,
signal_types=signal_types,
)
self.f0_factor = f0_factor
def __call__(self, batch):
"""Collate's training batch from normalized text, audio and speaker identities
PARAMS
------
batch: [text_normalized, spec_normalized, wav_normalized, sid, note]
"""
spec_lengths = torch.LongTensor(len(batch))
sid = torch.LongTensor(len(batch))
spec_padded = torch.FloatTensor(len(batch), batch[0][0].size(0), batch[0][0].size(1))
f0_padded = torch.FloatTensor(len(batch), 1, batch[0][2].size(0))
# 返り値の初期化
spec_padded.zero_()
f0_padded.zero_()
# dfs
dfs_batch = [[] for _ in range(len(self.dense_factors))]
# row spec, sid, f0
for i in range(len(batch)):
row = batch[i]
spec = row[0]
spec_padded[i, :, :spec.size(1)] = spec
spec_lengths[i] = spec.size(1)
sid[i] = row[1]
# 推論時 f0/cf0にf0の倍率を乗算してf0/cf0を求める
f0 = row[2] * self.f0_factor
f0_padded[i, :, :f0.size(0)] = f0
# dfs
dfs = []
# dilated_factor の入力はnumpy!!
for df, us in zip(self.dense_factors, self.prod_upsample_scales):
dfs += [
np.repeat(dilated_factor(torch.unsqueeze(f0, dim=1).to('cpu').detach().numpy(), self.sample_rate, df), us)
]
# よくわからないけど、後で論文ちゃんと読む
for i in range(len(self.dense_factors)):
dfs_batch[i] += [
dfs[i].astype(np.float32).reshape(-1, 1)
] # [(T', 1), ...]
# よくわからないdfsを転置
for i in range(len(self.dense_factors)):
dfs_batch[i] = torch.FloatTensor(np.array(dfs_batch[i])).transpose(
2, 1
) # (B, 1, T')
# f0/cf0を実際に使うSignalに変換する
in_batch = self.signal_generator(f0_padded)
return spec_padded, spec_lengths, sid, in_batch, dfs_batch
def convert_continuos_f0(f0, f0_size):
# 正式版チェックOK
# get start and end of f0
if (f0 == 0).all():
return np.zeros((f0_size,))
@ -108,13 +25,13 @@ def convert_continuos_f0(f0, f0_size):
nz_frames = np.where(cf0 != 0)[0]
# perform linear interpolation
f = interp1d(nz_frames, cf0[nz_frames], bounds_error=False, fill_value=0.0)
cf0_ = f(np.arange(0, f0_size))
# print(cf0.shape, cf0_.shape, f0.shape, f0_size)
# print(cf0_)
return f(np.arange(0, f0_size))
def spectrogram_torch(y, n_fft, sampling_rate, hop_size, win_size, center=False):
# 正式版チェックOK
if torch.min(y) < -1.:
print('min value is ', torch.min(y))
if torch.max(y) > 1.:
@ -137,6 +54,7 @@ def spectrogram_torch(y, n_fft, sampling_rate, hop_size, win_size, center=False)
def get_hparams_from_file(config_path):
# 正式版チェックOK
with open(config_path, "r", encoding="utf-8") as f:
data = f.read()
config = json.loads(data)
@ -146,6 +64,7 @@ def get_hparams_from_file(config_path):
class HParams():
# 正式版チェックOK
def __init__(self, **kwargs):
for k, v in kwargs.items():
if type(v) == dict:
@ -178,6 +97,7 @@ class HParams():
def load_checkpoint(checkpoint_path, model, optimizer=None):
# 正式版チェックOK
assert os.path.isfile(checkpoint_path), f"No such file or directory: {checkpoint_path}"
checkpoint_dict = torch.load(checkpoint_path, map_location='cpu')
iteration = checkpoint_dict['iteration']