├── .dockerignore ├── .github └── workflows │ └── docker_publish.yml ├── .gitignore ├── LICENSE ├── README.md ├── assets ├── Q&A_1_1.png ├── Q&A_3_1.png ├── Q&A_4_1.png ├── Q&A_5_1.png ├── agent-extend-1.png ├── arch.png ├── character-extend-v2.0.0-1.png ├── character-extend-v2.0.0-2.png ├── character-extend.png ├── character-lip-ctr.png ├── chatError.png ├── difyAPI.png ├── difyKey.png ├── difySetting.png ├── llm-extend-1.png ├── llm-extend-2.png ├── llm-extend-3.png ├── llm-extend-4.png ├── pc_web.png ├── phone_web.png ├── webPage.png ├── wechat_1.png └── wechat_2.png ├── configs ├── agents │ ├── difyAgent.yaml │ ├── fastgptAgent.yaml │ ├── openaiAPI.yaml │ └── repeaterAgent.yaml ├── config_template.yaml └── engines │ ├── asr │ ├── difyAPI.yaml │ └── tencentAPI.yaml │ ├── llm │ └── openaiAPI.yaml │ └── tts │ ├── aliNLS.yaml │ ├── difyAPI.yaml │ ├── edgeAPI.yaml │ └── tencentAPI.yaml ├── digitalHuman ├── __init__.py ├── agent │ ├── __init__.py │ ├── agentBase.py │ ├── agentPool.py │ ├── builder.py │ └── core │ │ ├── __init__.py │ │ ├── agentFactory.py │ │ ├── difyAgent.py │ │ ├── fastgptAgent.py │ │ ├── openaiAgent.py │ │ └── repeaterAgent.py ├── bin │ ├── __init__.py │ └── app.py ├── core │ ├── __init__.py │ ├── openai.py │ └── runner.py ├── engine │ ├── __init__.py │ ├── asr │ │ ├── __init__.py │ │ ├── asrFactory.py │ │ ├── difyASR.py │ │ └── tencentASR.py │ ├── builder.py │ ├── engineBase.py │ ├── enginePool.py │ ├── llm │ │ ├── __init__.py │ │ └── llmFactory.py │ └── tts │ │ ├── __init__.py │ │ ├── aliNLSTTS.py │ │ ├── difyTTS.py │ │ ├── edgeTTS.py │ │ ├── tencentTTS.py │ │ └── ttsFactory.py ├── protocol.py ├── server │ ├── __init__.py │ ├── api │ │ ├── __init__.py │ │ ├── agent │ │ │ ├── __init__.py │ │ │ └── agent_api_v0.py │ │ ├── asr │ │ │ ├── __init__.py │ │ │ └── asr_api_v0.py │ │ ├── common │ │ │ ├── __init__.py │ │ │ └── common_api_v0.py │ │ ├── llm │ │ │ ├── __init__.py │ │ │ └── llm_api_v0.py │ │ └── tts │ │ │ ├── __init__.py │ │ │ └── tts_api_v0.py │ ├── core │ │ ├── __init__.py │ │ ├── api_agent_v0_impl.py │ │ ├── api_asr_v0_impl.py │ │ ├── api_llm_v0_impl.py │ │ └── api_tts_v0_impl.py │ ├── header.py │ ├── models.py │ ├── reponse.py │ ├── router.py │ └── ws.py └── utils │ ├── __init__.py │ ├── audio.py │ ├── configParser.py │ ├── env.py │ ├── func.py │ ├── logger.py │ ├── registry.py │ └── streamParser.py ├── docker-compose-quickStart.yaml ├── docker-compose.yaml ├── docker ├── adhServer.Dockerfile ├── adhWeb.Dockerfile └── nginx │ └── default.conf ├── docs ├── Q&A.md ├── deploy_instrction.md └── developer_instrction.md ├── main.py ├── requirements.txt ├── test ├── conftest.py ├── pytest.ini ├── src │ └── audio │ │ ├── en.wav │ │ └── zh.wav ├── test_agent_api.py ├── test_asr_api.py ├── test_common_api.py ├── test_llm_api.py ├── test_tts_api.py └── test_ws_web.html └── web ├── .dockerignore ├── .env ├── .env.development.local ├── .eslintrc.json ├── .gitignore ├── .npmrc ├── Dockerfile ├── README.md ├── app ├── (products) │ └── sentio │ │ ├── app.tsx │ │ ├── components │ │ ├── chatbot │ │ │ ├── index.tsx │ │ │ ├── input.tsx │ │ │ └── record.tsx │ │ ├── header.tsx │ │ ├── live2d.tsx │ │ ├── selector │ │ │ └── voiceSelector.tsx │ │ └── settings │ │ │ ├── basic.tsx │ │ │ ├── engine.tsx │ │ │ └── params.tsx │ │ ├── gallery.tsx │ │ ├── hooks │ │ ├── appConfig.ts │ │ ├── chat.ts │ │ └── live2d.ts │ │ ├── items.tsx │ │ ├── page.tsx │ │ └── settings.tsx ├── favicon.ico ├── layout.tsx ├── not-found.tsx ├── page.tsx └── providers.tsx ├── components ├── header │ └── logo.tsx ├── icons │ ├── github.tsx │ └── logo.tsx ├── slider │ └── valueSlider.tsx └── tips │ └── info.tsx ├── examples ├── README.md ├── iframe.html └── script.html ├── hooks └── request.ts ├── i18n ├── config.ts ├── locales │ ├── en.json │ └── zh.json └── request.ts ├── lib ├── api │ ├── requests.ts │ └── server.ts ├── constants.ts ├── font.ts ├── func.ts ├── live2d │ ├── Core │ │ ├── CHANGELOG.md │ │ ├── LICENSE.md │ │ ├── README.ja.md │ │ ├── README.md │ │ ├── RedistributableFiles.txt │ │ ├── live2dcubismcore.d.ts │ │ ├── live2dcubismcore.js │ │ ├── live2dcubismcore.js.map │ │ └── live2dcubismcore.min.js │ ├── Framework │ │ ├── .eslintrc.yml │ │ ├── CHANGELOG.md │ │ ├── LICENSE.md │ │ ├── README.ja.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── cubismdefaultparameterid.ts │ │ │ ├── cubismframeworkconfig.ts │ │ │ ├── cubismmodelsettingjson.ts │ │ │ ├── effect │ │ │ │ ├── cubismbreath.ts │ │ │ │ ├── cubismeyeblink.ts │ │ │ │ └── cubismpose.ts │ │ │ ├── icubismallcator.ts │ │ │ ├── icubismmodelsetting.ts │ │ │ ├── id │ │ │ │ ├── cubismid.ts │ │ │ │ └── cubismidmanager.ts │ │ │ ├── live2dcubismframework.ts │ │ │ ├── math │ │ │ │ ├── cubismmath.ts │ │ │ │ ├── cubismmatrix44.ts │ │ │ │ ├── cubismmodelmatrix.ts │ │ │ │ ├── cubismtargetpoint.ts │ │ │ │ ├── cubismvector2.ts │ │ │ │ └── cubismviewmatrix.ts │ │ │ ├── model │ │ │ │ ├── cubismmoc.ts │ │ │ │ ├── cubismmodel.ts │ │ │ │ ├── cubismmodeluserdata.ts │ │ │ │ ├── cubismmodeluserdatajson.ts │ │ │ │ └── cubismusermodel.ts │ │ │ ├── motion │ │ │ │ ├── acubismmotion.ts │ │ │ │ ├── cubismexpressionmotion.ts │ │ │ │ ├── cubismexpressionmotionmanager.ts │ │ │ │ ├── cubismmotion.ts │ │ │ │ ├── cubismmotioninternal.ts │ │ │ │ ├── cubismmotionjson.ts │ │ │ │ ├── cubismmotionmanager.ts │ │ │ │ ├── cubismmotionqueueentry.ts │ │ │ │ └── cubismmotionqueuemanager.ts │ │ │ ├── physics │ │ │ │ ├── cubismphysics.ts │ │ │ │ ├── cubismphysicsinternal.ts │ │ │ │ └── cubismphysicsjson.ts │ │ │ ├── rendering │ │ │ │ ├── cubismclippingmanager.ts │ │ │ │ ├── cubismrenderer.ts │ │ │ │ ├── cubismrenderer_webgl.ts │ │ │ │ └── cubismshader_webgl.ts │ │ │ ├── type │ │ │ │ ├── csmmap.ts │ │ │ │ ├── csmrectf.ts │ │ │ │ ├── csmstring.ts │ │ │ │ └── csmvector.ts │ │ │ └── utils │ │ │ │ ├── cubismdebug.ts │ │ │ │ ├── cubismjson.ts │ │ │ │ ├── cubismjsonextension.ts │ │ │ │ └── cubismstring.ts │ │ └── tsconfig.json │ ├── live2dManager.ts │ └── src │ │ ├── lappdefine.ts │ │ ├── lappdelegate.ts │ │ ├── lappglmanager.ts │ │ ├── lapplive2dmanager.ts │ │ ├── lappmodel.ts │ │ ├── lapppal.ts │ │ ├── lappsprite.ts │ │ ├── lappsubdelegate.ts │ │ ├── lapptexturemanager.ts │ │ ├── lappview.ts │ │ ├── lappwavfilehandler.ts │ │ ├── main.ts │ │ └── touchmanager.ts ├── locale.ts ├── path.ts ├── protocol.ts ├── store │ ├── common.ts │ └── sentio.ts └── utils │ └── audio.ts ├── next.config.ts ├── package.json ├── pnpm-lock.yaml ├── postcss.config.mjs ├── public ├── embed.js ├── image │ └── loading.png ├── sentio │ ├── backgrounds │ │ └── static │ │ │ ├── 夜晚街道.jpg │ │ │ ├── 抽象.jpg │ │ │ ├── 插画.jpg │ │ │ ├── 火影忍者.jpg │ │ │ ├── 简约.jpg │ │ │ ├── 艺术.jpg │ │ │ └── 赛博朋克.jpg │ ├── characters │ │ └── free │ │ │ ├── Chitose │ │ │ ├── Chitose.model3.json │ │ │ ├── Chitose.png │ │ │ ├── chitose.2048 │ │ │ │ └── texture_00.png │ │ │ ├── chitose.cdi3.json │ │ │ ├── chitose.moc3 │ │ │ ├── chitose.physics3.json │ │ │ ├── chitose.pose3.json │ │ │ ├── expressions │ │ │ │ ├── 伤心.exp3.json │ │ │ │ ├── 尴尬.exp3.json │ │ │ │ ├── 开心.exp3.json │ │ │ │ ├── 微笑.exp3.json │ │ │ │ ├── 惊讶.exp3.json │ │ │ │ ├── 生气.exp3.json │ │ │ │ └── 脸红.exp3.json │ │ │ └── motions │ │ │ │ ├── 微笑-向左指引.motion3.json │ │ │ │ ├── 微笑-插单手.motion3.json │ │ │ │ ├── 微笑-看着你.motion3.json │ │ │ │ └── 打招呼-挥手.motion3.json │ │ │ ├── Epsilon │ │ │ ├── Epsilon.1024 │ │ │ │ ├── texture_00.png │ │ │ │ ├── texture_01.png │ │ │ │ └── texture_02.png │ │ │ ├── Epsilon.cdi3.json │ │ │ ├── Epsilon.moc3 │ │ │ ├── Epsilon.model3.json │ │ │ ├── Epsilon.physics3.json │ │ │ ├── Epsilon.png │ │ │ ├── expressions │ │ │ │ ├── 伤心.exp3.json │ │ │ │ ├── 开心.exp3.json │ │ │ │ ├── 微笑.exp3.json │ │ │ │ ├── 惊吓.exp3.json │ │ │ │ ├── 无辜.exp3.json │ │ │ │ ├── 生气.exp3.json │ │ │ │ ├── 脸红.exp3.json │ │ │ │ └── 难过.exp3.json │ │ │ └── motions │ │ │ │ ├── 伤心-叹气看地上.motion3.json │ │ │ │ ├── 伤心-流泪.motion3.json │ │ │ │ ├── 俏皮-单眯眼.motion3.json │ │ │ │ ├── 冷漠-摇晃身体.motion3.json │ │ │ │ ├── 否定-摇头.motion3.json │ │ │ │ ├── 尴尬-闭眼摇头.motion3.json │ │ │ │ ├── 开心-眯眼.motion3.json │ │ │ │ ├── 微笑-平淡.motion3.json │ │ │ │ ├── 惊吓-瞪眼.motion3.json │ │ │ │ ├── 无语-转头.motion3.json │ │ │ │ ├── 生气-叉手.motion3.json │ │ │ │ ├── 生气-皱眉.motion3.json │ │ │ │ ├── 疑惑-歪头.motion3.json │ │ │ │ ├── 肯定-点头.motion3.json │ │ │ │ └── 难过-点头.motion3.json │ │ │ ├── Haru │ │ │ ├── Haru.model3.json │ │ │ ├── Haru.png │ │ │ ├── expressions │ │ │ │ ├── f01.exp3.json │ │ │ │ ├── f02.exp3.json │ │ │ │ ├── 开心.exp3.json │ │ │ │ ├── 微笑.exp3.json │ │ │ │ ├── 惊喜.exp3.json │ │ │ │ ├── 生气.exp3.json │ │ │ │ ├── 脸红.exp3.json │ │ │ │ └── 难过.exp3.json │ │ │ ├── haru.1024 │ │ │ │ ├── texture_00.png │ │ │ │ ├── texture_01.png │ │ │ │ └── texture_02.png │ │ │ ├── haru.cdi3.json │ │ │ ├── haru.moc3 │ │ │ ├── haru.physics3.json │ │ │ ├── haru.pose3.json │ │ │ └── motion │ │ │ │ ├── 冷漠-看着你.motion3.json │ │ │ │ ├── 否定-闭眼摇头.motion3.json │ │ │ │ ├── 开心-手放下眯眼笑说话.motion3.json │ │ │ │ ├── 开心-眯眼笑.motion3.json │ │ │ │ ├── 开心-眯眼笑手放胸前.motion3.json │ │ │ │ ├── 开心-眯眼笑点头.motion3.json │ │ │ │ ├── 开心-眯眼笑着说话.motion3.json │ │ │ │ ├── 开心-眯眼笑说话.motion3.json │ │ │ │ ├── 开心-笑着说话.motion3.json │ │ │ │ ├── 微笑-向右指引.motion3.json │ │ │ │ ├── 微笑-看着你.motion3.json │ │ │ │ ├── 微笑-肯定点头.motion3.json │ │ │ │ ├── 惊吓-手摆开.motion3.json │ │ │ │ ├── 惊喜-转开心说话.motion3.json │ │ │ │ ├── 激动-左右摇晃说话.motion3.json │ │ │ │ ├── 生气-双手叉腰.motion3.json │ │ │ │ ├── 生气-双手叉腰看着你.motion3.json │ │ │ │ ├── 疑惑-手放下巴.motion3.json │ │ │ │ ├── 疑惑-手放嘴角说话.motion3.json │ │ │ │ ├── 疑惑-转微笑说话.motion3.json │ │ │ │ ├── 疑惑-难过看着你.motion3.json │ │ │ │ ├── 脸红-手放嘴角说话.motion3.json │ │ │ │ └── 脸红-疑惑说话.motion3.json │ │ │ ├── HaruGreeter │ │ │ ├── Haru.2048 │ │ │ │ ├── texture_00.png │ │ │ │ └── texture_01.png │ │ │ ├── Haru.cdi3.json │ │ │ ├── Haru.moc3 │ │ │ ├── Haru.physics3.json │ │ │ ├── Haru.pose3.json │ │ │ ├── Haru.userdata3.json │ │ │ ├── HaruGreeter.model3.json │ │ │ ├── HaruGreeter.png │ │ │ ├── expressions │ │ │ │ ├── 冷漠.exp3.json │ │ │ │ ├── 开心张嘴.exp3.json │ │ │ │ ├── 开心眯眼.exp3.json │ │ │ │ ├── 微笑.exp3.json │ │ │ │ ├── 惊讶.exp3.json │ │ │ │ ├── 生气.exp3.json │ │ │ │ ├── 脸红.exp3.json │ │ │ │ └── 难过.exp3.json │ │ │ └── motions │ │ │ │ ├── 俏皮-微微摇头.motion3.json │ │ │ │ ├── 否定-微微摇头.motion3.json │ │ │ │ ├── 否定-摆双手摇头.motion3.json │ │ │ │ ├── 微笑-向前浅鞠躬.motion3.json │ │ │ │ ├── 微笑-向前深鞠躬.motion3.json │ │ │ │ ├── 微笑-抬手往右指引.motion3.json │ │ │ │ ├── 微笑-抬手往左指引.motion3.json │ │ │ │ ├── 微笑-正常.motion3.json │ │ │ │ ├── 微笑-点头.motion3.json │ │ │ │ ├── 微笑-背手点头.motion3.json │ │ │ │ ├── 惊吓-往后一仰.motion3.json │ │ │ │ ├── 惊吓-闭眼张开双手后瞪眼.motion3.json │ │ │ │ ├── 惊讶-叉手张嘴点头.motion3.json │ │ │ │ ├── 惊讶-双手放开.motion3.json │ │ │ │ ├── 惊讶-张开双手点头.motion3.json │ │ │ │ ├── 无奈-叉手点头.motion3.json │ │ │ │ ├── 生气-被惊后埋头看地.motion3.json │ │ │ │ ├── 疑惑-张开双手定睛狠狠往前一看.motion3.json │ │ │ │ ├── 疑惑-张开双手定睛轻微往前一看.motion3.json │ │ │ │ ├── 疑虑-手放嘴角.motion3.json │ │ │ │ ├── 脸红-眯眼埋头.motion3.json │ │ │ │ ├── 脸红-眯眼笑.motion3.json │ │ │ │ ├── 脸红-身体往前倾.motion3.json │ │ │ │ ├── 难过-双手放胸前.motion3.json │ │ │ │ ├── 难过-睁眼瘪嘴.motion3.json │ │ │ │ ├── 高兴-左右摇摆.motion3.json │ │ │ │ └── 高兴-身体前倾眯眼.motion3.json │ │ │ ├── Hibiki │ │ │ ├── Hibiki.model3.json │ │ │ ├── Hibiki.png │ │ │ ├── expressions │ │ │ │ ├── 伤心.exp3.json │ │ │ │ ├── 冷漠.exp3.json │ │ │ │ ├── 微笑.exp3.json │ │ │ │ ├── 惊喜.exp3.json │ │ │ │ ├── 生气.exp3.json │ │ │ │ └── 脸红.exp3.json │ │ │ ├── hibiki.2048 │ │ │ │ └── texture_00.png │ │ │ ├── hibiki.cdi3.json │ │ │ ├── hibiki.moc3 │ │ │ ├── hibiki.physics3.json │ │ │ └── motions │ │ │ │ ├── 微笑-说话_01.motion3.json │ │ │ │ ├── 微笑-说话_02.motion3.json │ │ │ │ ├── 微笑-说话_03.motion3.json │ │ │ │ ├── 微笑-说话_04.motion3.json │ │ │ │ └── 生气-转无辜.motion3.json │ │ │ ├── Hiyori │ │ │ ├── Hiyori.2048 │ │ │ │ ├── texture_00.png │ │ │ │ └── texture_01.png │ │ │ ├── Hiyori.cdi3.json │ │ │ ├── Hiyori.moc3 │ │ │ ├── Hiyori.model3.json │ │ │ ├── Hiyori.physics3.json │ │ │ ├── Hiyori.png │ │ │ ├── Hiyori.pose3.json │ │ │ ├── Hiyori.userdata3.json │ │ │ └── motions │ │ │ │ ├── 伤心-低头.motion3.json │ │ │ │ ├── 开心-张嘴笑.motion3.json │ │ │ │ ├── 开心-眯眼笑.motion3.json │ │ │ │ ├── 微笑-看着你.motion3.json │ │ │ │ ├── 惊吓-转生气.motion3.json │ │ │ │ ├── 惊讶-张嘴.motion3.json │ │ │ │ ├── 撒娇-摆手.motion3.json │ │ │ │ ├── 无聊-抬头望天摇摆.motion3.json │ │ │ │ ├── 疑惑-脸红转开心.motion3.json │ │ │ │ └── 难过-皱眉.motion3.json │ │ │ ├── Izumi │ │ │ ├── Izumi.model3.json │ │ │ ├── Izumi.png │ │ │ ├── expressions │ │ │ │ ├── 伤心.exp3.json │ │ │ │ ├── 冷漠.exp3.json │ │ │ │ ├── 开心.exp3.json │ │ │ │ ├── 微笑.exp3.json │ │ │ │ ├── 惊讶.exp3.json │ │ │ │ ├── 生气.exp3.json │ │ │ │ └── 脸红.exp3.json │ │ │ ├── izumi.1024 │ │ │ │ ├── texture_00.png │ │ │ │ ├── texture_01.png │ │ │ │ ├── texture_02.png │ │ │ │ └── texture_03.png │ │ │ ├── izumi.cdi3.json │ │ │ ├── izumi.moc3 │ │ │ ├── izumi.physics3.json │ │ │ └── motions │ │ │ │ ├── 俏皮-说话.motion3.json │ │ │ │ ├── 开心-眯眼.motion3.json │ │ │ │ ├── 微笑-说话.motion3.json │ │ │ │ ├── 惊吓-大叫.motion3.json │ │ │ │ ├── 惊喜-转开心眯眼.motion3.json │ │ │ │ ├── 惊讶-说话转尴尬.motion3.json │ │ │ │ ├── 无奈-叹气说话.motion3.json │ │ │ │ ├── 烦躁-摇头说话.motion3.json │ │ │ │ ├── 疑惑-说话.motion3.json │ │ │ │ └── 难过-说话.motion3.json │ │ │ ├── Kei │ │ │ ├── Kei.model3.json │ │ │ ├── Kei.png │ │ │ ├── kei_vowels_pro.2048 │ │ │ │ └── texture_00.png │ │ │ ├── kei_vowels_pro.cdi3.json │ │ │ ├── kei_vowels_pro.moc3 │ │ │ ├── kei_vowels_pro.motionsync3.json │ │ │ ├── kei_vowels_pro.physics3.json │ │ │ └── motions │ │ │ │ ├── 01_kei_en.motion3.json │ │ │ │ ├── 01_kei_jp.motion3.json │ │ │ │ ├── 01_kei_ko.motion3.json │ │ │ │ └── 01_kei_zh.motion3.json │ │ │ ├── Mao │ │ │ ├── Mao.2048 │ │ │ │ └── texture_00.png │ │ │ ├── Mao.cdi3.json │ │ │ ├── Mao.moc3 │ │ │ ├── Mao.model3.json │ │ │ ├── Mao.physics3.json │ │ │ ├── Mao.png │ │ │ ├── Mao.pose3.json │ │ │ ├── expressions │ │ │ │ ├── 伤心.exp3.json │ │ │ │ ├── 尴尬.exp3.json │ │ │ │ ├── 开心.exp3.json │ │ │ │ ├── 微笑.exp3.json │ │ │ │ ├── 惊吓.exp3.json │ │ │ │ ├── 惊喜.exp3.json │ │ │ │ ├── 生气.exp3.json │ │ │ │ └── 脸红.exp3.json │ │ │ └── motions │ │ │ │ ├── 俏皮-闭眼背手摇晃.motion3.json │ │ │ │ ├── 微笑-挥动双手.motion3.json │ │ │ │ ├── 微笑-看着你.motion3.json │ │ │ │ ├── 画画失败-爱心.motion3.json │ │ │ │ ├── 画画成功-爱心.motion3.json │ │ │ │ └── 自信-摸帽子.motion3.json │ │ │ ├── Rice │ │ │ ├── Rice.2048 │ │ │ │ ├── texture_00.png │ │ │ │ └── texture_01.png │ │ │ ├── Rice.cdi3.json │ │ │ ├── Rice.moc3 │ │ │ ├── Rice.model3.json │ │ │ ├── Rice.physics3.json │ │ │ ├── Rice.png │ │ │ └── motions │ │ │ │ ├── 平淡.motion3.json │ │ │ │ ├── 魔法-书点火.motion3.json │ │ │ │ ├── 魔法-大能量攻击.motion3.json │ │ │ │ └── 魔法-小能量攻击.motion3.json │ │ │ ├── Shizuku │ │ │ ├── Shizuku.model3.json │ │ │ ├── Shizuku.png │ │ │ ├── motions │ │ │ │ ├── 害怕-蒙眼.motion3.json │ │ │ │ ├── 打哈欠-眯眼.motion3.json │ │ │ │ ├── 打哈欠-脸红.motion3.json │ │ │ │ └── 犯困-左右张望.motion3.json │ │ │ ├── shizuku.1024 │ │ │ │ ├── texture_00.png │ │ │ │ ├── texture_01.png │ │ │ │ ├── texture_02.png │ │ │ │ ├── texture_03.png │ │ │ │ └── texture_04.png │ │ │ ├── shizuku.cdi3.json │ │ │ ├── shizuku.moc3 │ │ │ ├── shizuku.physics3.json │ │ │ └── shizuku.pose3.json │ │ │ └── Tsumiki │ │ │ ├── Tsumiki.model3.json │ │ │ ├── Tsumiki.png │ │ │ ├── expressions │ │ │ ├── 伤心.exp3.json │ │ │ ├── 呵斥.exp3.json │ │ │ ├── 尴尬.exp3.json │ │ │ ├── 开心-01.exp3.json │ │ │ ├── 开心-02.exp3.json │ │ │ ├── 微笑.exp3.json │ │ │ ├── 惊讶.exp3.json │ │ │ ├── 无语.exp3.json │ │ │ ├── 生气.exp3.json │ │ │ └── 脸红.exp3.json │ │ │ ├── motions │ │ │ ├── 俏皮-扭腿单眨眼.motion3.json │ │ │ ├── 傲慢-轻蔑说话.motion3.json │ │ │ ├── 好奇-吓一跳后生气.motion3.json │ │ │ ├── 害羞-摇头.motion3.json │ │ │ ├── 开心-头发飞起来.motion3.json │ │ │ ├── 开心-惊喜看着你.motion3.json │ │ │ ├── 开心-眯眼.motion3.json │ │ │ ├── 开心-眯眼张嘴.motion3.json │ │ │ ├── 开心-脸红点头.motion3.json │ │ │ ├── 开心-跳起来.motion3.json │ │ │ ├── 微笑-看着你.motion3.json │ │ │ ├── 微笑-眨眼.motion3.json │ │ │ ├── 惊吓-后退.motion3.json │ │ │ ├── 惊吓-吓一跳哭起来.motion3.json │ │ │ ├── 惊讶-开心.motion3.json │ │ │ ├── 惊讶-张嘴.motion3.json │ │ │ ├── 无奈-叹气摇头.motion3.json │ │ │ ├── 生气-瞪眼看着你.motion3.json │ │ │ ├── 疑惑-左右摇晃.motion3.json │ │ │ ├── 脸红-勾单腿.motion3.json │ │ │ ├── 脸红-点头.motion3.json │ │ │ ├── 脸红-看着你.motion3.json │ │ │ └── 难过-眼神迷离.motion3.json │ │ │ ├── tsumiki.2048 │ │ │ ├── texture_00.png │ │ │ └── texture_01.png │ │ │ ├── tsumiki.cdi3.json │ │ │ ├── tsumiki.moc3 │ │ │ └── tsumiki.physics3.json │ └── core │ │ └── live2dcubismcore.min.js └── vad │ ├── ort-wasm-simd.wasm │ ├── silero_vad_legacy.onnx │ ├── silero_vad_v5.onnx │ └── vad.worklet.bundle.min.js ├── styles ├── fonts │ ├── honglei.ttf │ └── yunFeng.ttf └── globals.css ├── tailwind.config.ts └── tsconfig.json /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | node_modules 3 | dist -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # IDE File 2 | .idea 3 | .vscode 4 | 5 | # log File 6 | logs 7 | *log.txt 8 | 9 | # Output File 10 | outputs 11 | *.wav 12 | *.mp3 13 | *.mp4 14 | 15 | # Python tmp File 16 | __pycache__ 17 | 18 | # web tmp File 19 | node_modules 20 | dist 21 | package-lock.json 22 | 23 | # local Folder 24 | data 25 | volumes 26 | config.yaml 27 | .DS_Store -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 wan-h 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /assets/Q&A_1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/Q&A_1_1.png -------------------------------------------------------------------------------- /assets/Q&A_3_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/Q&A_3_1.png -------------------------------------------------------------------------------- /assets/Q&A_4_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/Q&A_4_1.png -------------------------------------------------------------------------------- /assets/Q&A_5_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/Q&A_5_1.png -------------------------------------------------------------------------------- /assets/agent-extend-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/agent-extend-1.png -------------------------------------------------------------------------------- /assets/arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/arch.png -------------------------------------------------------------------------------- /assets/character-extend-v2.0.0-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/character-extend-v2.0.0-1.png -------------------------------------------------------------------------------- /assets/character-extend-v2.0.0-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/character-extend-v2.0.0-2.png -------------------------------------------------------------------------------- /assets/character-extend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/character-extend.png -------------------------------------------------------------------------------- /assets/character-lip-ctr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/character-lip-ctr.png -------------------------------------------------------------------------------- /assets/chatError.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/chatError.png -------------------------------------------------------------------------------- /assets/difyAPI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/difyAPI.png -------------------------------------------------------------------------------- /assets/difyKey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/difyKey.png -------------------------------------------------------------------------------- /assets/difySetting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/difySetting.png -------------------------------------------------------------------------------- /assets/llm-extend-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/llm-extend-1.png -------------------------------------------------------------------------------- /assets/llm-extend-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/llm-extend-2.png -------------------------------------------------------------------------------- /assets/llm-extend-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/llm-extend-3.png -------------------------------------------------------------------------------- /assets/llm-extend-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/llm-extend-4.png -------------------------------------------------------------------------------- /assets/pc_web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/pc_web.png -------------------------------------------------------------------------------- /assets/phone_web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/phone_web.png -------------------------------------------------------------------------------- /assets/webPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/webPage.png -------------------------------------------------------------------------------- /assets/wechat_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/wechat_1.png -------------------------------------------------------------------------------- /assets/wechat_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/assets/wechat_2.png -------------------------------------------------------------------------------- /configs/agents/difyAgent.yaml: -------------------------------------------------------------------------------- 1 | NAME: "Dify" 2 | VERSION: "v0.0.1" 3 | DESC: "接入Dify应用" 4 | META: { 5 | official: "https://dify.ai/", 6 | configuration: "https://mp.weixin.qq.com/s/YXyHYN1dC_nJAOCco7ZJjg", 7 | tips: "支持本地部署的Dify应用", 8 | fee: "" 9 | } 10 | # 暴露给前端的参数选项以及默认值 11 | PARAMETERS: [ 12 | { 13 | name: "api_server", 14 | description: "Dify API Server.", 15 | type: "string", 16 | required: true, 17 | choices: [], 18 | default: "" 19 | }, 20 | { 21 | name: "api_key", 22 | description: "Dify API Key.", 23 | type: "string", 24 | required: true, 25 | choices: [], 26 | default: "" 27 | }, 28 | { 29 | name: "username", 30 | description: "Dify Username.", 31 | type: "string", 32 | required: true, 33 | choices: [], 34 | default: "" 35 | } 36 | ] -------------------------------------------------------------------------------- /configs/agents/fastgptAgent.yaml: -------------------------------------------------------------------------------- 1 | NAME: "FastGPT" 2 | VERSION: "v0.0.1" 3 | DESC: "接入FastGPT应用" 4 | META: { 5 | official: "https://fastgpt.cn", 6 | configuration: "FastGPT云服务: https://cloud.fastgpt.cn", 7 | tips: "", 8 | fee: "" 9 | } 10 | # 暴露给前端的参数选项以及默认值 11 | PARAMETERS: [ 12 | { 13 | name: "base_url", 14 | description: "FastGPT base url.", 15 | type: "string", 16 | required: true, 17 | choices: [], 18 | default: "" 19 | }, 20 | { 21 | name: "api_key", 22 | description: "FastGPT API Key.", 23 | type: "string", 24 | required: true, 25 | choices: [], 26 | default: "" 27 | }, 28 | { 29 | name: "uid", 30 | description: "FastGPT customUid.", 31 | type: "string", 32 | required: false, 33 | choices: [], 34 | default: "adh" 35 | } 36 | ] -------------------------------------------------------------------------------- /configs/agents/openaiAPI.yaml: -------------------------------------------------------------------------------- 1 | NAME: "OpenAI" 2 | VERSION: "v0.0.1" 3 | DESC: "接入Openai协议的服务" 4 | META: { 5 | official: "", 6 | configuration: "", 7 | tips: "兼容所有符合Openai协议的API", 8 | fee: "" 9 | } 10 | # 暴露给前端的参数选项以及默认值 11 | PARAMETERS: [ 12 | { 13 | name: "model", 14 | description: "ID of the model to use.", 15 | type: "string", 16 | required: true, 17 | choices: [], 18 | default: "" 19 | }, 20 | { 21 | name: "base_url", 22 | description: "The base url for request.", 23 | type: "string", 24 | required: false, 25 | choices: [], 26 | default: "https://api.openai.com/v1" 27 | }, 28 | { 29 | name: "api_key", 30 | description: "The api key for request.", 31 | type: "string", 32 | required: true, 33 | choices: [], 34 | default: "" 35 | } 36 | ] -------------------------------------------------------------------------------- /configs/agents/repeaterAgent.yaml: -------------------------------------------------------------------------------- 1 | NAME: "Repeater" 2 | VERSION: "v0.0.1" 3 | DESC: "复读机" 4 | META: { 5 | official: "", 6 | configuration: "", 7 | tips: "测试使用", 8 | fee: "" 9 | } -------------------------------------------------------------------------------- /configs/config_template.yaml: -------------------------------------------------------------------------------- 1 | COMMON: 2 | NAME: "Awesome-Digital-Human" 3 | VERSION: "v3.0.0" 4 | LOG_LEVEL: "DEBUG" 5 | SERVER: 6 | IP: "0.0.0.0" 7 | PORT: 8880 8 | STORAGE_DOMAIN: "https://light4ai.space" 9 | WORKSPACE_PATH: "./outputs" 10 | ENGINES: 11 | ASR: 12 | SUPPORT_LIST: [ "difyAPI.yaml", "tencentAPI.yaml" ] 13 | DEFAULT: "difyAPI.yaml" 14 | TTS: 15 | SUPPORT_LIST: [ "edgeAPI.yaml", "tencentAPI.yaml", "difyAPI.yaml" ] 16 | DEFAULT: "edgeAPI.yaml" 17 | LLM: 18 | SUPPORT_LIST: [] 19 | DEFAULT: "" 20 | AGENTS: 21 | SUPPORT_LIST: [ "repeaterAgent.yaml", "openaiAPI.yaml", "difyAgent.yaml", "fastgptAgent.yaml" ] 22 | DEFAULT: "repeaterAgent.yaml" -------------------------------------------------------------------------------- /configs/engines/asr/difyAPI.yaml: -------------------------------------------------------------------------------- 1 | NAME: "Dify" 2 | VERSION: "v0.0.1" 3 | DESC: "接入Dify应用" 4 | META: { 5 | official: "https://dify.ai/", 6 | configuration: "https://mp.weixin.qq.com/s/YXyHYN1dC_nJAOCco7ZJjg", 7 | tips: "支持本地部署的Dify应用", 8 | fee: "free" 9 | } 10 | # 暴露给前端的参数选项以及默认值 11 | PARAMETERS: [ 12 | { 13 | name: "api_server", 14 | description: "Dify API Server.", 15 | type: "string", 16 | required: true, 17 | choices: [], 18 | default: "" 19 | }, 20 | { 21 | name: "api_key", 22 | description: "Dify API Key.", 23 | type: "string", 24 | required: true, 25 | choices: [], 26 | default: "" 27 | }, 28 | { 29 | name: "username", 30 | description: "Dify Username.", 31 | type: "string", 32 | required: true, 33 | choices: [], 34 | default: "" 35 | } 36 | ] -------------------------------------------------------------------------------- /configs/engines/asr/tencentAPI.yaml: -------------------------------------------------------------------------------- 1 | NAME: "Tencent-API" 2 | VERSION: "v0.0.1" 3 | DESC: "接入腾讯服务" 4 | META: { 5 | official: "", 6 | configuration: "https://console.cloud.tencent.com/asr", 7 | tips: "", 8 | fee: "" 9 | } 10 | # 暴露给前端的参数选项以及默认值 11 | PARAMETERS: [ 12 | { 13 | name: "secret_id", 14 | description: "tencent secret_id.", 15 | type: "string", 16 | required: true, 17 | choices: [], 18 | default: "" 19 | }, 20 | { 21 | name: "secret_key", 22 | description: "tencent secret_key.", 23 | type: "string", 24 | required: true, 25 | choices: [], 26 | default: "" 27 | } 28 | ] -------------------------------------------------------------------------------- /configs/engines/llm/openaiAPI.yaml: -------------------------------------------------------------------------------- 1 | NAME: "OpenAI" 2 | VERSION: "v0.0.1" 3 | DESC: "" 4 | META: { 5 | FEE: "free" 6 | } 7 | PARAMETERS: [ 8 | { 9 | name: "model", 10 | description: "ID of the model to use.", 11 | type: "string", 12 | required: true, 13 | choices: [], 14 | default: "" 15 | }, 16 | { 17 | name: "base_url", 18 | description: "The base url for request.", 19 | type: "string", 20 | required: false, 21 | choices: [], 22 | default: "https://api.openai.com/v1" 23 | }, 24 | { 25 | name: "api_key", 26 | description: "The api key for request.", 27 | type: "string", 28 | required: true, 29 | choices: [], 30 | default: "" 31 | } 32 | ] -------------------------------------------------------------------------------- /configs/engines/tts/aliNLS.yaml: -------------------------------------------------------------------------------- 1 | NAME: "AliNLSTTS" # Name of the engine, will be used for registration 2 | VERSION: "v0.0.1" 3 | DESC: "接入Ali服务" 4 | META: { 5 | official: "", 6 | configuration: "https://nls-portal.console.aliyun.com/applist", 7 | tips: "", 8 | fee: "" 9 | } 10 | URL: "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1" # Default NLS Gateway URL, can change to other region 11 | FORMAT: "wav" # Output audio format (mp3, wav). NLS SDK default is pcm, we change to `wav`. 12 | SAMPLE_RATE: 16000 # Audio sample rate. NLS SDK default is 16000 for pcm. 13 | # 暴露给前端的参数选项以及默认值 14 | PARAMETERS: [ 15 | { 16 | name: "voice", 17 | description: "Voice for AliNLS.", 18 | type: "string", 19 | required: true, 20 | choices: [], 21 | default: "zhimi_emo" 22 | }, 23 | { 24 | name: "token", 25 | description: "Ali API token.", 26 | type: "string", 27 | required: true, 28 | choices: [], 29 | default: "" 30 | }, 31 | { 32 | name: "app_key", 33 | description: "Ali API app key.", 34 | type: "string", 35 | required: true, 36 | choices: [], 37 | default: "" 38 | } 39 | ] -------------------------------------------------------------------------------- /configs/engines/tts/difyAPI.yaml: -------------------------------------------------------------------------------- 1 | NAME: "Dify" 2 | VERSION: "v0.0.1" 3 | DESC: "接入Dify应用" 4 | META: { 5 | official: "https://dify.ai/", 6 | configuration: "https://mp.weixin.qq.com/s/YXyHYN1dC_nJAOCco7ZJjg", 7 | tips: "支持本地部署的Dify应用全", 8 | fee: "" 9 | } 10 | # 暴露给前端的参数选项以及默认值 11 | PARAMETERS: [ 12 | { 13 | name: "api_server", 14 | description: "Dify API Server.", 15 | type: "string", 16 | required: true, 17 | choices: [], 18 | default: "" 19 | }, 20 | { 21 | name: "api_key", 22 | description: "Dify API Key.", 23 | type: "string", 24 | required: true, 25 | choices: [], 26 | default: "" 27 | }, 28 | { 29 | name: "username", 30 | description: "Dify Username.", 31 | type: "string", 32 | required: true, 33 | choices: [], 34 | default: "" 35 | } 36 | ] -------------------------------------------------------------------------------- /configs/engines/tts/edgeAPI.yaml: -------------------------------------------------------------------------------- 1 | NAME: "EdgeTTS" 2 | VERSION: "v0.0.1" 3 | DESC: "适配EdgeTTS" 4 | META: { 5 | official: "https://github.com/rany2/edge-tts", 6 | configuration: "", 7 | tips: "开源项目可能存在不稳定的情况", 8 | fee: "free" 9 | } 10 | # 需求参数 11 | PARAMETERS: [ 12 | { 13 | name: "voice", 14 | description: "Voice for TTS.", 15 | type: "string", 16 | required: true, 17 | choices: ["Getting from voice api..."], 18 | default: "zh-CN-XiaoxiaoNeural" 19 | }, 20 | { 21 | name: "rate", 22 | description: "Set rate, default +0%.", 23 | type: "int", 24 | required: false, 25 | range: [-100, 100], 26 | default: 0 27 | }, 28 | { 29 | name: "volume", 30 | description: "Set volume, default +0%.", 31 | type: "int", 32 | required: false, 33 | range: [-100, 100], 34 | default: 0 35 | }, 36 | { 37 | name: "pitch", 38 | description: "Set pitch, default +0Hz.", 39 | type: "int", 40 | required: false, 41 | range: [-100, 100], 42 | default: 0 43 | } 44 | ] -------------------------------------------------------------------------------- /configs/engines/tts/tencentAPI.yaml: -------------------------------------------------------------------------------- 1 | NAME: "Tencent-API" 2 | VERSION: "v0.0.1" 3 | DESC: "接入腾讯服务" 4 | META: { 5 | official: "", 6 | configuration: "https://console.cloud.tencent.com/tts", 7 | tips: "", 8 | fee: "" 9 | } 10 | PARAMETERS: [ 11 | { 12 | name: "secret_id", 13 | description: "tencent secret_id.", 14 | type: "string", 15 | required: true, 16 | choices: [], 17 | default: "" 18 | }, 19 | { 20 | name: "secret_key", 21 | description: "tencent secret_key.", 22 | type: "string", 23 | required: true, 24 | choices: [], 25 | default: "" 26 | }, 27 | { 28 | name: "voice", 29 | description: "Voice for TTS.", 30 | type: "string", 31 | required: false, 32 | choices: [], 33 | default: "爱小璟" 34 | }, 35 | { 36 | name: "volume", 37 | description: "Set volume, default +0%.", 38 | type: "float", 39 | required: false, 40 | range: [-10, 10], 41 | default: 0.0 42 | }, 43 | { 44 | name: "speed", 45 | description: "Set speed, default +0%.", 46 | type: "float", 47 | required: false, 48 | range: [-2, 6], 49 | default: 0.0 50 | } 51 | ] 52 | -------------------------------------------------------------------------------- /digitalHuman/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | -------------------------------------------------------------------------------- /digitalHuman/agent/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from .agentPool import AgentPool -------------------------------------------------------------------------------- /digitalHuman/agent/agentBase.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : engineBase.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from uuid import uuid4 8 | from abc import abstractmethod 9 | from digitalHuman.protocol import BaseMessage 10 | from digitalHuman.core import BaseRunner 11 | 12 | __all__ = ["BaseAgent"] 13 | 14 | class BaseAgent(BaseRunner): 15 | async def createConversation(self, **kwargs) -> str: 16 | return str(uuid4()) 17 | 18 | @abstractmethod 19 | async def run(self, input: BaseMessage, **kwargs): 20 | raise NotImplementedError -------------------------------------------------------------------------------- /digitalHuman/agent/agentPool.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : AgentPool.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from threading import RLock 8 | from typing import List 9 | from yacs.config import CfgNode as CN 10 | from digitalHuman.utils import logger 11 | from .agentBase import BaseAgent 12 | from .core import AgentFactory 13 | 14 | __all__ = ["AgentPool"] 15 | 16 | class AgentPool(): 17 | singleLock = RLock() 18 | _init = False 19 | 20 | def __init__(self): 21 | if not self._init: 22 | self._pool = dict() 23 | self._init = True 24 | 25 | # Single Instance 26 | def __new__(cls, *args, **kwargs): 27 | with AgentPool.singleLock: 28 | if not hasattr(cls, '_instance'): 29 | AgentPool._instance = super().__new__(cls) 30 | return AgentPool._instance 31 | 32 | def __del__(self): 33 | self._pool.clear() 34 | self._init = False 35 | 36 | def setup(self, config: CN): 37 | for cfg in config.SUPPORT_LIST: 38 | self._pool[cfg.NAME] = AgentFactory.create(cfg) 39 | logger.info(f"[AgentPool] AGENT Engine {cfg.NAME} is created.") 40 | logger.info(f"[AgentPool] AGENT Engine default is {config.DEFAULT}.") 41 | 42 | def get(self, name: str) -> BaseAgent: 43 | if name not in self._pool: 44 | raise KeyError(f"[AgentPool] No such engine: {name}") 45 | return self._pool[name] 46 | 47 | def list(self) -> List[str]: 48 | return list(self._pool.keys()) -------------------------------------------------------------------------------- /digitalHuman/agent/builder.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : builder.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from digitalHuman.utils import Registry 8 | 9 | AGENTS = Registry() -------------------------------------------------------------------------------- /digitalHuman/agent/core/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from .difyAgent import DifyApiAgent 8 | from .repeaterAgent import RepeaterAgent 9 | from .fastgptAgent import FastgptApiAgent 10 | from .openaiAgent import OpenaiApiAgent 11 | 12 | from .agentFactory import AgentFactory 13 | 14 | __all__ = ['AgentFactory'] -------------------------------------------------------------------------------- /digitalHuman/agent/core/agentFactory.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : agentFactory.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from ..builder import AGENTS 8 | from ..agentBase import BaseAgent 9 | from typing import List 10 | from yacs.config import CfgNode as CN 11 | from digitalHuman.utils import logger 12 | from digitalHuman.protocol import ENGINE_TYPE 13 | 14 | class AgentFactory(): 15 | """ 16 | Agent Factory 17 | """ 18 | @staticmethod 19 | def create(config: CN) -> BaseAgent: 20 | if config.NAME in AGENTS.list(): 21 | logger.info(f"[AgentFactory] Create instance: {config.NAME}") 22 | return AGENTS.get(config.NAME)(config, ENGINE_TYPE.AGENT) 23 | else: 24 | raise RuntimeError(f"[AgentFactory] Please check config, support AGENT engine: {AGENTS.list()}") 25 | @staticmethod 26 | def list() -> List: 27 | return AGENTS.list() -------------------------------------------------------------------------------- /digitalHuman/agent/core/repeaterAgent.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : repeaterAgnet.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from ..builder import AGENTS 8 | from ..agentBase import BaseAgent 9 | from digitalHuman.protocol import * 10 | 11 | __all__ = ["Repeater"] 12 | 13 | 14 | @AGENTS.register("Repeater") 15 | class RepeaterAgent(BaseAgent): 16 | async def run( 17 | self, 18 | input: TextMessage, 19 | **kwargs 20 | ): 21 | yield eventStreamText(input.data) 22 | yield eventStreamDone() -------------------------------------------------------------------------------- /digitalHuman/bin/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from .app import runServer -------------------------------------------------------------------------------- /digitalHuman/bin/app.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : app.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | import uvicorn 8 | from digitalHuman.engine import EnginePool 9 | from digitalHuman.agent import AgentPool 10 | from digitalHuman.server import app 11 | from digitalHuman.utils import config 12 | 13 | __all__ = ["runServer"] 14 | 15 | def runServer(): 16 | enginePool = EnginePool() 17 | enginePool.setup(config.SERVER.ENGINES) 18 | agentPool = AgentPool() 19 | agentPool.setup(config.SERVER.AGENTS) 20 | uvicorn.run(app, host=config.SERVER.IP, port=config.SERVER.PORT, log_level="info") -------------------------------------------------------------------------------- /digitalHuman/core/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from .runner import BaseRunner 8 | from .openai import OpenaiLLM 9 | -------------------------------------------------------------------------------- /digitalHuman/core/openai.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : openai.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from openai import AsyncOpenAI 8 | from openai.types.chat import ChatCompletionChunk 9 | from typing import List, AsyncGenerator 10 | from digitalHuman.protocol import RoleMessage 11 | 12 | class OpenaiLLM(): 13 | @staticmethod 14 | async def chat( 15 | base_url: str, 16 | api_key: str, 17 | model: str, 18 | messages: List[RoleMessage], 19 | **kwargs 20 | ) -> AsyncGenerator[ChatCompletionChunk, None]: 21 | client = AsyncOpenAI( 22 | base_url=base_url, 23 | api_key=api_key 24 | ) 25 | completions = await client.chat.completions.create( 26 | model=model, 27 | messages=[message.model_dump() for message in messages], 28 | stream=True, 29 | **kwargs 30 | ) 31 | async for chunk in completions: 32 | yield chunk -------------------------------------------------------------------------------- /digitalHuman/engine/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from .enginePool import EnginePool 8 | from .engineBase import BaseEngine, BaseTTSEngine -------------------------------------------------------------------------------- /digitalHuman/engine/asr/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from .tencentASR import TencentApiAsr 8 | from .difyASR import DifyApiAsr 9 | from .asrFactory import ASRFactory 10 | 11 | __all__ = ['ASRFactory'] -------------------------------------------------------------------------------- /digitalHuman/engine/asr/asrFactory.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : asrFactory.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from ..builder import ASREngines 8 | from ..engineBase import BaseEngine 9 | from typing import List 10 | from yacs.config import CfgNode as CN 11 | from digitalHuman.protocol import ENGINE_TYPE 12 | from digitalHuman.utils import logger 13 | 14 | __all__ = ["ASRFactory"] 15 | 16 | class ASRFactory(): 17 | """ 18 | Automatic Speech Recognition Factory 19 | """ 20 | @staticmethod 21 | def create(config: CN) -> BaseEngine: 22 | if config.NAME in ASREngines.list(): 23 | logger.info(f"[ASRFactory] Create engine: {config.NAME}") 24 | return ASREngines.get(config.NAME)(config, ENGINE_TYPE.ASR) 25 | else: 26 | raise RuntimeError(f"[ASRFactory] Please check config, support ASR engine: {ASREngines.list()}") 27 | @staticmethod 28 | def list() -> List: 29 | return ASREngines.list() -------------------------------------------------------------------------------- /digitalHuman/engine/asr/difyASR.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : difyASR.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | 8 | from ..builder import ASREngines 9 | from ..engineBase import BaseASREngine 10 | import io, base64 11 | from digitalHuman.protocol import AudioMessage, TextMessage, AUDIO_TYPE 12 | from digitalHuman.utils import logger, httpxAsyncClient, wavToMp3 13 | 14 | __all__ = ["DifyApiAsr"] 15 | 16 | 17 | @ASREngines.register("Dify") 18 | class DifyApiAsr(BaseASREngine): 19 | async def run(self, input: AudioMessage, **kwargs) -> TextMessage: 20 | # 参数校验 21 | paramters = self.checkParameter(**kwargs) 22 | API_SERVER = paramters["api_server"] 23 | API_KEY = paramters["api_key"] 24 | API_USERNAME = paramters["username"] 25 | 26 | headers = { 27 | 'Authorization': f'Bearer {API_KEY}' 28 | } 29 | 30 | payload = { 31 | 'user': API_USERNAME 32 | } 33 | 34 | if isinstance(input.data, str): 35 | input.data = base64.b64decode(input.data) 36 | if input.type == AUDIO_TYPE.WAV: 37 | input.data = wavToMp3(input.data) 38 | input.type = AUDIO_TYPE.MP3 39 | files = {'file': ('file', io.BytesIO(input.data), 'audio/mp3')} 40 | response = await httpxAsyncClient.post(API_SERVER + "/audio-to-text", headers=headers, files=files, data=payload) 41 | if response.status_code != 200: 42 | raise RuntimeError(f"Dify asr api error: {response.status_code}") 43 | result = response.json()["text"] 44 | logger.debug(f"[ASR] Engine response: {result}") 45 | message = TextMessage(data=result) 46 | return message -------------------------------------------------------------------------------- /digitalHuman/engine/builder.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : builder.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from digitalHuman.utils import Registry 8 | 9 | TTSEngines = Registry() 10 | ASREngines = Registry() 11 | LLMEngines = Registry() -------------------------------------------------------------------------------- /digitalHuman/engine/engineBase.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : engineBase.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from typing import List 8 | from abc import abstractmethod 9 | from digitalHuman.core import BaseRunner 10 | from digitalHuman.protocol import BaseMessage, TextMessage, AudioMessage, VoiceDesc 11 | 12 | __all__ = ["BaseEngine"] 13 | 14 | class BaseEngine(BaseRunner): 15 | @abstractmethod 16 | async def run(self, input: BaseMessage, **kwargs) -> BaseMessage: 17 | raise NotImplementedError 18 | 19 | class BaseLLMEngine(BaseEngine): 20 | @abstractmethod 21 | async def run(self, input, streaming: bool = True, **kwargs): 22 | raise NotImplementedError 23 | 24 | class BaseASREngine(BaseEngine): 25 | @abstractmethod 26 | async def run(self, input: AudioMessage, **kwargs) -> TextMessage: 27 | raise NotImplementedError 28 | 29 | class BaseTTSEngine(BaseEngine): 30 | async def voices(self) -> List[VoiceDesc]: 31 | return [] 32 | 33 | @abstractmethod 34 | async def run(self, input: TextMessage, **kwargs) -> AudioMessage: 35 | raise NotImplementedError -------------------------------------------------------------------------------- /digitalHuman/engine/llm/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from .llmFactory import LLMFactory 8 | 9 | __all__ = ['LLMFactory'] -------------------------------------------------------------------------------- /digitalHuman/engine/llm/llmFactory.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : ttsFactory.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from ..builder import LLMEngines 8 | from ..engineBase import BaseEngine 9 | from typing import List 10 | from yacs.config import CfgNode as CN 11 | from digitalHuman.protocol import ENGINE_TYPE 12 | from digitalHuman.utils import logger 13 | 14 | __all__ = ["LLMFactory"] 15 | 16 | class LLMFactory(): 17 | """ 18 | Large Language Model Factory 19 | """ 20 | @staticmethod 21 | def create(config: CN) -> BaseEngine: 22 | if config.NAME in LLMEngines.list(): 23 | logger.info(f"[LLMFactory] Create engine: {config.NAME}") 24 | return LLMEngines.get(config.NAME)(config, ENGINE_TYPE.LLM) 25 | else: 26 | raise RuntimeError(f"[LLMFactory] Please check config, support LLM: {LLMEngines.list()}") 27 | @staticmethod 28 | def list() -> List: 29 | return LLMEngines.list() -------------------------------------------------------------------------------- /digitalHuman/engine/tts/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from .tencentTTS import TencentApiTts 8 | from .edgeTTS import * 9 | from .difyTTS import * 10 | from .ttsFactory import TTSFactory 11 | # from .aliNLSTTS import AliNLSTTS 12 | 13 | __all__ = ['TTSFactory'] -------------------------------------------------------------------------------- /digitalHuman/engine/tts/difyTTS.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : difyTTS.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | 8 | from ..builder import TTSEngines 9 | from ..engineBase import BaseTTSEngine 10 | import base64 11 | from digitalHuman.protocol import * 12 | from digitalHuman.utils import logger, httpxAsyncClient, mp3ToWav 13 | 14 | __all__ = ["DifyApiTts"] 15 | 16 | 17 | @TTSEngines.register("Dify") 18 | class DifyApiTts(BaseTTSEngine): 19 | async def run(self, input: TextMessage, **kwargs) -> AudioMessage: 20 | # 参数校验 21 | paramters = self.checkParameter(**kwargs) 22 | API_SERVER = paramters["api_server"] 23 | API_KEY = paramters["api_key"] 24 | API_USERNAME = paramters["username"] 25 | 26 | 27 | headers = { 28 | 'Authorization': f'Bearer {API_KEY}' 29 | } 30 | payload = { 31 | "text": input.data, 32 | "user": API_USERNAME, 33 | } 34 | 35 | logger.debug(f"[TTS] Engine input: {input.data}") 36 | response = await httpxAsyncClient.post(API_SERVER + "/text-to-audio", json=payload, headers=headers) 37 | if response.status_code != 200: 38 | raise RuntimeError(f"DifyAPI tts api error: {response.status_code}") 39 | 40 | # TODO:这里Dify只能使用同步接口,主动释放异步事件 41 | # await asyncio.sleep(0) 42 | # resp = httpx.post(API_URL + "/text-to-audio", json=payload, headers=headers) 43 | # await asyncio.sleep(0) 44 | message = AudioMessage( 45 | data=base64.b64encode(mp3ToWav(response.content)).decode('utf-8'), 46 | sampleRate=16000, 47 | sampleWidth=2, 48 | ) 49 | return message -------------------------------------------------------------------------------- /digitalHuman/engine/tts/ttsFactory.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : ttsFactory.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from ..builder import TTSEngines 8 | from ..engineBase import BaseEngine 9 | from typing import List 10 | from yacs.config import CfgNode as CN 11 | from digitalHuman.protocol import ENGINE_TYPE 12 | from digitalHuman.utils import logger 13 | 14 | __all__ = ["TTSFactory"] 15 | 16 | class TTSFactory(): 17 | """ 18 | Text to Speech Factory 19 | """ 20 | @staticmethod 21 | def create(config: CN) -> BaseEngine: 22 | if config.NAME in TTSEngines.list(): 23 | logger.info(f"[TTSFactory] Create engine: {config.NAME}") 24 | return TTSEngines.get(config.NAME)(config, ENGINE_TYPE.TTS) 25 | else: 26 | raise RuntimeError(f"[TTSFactory] Please check config, support TTS: {TTSEngines.list()}, but get {config.NAME}") 27 | @staticmethod 28 | def list() -> List: 29 | return TTSEngines.list() -------------------------------------------------------------------------------- /digitalHuman/server/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from .router import app -------------------------------------------------------------------------------- /digitalHuman/server/api/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/digitalHuman/server/api/__init__.py -------------------------------------------------------------------------------- /digitalHuman/server/api/agent/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author : 一力辉 4 | # @File : __init__.py 5 | 6 | -------------------------------------------------------------------------------- /digitalHuman/server/api/asr/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author : 一力辉 4 | # @File : __init__.py 5 | 6 | -------------------------------------------------------------------------------- /digitalHuman/server/api/common/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author : 一力辉 4 | # @File : __init__.py 5 | 6 | -------------------------------------------------------------------------------- /digitalHuman/server/api/common/common_api_v0.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : common.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from fastapi import APIRouter, WebSocket 8 | from digitalHuman.server.ws import WebsocketManager 9 | from digitalHuman.utils import logger 10 | 11 | 12 | router = APIRouter(prefix="/common/v0") 13 | wsManager = WebsocketManager() 14 | 15 | # ========================= 心跳包 =========================== 16 | @router.websocket("/heartbeat") 17 | async def websocket_heartbeat(websocket: WebSocket): 18 | try: 19 | await wsManager.connect(websocket) 20 | while True: 21 | data = await websocket.receive_text() 22 | if data == "ping": 23 | await wsManager.sendMessage("pong", websocket) 24 | else: 25 | # 暂不处理其它消息格式: 非探活则关闭接口 26 | await wsManager.sendMessage("Received unsupported message", websocket) 27 | wsManager.disconnect(websocket) 28 | except Exception as e: 29 | logger.error(f"[SERVER] websocket_heartbeat: {str(e)}") 30 | wsManager.disconnect(websocket) 31 | -------------------------------------------------------------------------------- /digitalHuman/server/api/llm/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | -------------------------------------------------------------------------------- /digitalHuman/server/api/tts/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author : 一力辉 4 | # @File : __init__.py 5 | 6 | -------------------------------------------------------------------------------- /digitalHuman/server/core/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | -------------------------------------------------------------------------------- /digitalHuman/server/core/api_agent_v0_impl.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : agent_api_v0_impl.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | 8 | from typing import List, Dict 9 | from digitalHuman.agent import AgentPool 10 | from digitalHuman.utils import config 11 | from digitalHuman.protocol import * 12 | from digitalHuman.server.models import AgentEngineInput 13 | 14 | agentPool = AgentPool() 15 | 16 | def get_agent_list() -> List[EngineDesc]: 17 | agents = agentPool.list() 18 | return [agentPool.get(agent).desc() for agent in agents] 19 | 20 | def get_agent_default() -> EngineDesc: 21 | return agentPool.get(config.SERVER.AGENTS.DEFAULT).desc() 22 | 23 | def get_agent_param(name: str) -> List[ParamDesc]: 24 | engine = agentPool.get(name) 25 | return engine.parameters() 26 | 27 | async def create_agent_conversation(name: str, param: Dict) -> str: 28 | engine = agentPool.get(name) 29 | id = await engine.createConversation(**param) 30 | return id 31 | 32 | def agent_infer_stream(user: UserDesc, items: AgentEngineInput): 33 | input = TextMessage(data=items.data) 34 | streamContent = agentPool.get(items.engine).run(input=input, user=user, streaming=True, conversation_id=items.conversation_id, **items.config) 35 | return streamContent -------------------------------------------------------------------------------- /digitalHuman/server/core/api_asr_v0_impl.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : asr_api_v0_impl.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | 8 | from typing import List 9 | from digitalHuman.engine import EnginePool 10 | from digitalHuman.utils import config 11 | from digitalHuman.protocol import ParamDesc, EngineDesc, ENGINE_TYPE, UserDesc, AudioMessage, TextMessage 12 | from digitalHuman.server.models import ASREngineInput 13 | 14 | enginePool = EnginePool() 15 | 16 | def get_asr_list() -> List[EngineDesc]: 17 | engines = enginePool.listEngine(ENGINE_TYPE.ASR) 18 | return [enginePool.getEngine(ENGINE_TYPE.ASR, engine).desc() for engine in engines] 19 | 20 | def get_asr_default() -> EngineDesc: 21 | return enginePool.getEngine(ENGINE_TYPE.ASR, config.SERVER.ENGINES.ASR.DEFAULT).desc() 22 | 23 | def get_asr_param(name: str) -> List[ParamDesc]: 24 | engine = enginePool.getEngine(ENGINE_TYPE.ASR, name) 25 | return engine.parameters() 26 | 27 | async def asr_infer(user: UserDesc, items: ASREngineInput) -> TextMessage: 28 | if items.engine.lower() == "default": 29 | items.engine = config.SERVER.ENGINES.ASR.DEFAULT 30 | input = AudioMessage(data=items.data, sampleRate=items.sampleRate, sampleWidth=items.sampleWidth, type=items.type) 31 | engine = enginePool.getEngine(ENGINE_TYPE.ASR, items.engine) 32 | output: TextMessage = await engine.run(input=input, user=user, **items.config) 33 | return output -------------------------------------------------------------------------------- /digitalHuman/server/core/api_llm_v0_impl.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : api_llm_v0_impl.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | 8 | from typing import List 9 | from digitalHuman.engine import EnginePool 10 | from digitalHuman.utils import config 11 | from digitalHuman.protocol import ParamDesc, EngineDesc, ENGINE_TYPE, UserDesc, AudioMessage, TextMessage 12 | from digitalHuman.server.models import LLMEngineInput 13 | 14 | enginePool = EnginePool() 15 | 16 | def get_llm_list() -> List[EngineDesc]: 17 | engines = enginePool.listEngine(ENGINE_TYPE.LLM) 18 | return [enginePool.getEngine(ENGINE_TYPE.LLM, engine).desc() for engine in engines] 19 | 20 | def get_llm_default() -> EngineDesc: 21 | return enginePool.getEngine(ENGINE_TYPE.LLM, config.SERVER.ENGINES.LLM.DEFAULT).desc() 22 | 23 | def get_llm_param(name: str) -> List[ParamDesc]: 24 | engine = enginePool.getEngine(ENGINE_TYPE.LLM, name) 25 | return engine.parameters() -------------------------------------------------------------------------------- /digitalHuman/server/core/api_tts_v0_impl.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : tts_api_v0_impl.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | 8 | from typing import List 9 | from digitalHuman.engine import EnginePool, BaseTTSEngine 10 | from digitalHuman.utils import config 11 | from digitalHuman.protocol import ParamDesc, EngineDesc, ENGINE_TYPE, UserDesc, AudioMessage, TextMessage, VoiceDesc 12 | from digitalHuman.server.models import TTSEngineInput 13 | 14 | enginePool = EnginePool() 15 | 16 | def get_tts_list() -> List[EngineDesc]: 17 | engines = enginePool.listEngine(ENGINE_TYPE.TTS) 18 | return [enginePool.getEngine(ENGINE_TYPE.TTS, engine).desc() for engine in engines] 19 | 20 | def get_tts_default() -> EngineDesc: 21 | return enginePool.getEngine(ENGINE_TYPE.TTS, config.SERVER.ENGINES.TTS.DEFAULT).desc() 22 | 23 | async def get_tts_voice(name: str) -> List[VoiceDesc]: 24 | engine: BaseTTSEngine = enginePool.getEngine(ENGINE_TYPE.TTS, name) 25 | voices = await engine.voices() 26 | return voices 27 | 28 | def get_tts_param(name: str) -> List[ParamDesc]: 29 | engine = enginePool.getEngine(ENGINE_TYPE.TTS, name) 30 | return engine.parameters() 31 | 32 | async def tts_infer(user: UserDesc, item: TTSEngineInput) -> AudioMessage: 33 | if item.engine.lower() == "default": 34 | item.engine = config.SERVER.ENGINES.TTS.DEFAULT 35 | input = TextMessage(data=item.data) 36 | engine = enginePool.getEngine(ENGINE_TYPE.TTS, item.engine) 37 | output: AudioMessage = await engine.run(input=input, user=user, **item.config) 38 | return output -------------------------------------------------------------------------------- /digitalHuman/server/header.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : header.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from typing import Annotated 8 | from fastapi import Header, Depends 9 | from digitalHuman.protocol import UserDesc 10 | 11 | class _HeaderInfo(UserDesc): 12 | """请求头信息""" 13 | def __init__( 14 | self, 15 | user_id: str = Header("tester", alias="user-id", description="用户ID"), 16 | request_id: str = Header("", alias="request-id", description="请求ID"), 17 | cookie: str = Header("", alias="cookie", description="cookie") 18 | ): 19 | super().__init__(user_id=user_id, request_id=request_id, cookie=cookie) 20 | 21 | def __str__(self): 22 | return f"user-id: {self.user_id} request-id: {self.request_id} cookie: {self.cookie}" 23 | 24 | def __repr__(self): 25 | return self.__str__() 26 | 27 | HeaderInfo = Annotated[_HeaderInfo, Depends(_HeaderInfo)] -------------------------------------------------------------------------------- /digitalHuman/server/models.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : models.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from typing import List, Dict, Union 8 | from pydantic import BaseModel 9 | from digitalHuman.server.reponse import BaseResponse 10 | from digitalHuman.protocol import * 11 | 12 | class EngineListResp(BaseResponse): 13 | data: List[EngineDesc] = [] 14 | 15 | class EngineDefaultResp(BaseResponse): 16 | data: EngineDesc 17 | 18 | class EngineParam(BaseResponse): 19 | data: List[ParamDesc] = [] 20 | 21 | class EngineInput(BaseModel): 22 | engine: str = 'default' 23 | config: Dict = {} 24 | data: Union[str, bytes] 25 | 26 | class AgentEngineInput(EngineInput): 27 | conversation_id: str = "" 28 | 29 | class ASREngineInput(EngineInput, AudioMessage): 30 | pass 31 | 32 | class ASREngineOutput(BaseResponse): 33 | data: str 34 | 35 | class VoiceListResp(BaseResponse): 36 | data: List[VoiceDesc] = [] 37 | 38 | class TTSEngineInput(EngineInput): 39 | pass 40 | 41 | class TTSEngineOutput(BaseResponse, AudioMessage): 42 | pass 43 | 44 | class LLMEngineInput(EngineInput): 45 | pass 46 | 47 | class ConversationInput(BaseModel): 48 | data: Dict = {} 49 | 50 | class ConversationIdResp(BaseResponse): 51 | data: str -------------------------------------------------------------------------------- /digitalHuman/server/reponse.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : reponse.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from typing import Any 8 | from pydantic import BaseModel 9 | from digitalHuman.protocol import RESPONSE_CODE, BaseResponse, eventStreamError, eventStreamDone 10 | from digitalHuman.utils import logger 11 | 12 | 13 | class Response(object): 14 | def __init__(self): 15 | self._response_dict = {} 16 | self.code = RESPONSE_CODE.OK 17 | self.message = "SUCCESS" 18 | 19 | def __setattr__(self, name: str, value: Any): 20 | if name.startswith('_'): 21 | self.__dict__[name] = value 22 | else: 23 | self._response_dict[name] = value 24 | 25 | def __getattr__(self, name: str): 26 | if name.startswith('_'): 27 | return self.__dict__[name] 28 | else: 29 | return self._response_dict[name] 30 | 31 | def _message_log_summary(self, message: str, isError: bool): 32 | self.message = message 33 | if isError: 34 | logger.error(message, exc_info=True) 35 | else: 36 | logger.debug(message) 37 | 38 | def ok(self, message: str): 39 | self.code = RESPONSE_CODE.OK 40 | self._message_log_summary(message, False) 41 | 42 | def error(self, message: str, code: RESPONSE_CODE = RESPONSE_CODE.ERROR): 43 | self.code = code 44 | self._message_log_summary(message, True) 45 | 46 | def validate(self, outItem: BaseModel): 47 | resp_json = outItem.model_validate(self._response_dict) 48 | # return json 49 | return resp_json.model_dump() 50 | 51 | async def streamInteralError(error: str = "Interal Error"): 52 | yield eventStreamError(error) 53 | yield eventStreamDone() -------------------------------------------------------------------------------- /digitalHuman/server/router.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : api.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from fastapi import FastAPI 8 | from fastapi.middleware.cors import CORSMiddleware 9 | from digitalHuman.server.api.common.common_api_v0 import router as commonRouter 10 | from digitalHuman.server.api.asr.asr_api_v0 import router as asrRouter 11 | from digitalHuman.server.api.tts.tts_api_v0 import router as ttsRouter 12 | from digitalHuman.server.api.llm.llm_api_v0 import router as llmRouter 13 | from digitalHuman.server.api.agent.agent_api_v0 import router as agentRouter 14 | from digitalHuman.utils import config 15 | 16 | 17 | __all__ = ["app"] 18 | 19 | app = FastAPI( 20 | title=config.COMMON.NAME, 21 | description=f"This is a cool set of apis for {config.COMMON.NAME}", 22 | version=config.COMMON.VERSION 23 | ) 24 | 25 | app.add_middleware( 26 | CORSMiddleware, 27 | allow_origins=["*"], 28 | allow_credentials=True, 29 | allow_methods=["*"], 30 | allow_headers=["*"], 31 | ) 32 | 33 | GLOABLE_PREFIX = "/adh" 34 | # 路由 35 | app.include_router(commonRouter, prefix=GLOABLE_PREFIX, tags=["COMMON"]) 36 | app.include_router(asrRouter, prefix=GLOABLE_PREFIX, tags=["ASR"]) 37 | app.include_router(ttsRouter, prefix=GLOABLE_PREFIX, tags=["TTS"]) 38 | app.include_router(llmRouter, prefix=GLOABLE_PREFIX, tags=["LLM"]) 39 | app.include_router(agentRouter, prefix=GLOABLE_PREFIX, tags=["AGENT"]) 40 | -------------------------------------------------------------------------------- /digitalHuman/server/ws.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : ws.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from typing import List 8 | from fastapi import WebSocket 9 | 10 | class WebsocketManager: 11 | def __init__(self): 12 | # 存放激活的ws连接对象 13 | self._connections: List[WebSocket] = [] 14 | 15 | async def connect(self, ws: WebSocket) -> None: 16 | # 等待连接 17 | await ws.accept() 18 | # 存储ws连接对象 19 | self._connections.append(ws) 20 | 21 | def disconnect(self, ws: WebSocket) -> None: 22 | # 关闭时 移除ws对象 23 | if ws in self._connections: 24 | self._connections.remove(ws) 25 | 26 | @staticmethod 27 | async def sendMessage(message: str, ws: WebSocket) -> None: 28 | # 发消息 29 | await ws.send_text(message) 30 | 31 | async def broadcast(self, message: str) -> None: 32 | # 广播消息 33 | for connection in self._connections: 34 | await connection.send_text(message) -------------------------------------------------------------------------------- /digitalHuman/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : __init__.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from .configParser import * 8 | from .logger import * 9 | from .registry import * 10 | from .audio import * 11 | from .func import * 12 | from .streamParser import * 13 | 14 | # https://www.cnblogs.com/nanshaobit/p/16060370.html 15 | import httpx 16 | RETRIES = 3 17 | asyncTransport = httpx.AsyncHTTPTransport(retries=RETRIES, verify=False) 18 | httpxAsyncClient = httpx.AsyncClient(timeout=None, transport=asyncTransport) 19 | syncTransport = httpx.HTTPTransport(retries=RETRIES, verify=False) 20 | httpxSyncClient = httpx.Client(timeout=None, transport=syncTransport) -------------------------------------------------------------------------------- /digitalHuman/utils/audio.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : audio.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | 8 | from io import BytesIO 9 | from pydub import AudioSegment 10 | 11 | __all__ = ["mp3ToWav", "wavToMp3"] 12 | 13 | def mp3ToWav(mp3Bytes: bytes) -> bytes: 14 | mp3Data = BytesIO(mp3Bytes) 15 | audio = AudioSegment.from_mp3(mp3Data) 16 | wavData = BytesIO() 17 | audio.export(wavData, format="wav") 18 | wavBytes = wavData.getvalue() 19 | return wavBytes 20 | 21 | def wavToMp3(wavBytes: bytes) -> bytes: 22 | wavData = BytesIO(wavBytes) 23 | audio = AudioSegment.from_wav(wavData) 24 | mp3Data = BytesIO() 25 | audio.export(mp3Data, format="mp3") 26 | mp3Bytes = mp3Data.getvalue() 27 | return mp3Bytes -------------------------------------------------------------------------------- /digitalHuman/utils/env.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : path.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | import os 8 | import warnings 9 | 10 | # ================ 路径 ==================== 11 | ROOT_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 12 | CONFIG_ROOT_PATH = os.path.join(ROOT_PATH, "configs") 13 | CONFIG_TEMPLATE_FILE = os.path.join(CONFIG_ROOT_PATH, "config_template.yaml") 14 | CONFIG_FILE = os.path.join(CONFIG_ROOT_PATH, "config.yaml") 15 | if not os.path.exists(CONFIG_FILE): 16 | CONFIG_FILE = CONFIG_TEMPLATE_FILE 17 | LOG_PATH = os.path.join(ROOT_PATH, "logs") 18 | OUTPUT_PATH = os.path.join(ROOT_PATH, "outputs") 19 | WEB_PATH = os.path.join(ROOT_PATH, "web") 20 | 21 | # Create tmp folder 22 | if not os.path.exists(OUTPUT_PATH): 23 | os.makedirs(OUTPUT_PATH) 24 | warnings.warn(f"Create output path: {OUTPUT_PATH}") -------------------------------------------------------------------------------- /digitalHuman/utils/func.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : utils.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | import re 8 | from uuid import uuid4 9 | from httpx import Response 10 | from typing import Dict 11 | from digitalHuman.utils import logger 12 | 13 | __all__ = ['generateId', 'checkResponse'] 14 | 15 | def generateId() -> str: 16 | return str(uuid4()) 17 | 18 | def checkResponse(response: Response, module: str, note: str = "") -> Dict: 19 | """ 20 | 校验请求响应是否正常 21 | 不正常直接抛错 22 | """ 23 | if response.status_code == 200: 24 | return response.json() 25 | logger.error(f"[{module}] {note}, status code: {response.status_code}, data: {response.text}", exc_info=True) 26 | # 优先提取message错误信息 27 | try: 28 | message = response.json()['message'] 29 | except: 30 | message = response.text 31 | raise RuntimeError(message) 32 | 33 | -------------------------------------------------------------------------------- /digitalHuman/utils/registry.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : registry.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | __all__ = ['Registry'] 8 | 9 | def _register_generic(module_dict, module_name, module): 10 | assert module_name not in module_dict 11 | module_dict[module_name] = module 12 | 13 | class Registry(dict): 14 | def __init__(self, *args, **kwargs): 15 | super(Registry, self).__init__(*args, **kwargs) 16 | 17 | def register(self, module_name=None, module=None): 18 | # used as function call 19 | if module is not None: 20 | name = module_name if module_name else module.__name__ 21 | _register_generic(self, name, module) 22 | return 23 | 24 | # used as decorator 25 | def register_fn(fn): 26 | name = module_name if module_name else fn.__name__ 27 | _register_generic(self, name, fn) 28 | return fn 29 | 30 | return register_fn 31 | 32 | def list(self): 33 | return list(self.keys()) -------------------------------------------------------------------------------- /docker-compose-quickStart.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | adh-nginx: 4 | image: registry.cn-hangzhou.aliyuncs.com/hanran/nginx:latest 5 | ports: 6 | - "8880:80" 7 | # - "8443:443" 8 | volumes: 9 | - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro 10 | restart: always 11 | adh-web: 12 | image: "registry.cn-hangzhou.aliyuncs.com/awesome-digital-human/adh-web:main-latest" 13 | restart: always 14 | pull_policy: always 15 | networks: 16 | - shared_network 17 | - default 18 | # ports: 19 | # - "3000:3000" 20 | volumes: 21 | - ./web/.env:/workspace/.env 22 | # awesome digital human server 23 | adh-api: 24 | image: "registry.cn-hangzhou.aliyuncs.com/awesome-digital-human/adh-api:main-latest" 25 | restart: always 26 | pull_policy: always 27 | networks: 28 | - shared_network 29 | - default 30 | # ports: 31 | # - "8000:8000" 32 | volumes: 33 | - ./configs:/workspace/configs 34 | # network 35 | networks: 36 | shared_network: 37 | driver: bridge 38 | internal: true 39 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | adh-nginx: 4 | image: registry.cn-hangzhou.aliyuncs.com/hanran/nginx:latest 5 | ports: 6 | - "8880:80" 7 | # - "8443:443" 8 | volumes: 9 | - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro 10 | restart: always 11 | adh-web: 12 | build: 13 | context: . 14 | dockerfile: docker/adhWeb.Dockerfile 15 | image: "adh-web:v3.0.0" 16 | restart: always 17 | networks: 18 | - shared_network 19 | - default 20 | # ports: 21 | # - "3000:3000" 22 | volumes: 23 | - ./web/.env:/workspace/.env 24 | # awesome digital human server 25 | adh-api: 26 | build: 27 | context: . 28 | dockerfile: docker/adhServer.Dockerfile 29 | image: "adh-server:v3.0.0" 30 | restart: always 31 | networks: 32 | - shared_network 33 | - default 34 | # ports: 35 | # - "8000:8000" 36 | volumes: 37 | - ./configs:/workspace/configs 38 | # network 39 | networks: 40 | shared_network: 41 | driver: bridge 42 | internal: true -------------------------------------------------------------------------------- /docker/adhServer.Dockerfile: -------------------------------------------------------------------------------- 1 | # FROM python:3.10.15-bookworm 2 | # 使用阿里云镜像 3 | FROM registry.cn-hangzhou.aliyuncs.com/awesome-digital-human/python:3.10.15-bookworm 4 | 5 | 6 | # 中文问题 7 | ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 8 | 9 | # 东八区问题 10 | ENV TZ=Asia/Shanghai 11 | RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone 12 | 13 | # apt修改国内源 14 | RUN sed -i 's@deb.debian.org@repo.huaweicloud.com@g' /etc/apt/sources.list.d/debian.sources 15 | 16 | RUN rm /var/lib/apt/lists/* -vf 17 | 18 | # apt安装依赖库 19 | RUN apt update \ 20 | && apt-get install -y git g++ vim python3-pip ffmpeg\ 21 | && rm -rf /var/lib/apt/lists/* 22 | 23 | # pip设置修改 24 | RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 25 | 26 | # 添加代码 27 | ADD . /workspace 28 | RUN rm -rf /workspace/web/ 29 | WORKDIR /workspace 30 | 31 | # 安装pip依赖库 32 | RUN pip install -r /workspace/requirements.txt 33 | 34 | ENTRYPOINT ["python3", "main.py"] -------------------------------------------------------------------------------- /docker/adhWeb.Dockerfile: -------------------------------------------------------------------------------- 1 | # FROM node:alpine3.19 2 | # 使用阿里云镜像 3 | FROM registry.cn-hangzhou.aliyuncs.com/awesome-digital-human/node:alpine3.19 4 | 5 | # 添加代码 6 | ADD web/ /workspace 7 | WORKDIR /workspace 8 | 9 | # npm换源 10 | RUN npm config set registry https://registry.npmmirror.com 11 | 12 | # 安装Python和pip 13 | RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 14 | RUN apk update && apk add --no-cache python3 make gcc g++ musl-dev linux-headers 15 | 16 | # 安装npm依赖库 17 | RUN npm install -g pnpm \ 18 | && pnpm install \ 19 | && pnpm run build 20 | 21 | ENTRYPOINT ["pnpm", "run", "start"] -------------------------------------------------------------------------------- /docker/nginx/default.conf: -------------------------------------------------------------------------------- 1 | 2 | log_format custom_format '$remote_addr - $remote_user [$time_local] ' 3 | '"$request" $uri $status $body_bytes_sent $request_time ' 4 | '"$http_referer" "$http_user_agent" ' 5 | 'request_id=$request_id user_id=$http_user_id'; 6 | 7 | 8 | server { 9 | listen 80; 10 | server_name _; 11 | 12 | access_log /dev/stdout custom_format; 13 | 14 | keepalive_timeout 60s; 15 | client_header_timeout 60s; 16 | client_body_timeout 60s; 17 | send_timeout 10s; 18 | underscores_in_headers on; 19 | client_max_body_size 50m; 20 | client_body_buffer_size 5m; 21 | # proxy_max_temp_file_size 40960m; 22 | proxy_http_version 1.1; 23 | 24 | real_ip_header X-Real-IP; 25 | set_real_ip_from 127.0.0.1; 26 | set_real_ip_from unix:; 27 | 28 | proxy_set_header Host $host; 29 | proxy_set_header X-Real-IP $remote_addr; 30 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 31 | proxy_set_header X-Forwarded-Proto $scheme; 32 | proxy_set_header Connection ""; # 设置 Connection 为长连接 33 | proxy_cache off; # 关闭缓存 34 | proxy_buffering off; # 关闭代理缓冲 35 | chunked_transfer_encoding on; # 开启分块传输编码 36 | tcp_nopush on; # 开启 TCP NOPUSH 选项,禁止 Nagle 算法 37 | tcp_nodelay on; # 开启 TCP NODELAY 选项,禁止延迟 ACK 算法 38 | 39 | location / { 40 | proxy_pass http://adh-web:3000; 41 | } 42 | 43 | location /adh/ { 44 | proxy_pass http://adh-api:8880; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /docs/Q&A.md: -------------------------------------------------------------------------------- 1 | ## AWESOME-DIGITAL-HUMAN-常见问题 2 | 3 | ### 1. 前端页面提升 *Soul is Death!* 4 | 页面呈现: 5 | ![](../assets/Q&A_1_1.png) 6 | 原因:后端服务未通。 7 | 相关说明: 8 | 前端和后端保持每秒一次的心跳包,心跳包丢失显示该字样,刚启动时可能会闪现一下。前端暴露端口为3000,后端暴露端口为8000,检查后端服务是否启动以及端口是否正确暴露。 9 | 前端请求后端的地址为:http://server_ip:server_port/,其中 server_ip 默认为前端网页地址的hostname, port 默认为8000。可以在`awesome-digital-human-live2d/web/.env`中手动指定后端服务地址和端口。 10 | 对于想在公网通过nginx代理的同学,可以将`/adh`开头的请求反向代理到后端端口,因为后端接口都是`/adh`开头的,另外可以直接通过`http://server_ip:server_port/docs`访问后端接口文档,例如:`http://localhost:8000/docs`。 11 | 12 | ### 2. 是否支持人物定制 13 | 支持,具体参考[开发说明](./docs/developer_instrction.md)中的定制化开发部分。 14 | 15 | ### 3. windows系统docker启动无法访问页面(最新代码不在使用 host network_mode) 16 | windows不支持docker的host模式,修改`docker-compose.yaml`或`docker-compose-quickStart.yaml`(看你用的哪个): 17 | * 删除network字段 18 | * 打开ports的注释 19 | ![](../assets/Q&A_3_1.png) 20 | 21 | ### 4. 浏览器获取麦克风失败 22 | 浏览器在http协议下认为打开摄像头是不安全的,所以需要手动修改下浏览器的设置,这里以chrome为例(其他浏览器应该也有相应的策略): 23 | * 浏览器地址栏输入:`chrome://flags/#unsafely-treat-insecure-origin-as-secure` 24 | * `Insecure origins treated as secure`栏目中填写数字人前端的地址,例如:`http://192.168.1.100:3000` 25 | * 填写域名后选择启用该功能并重新启动即可,再次使用麦克风时会提示是否允许,选择允许即可。 26 | ![](../assets/Q&A_4_1.png) 27 | 28 | ### 5. 系统本地部署dify接口请求返回错误。 29 | 本地部署dify,配置服务后数字人一直返回“dify接口请求错误” 30 | ![](../assets/Q&A_5_1.png) 31 | 原因:服务地址填写的 http://localhost/v1 32 | 修改方式:将localhost修改为你本机的ip地址 -------------------------------------------------------------------------------- /docs/deploy_instrction.md: -------------------------------------------------------------------------------- 1 | ## AWESOME-DIGITAL-HUMAN-部署指南 2 | 3 | 推荐使用容器部署,本地开发使用裸机开发部署 4 | 5 | ### 系统要求 6 | 请确保您的机器满足以下最低系统要求: 7 | * CPU >= 2 Core 8 | * RAM >= 2GB 9 | 10 | ### 裸机开发部署 - Ubuntu示例 11 | > 基础环境 12 | * python3.10(使用其他版本以及对应的库理论上也是可以的) 13 | * node 推荐 20 14 | > 运行 15 | * 源码下载 16 | ```bash 17 | # 下载源码 18 | git clone https://github.com/wan-h/awesome-digital-human-live2d.git 19 | ``` 20 | * 运行server 21 | ```bash 22 | # 安装依赖 23 | pip install -r requirements.txt 24 | # 安装ffmpeg 25 | sudo apt install ffmpeg 26 | # 启动 27 | python main.py 28 | ``` 29 | * 运行web 30 | ```bash 31 | cd web 32 | # 使用高性能的npm 33 | npm install -g pnpm 34 | # 安装依赖 35 | pnpm install 36 | # 编译发布版本 37 | pnpm run build 38 | # 启动 39 | pnpm run start 40 | ``` 41 | 42 | ### 容器部署(体验首选,推荐) 43 | 无需本地构建, 直接拉取阿里云已构建镜像 44 | > 基础环境 45 | * 安装[docker-compose](https://docs.docker.com/compose/install/) 46 | > 运行 47 | * 启动容器 48 | ```bash 49 | # 项目根目录下执行 50 | docker-compose -f docker-compose-quickStart.yaml up -d 51 | ``` 52 | 53 | ### 容器部署(容器开发首选) 54 | > 基础环境 55 | * 安装[docker-compose](https://docs.docker.com/compose/install/) 56 | > 运行 57 | * 启动容器 58 | ```bash 59 | # 项目根目录下执行 60 | docker-compose up --build -d 61 | ``` 62 | 63 | ### 访问页面 64 | 本地浏览器访问路径: 65 | * 源码部署: http://localhost:3000 66 | * 容器部署: http://localhost:8880 67 | 非本地浏览器访问路径: 68 | * 源码部署: http://{部署服务器IP}:3000 69 | * 容器部署: http://{部署服务器IP}:8880 70 | 71 | ### 设置 72 | 参考[操作指南](https://light4ai.feishu.cn/docx/XmGFd5QJwoBdDox8M7zcAcRJnje)中的设置部分 73 | 74 | ### 其他说明 75 | * 若需要修改端口则需要修改docker-compose文件中nginx的映射端口以及web中[.env](../web/.env)的启动端口`NEXT_PUBLIC_SERVER_PORT` -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : main.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | from digitalHuman.utils import logger, config 8 | from digitalHuman.bin import runServer 9 | 10 | def showEnv(): 11 | logger.info(f"[System] Welcome to Awesome digitalHuman System") 12 | logger.info(f"[System] Runing config:\n{config}") 13 | 14 | 15 | if __name__ == '__main__': 16 | showEnv() 17 | runServer() 18 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | edge-tts>=7.0.2 2 | emoji>=2.14.0 3 | fastapi>=0.115.5 4 | greenlet>=3.1.1 5 | httpx>=0.27.2 6 | # numpy>=2.0.2 7 | openai>=1.63.0 8 | psycopg>=3.2.3 9 | psycopg-binary>=3.2.3 10 | pydub>=0.25.1 11 | pytest>=8.3.3 12 | pytest_asyncio>=0.24.0 13 | python-multipart>=0.0.19 14 | websockets>=14.1 15 | requests>=2.32.3 16 | uvicorn>=0.32.1 17 | wave>=0.0.2 18 | yacs>=0.1.8 19 | # git+https://github.com/aliyun/alibabacloud-nls-python-sdk.git@master#egg=alibabacloud-nls-python-sdk -------------------------------------------------------------------------------- /test/conftest.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : configtest.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | import os, sys 8 | sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 9 | from httpx import AsyncClient, ASGITransport 10 | import pytest, pytest_asyncio 11 | from digitalHuman.server import app 12 | 13 | 14 | ROOT_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 15 | TEST_PATH = os.path.join(ROOT_PATH, "test") 16 | TEST_SRC_PATH = os.path.join(TEST_PATH, "src") 17 | TEST_SRC_AUDIO_PATH = os.path.join(TEST_SRC_PATH, "audio") 18 | 19 | # 初始化enginePool 20 | from digitalHuman.engine import EnginePool 21 | from digitalHuman.utils import config 22 | enginePool = EnginePool() 23 | enginePool.setup(config.SERVER.ENGINES) 24 | 25 | # 初始化agentPool 26 | from digitalHuman.agent import AgentPool 27 | agentPool = AgentPool() 28 | agentPool.setup(config.SERVER.AGENTS) 29 | 30 | @pytest.fixture 31 | def version() -> str: 32 | return "v0" 33 | 34 | @pytest.fixture 35 | def wavAudioZh() -> str: 36 | return os.path.join(TEST_SRC_AUDIO_PATH, "zh.wav") 37 | 38 | # pytest使用同一个事件循环 39 | # https://pytest-asyncio.readthedocs.io/en/latest/how-to-guides/run_session_tests_in_same_loop.html# 40 | def pytest_collection_modifyitems(items): 41 | pytest_asyncio_tests = (item for item in items if pytest_asyncio.is_async_test(item)) 42 | session_scope_marker = pytest.mark.asyncio(scope="session") 43 | for async_test in pytest_asyncio_tests: 44 | async_test.add_marker(session_scope_marker, append=False) 45 | 46 | @pytest_asyncio.fixture() 47 | def client() -> AsyncClient: 48 | client = AsyncClient(transport=ASGITransport(app=app), base_url="http://test") 49 | return client -------------------------------------------------------------------------------- /test/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | asyncio_mode = auto 3 | 4 | [pytest-watch] 5 | ignore = .*venv -------------------------------------------------------------------------------- /test/src/audio/en.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/test/src/audio/en.wav -------------------------------------------------------------------------------- /test/src/audio/zh.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/test/src/audio/zh.wav -------------------------------------------------------------------------------- /test/test_agent_api.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : test_asr_api.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | import pytest 8 | from httpx import AsyncClient 9 | 10 | 11 | class Test_AGENT_API(): 12 | # ======================== list ========================== 13 | @pytest.mark.asyncio(scope="session") 14 | async def test_list(self, version: str, client: AsyncClient): 15 | url = f"/adh/agent/{version}/list" 16 | resp = await client.get(url) 17 | assert resp.status_code == 200 18 | resp = resp.json() 19 | assert resp["code"] == 0 20 | assert len(resp["data"]) >= 1 21 | assert 'RepeaterAgent' in resp["data"] 22 | 23 | # ====================== repeater ======================== 24 | @pytest.mark.asyncio(scope="session") 25 | async def test_repeater_text_infer(self, version: str, client: AsyncClient): 26 | url = f"/adh/agent/{version}/infer" 27 | item = { 28 | "engine": "RepeaterAgent", 29 | "settings": {}, 30 | "data": "你好", 31 | } 32 | resp = await client.post(url, json=item) 33 | assert resp.status_code == 200 34 | resp = resp.json() 35 | assert resp["code"] == 0 36 | assert resp["data"] == "你好" -------------------------------------------------------------------------------- /test/test_asr_api.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : test_asr_api.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | import base64 8 | import pytest 9 | from httpx import AsyncClient 10 | 11 | class Test_ASR_API(): 12 | @pytest.mark.asyncio(scope="session") 13 | async def test_goodleAPI_infer(self, version: str, client: AsyncClient, wavAudioZh: str): 14 | url = f"/adh/asr/{version}/infer" 15 | with open(wavAudioZh, "rb") as f: 16 | data = base64.b64encode(f.read()).decode('utf-8') 17 | item = { 18 | "engine": "GoogleAPI", 19 | "data": data, 20 | "format": "wav", 21 | "sampleRate": "16000", 22 | "sampleWidth": 2, 23 | } 24 | resp = await client.post(url, json=item) 25 | assert resp.status_code == 200 26 | resp = resp.json() 27 | assert resp["code"] == 0 28 | assert resp["data"] == "我认为跑步最重要的就是给我带来了身体健康" -------------------------------------------------------------------------------- /test/test_common_api.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : test_common_api.py 4 | @Author : 一力辉 5 | ''' 6 | import pytest 7 | from starlette.testclient import TestClient 8 | from httpx import AsyncClient 9 | 10 | from digitalHuman.server import app 11 | 12 | 13 | class Test_COMMON_API(): 14 | # @pytest.mark.asyncio(scope="session") 15 | # async def test_heartbeat(self, version: str, client: AsyncClient): 16 | # url = f"/adh/common/{version}/heartbeat" 17 | # resp = await client.get(url) 18 | # assert resp.status_code == 200 19 | # resp = resp.json() 20 | # assert resp["code"] == 0 21 | # assert resp["data"] == 1 22 | 23 | @pytest.mark.asyncio(scope="session") 24 | async def test_websocket_heartbeat(self, version: str, client: AsyncClient): 25 | client = TestClient(app) 26 | with client.websocket_connect(f"/adh/common/{version}/heartbeat") as ws: 27 | ws.send_text("ping") 28 | data = ws.receive_text() 29 | assert data == "pong" 30 | 31 | -------------------------------------------------------------------------------- /test/test_llm_api.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : test_asr_api.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | import pytest 8 | from httpx import AsyncClient 9 | 10 | class Test_LLM_API(): 11 | # @pytest.mark.asyncio(scope="session") 12 | # async def test_baiduAPI_infer(self, version: str, client: AsyncClient): 13 | # url = f"/adh/llm/{version}/infer" 14 | # item = { 15 | # "engine": "BaiduAPI", 16 | # "data": "你好", 17 | # } 18 | # resp = await client.post(url, json=item) 19 | # assert resp.status_code == 200 20 | # resp = resp.json() 21 | # print("=" * 100) 22 | # print(resp) 23 | # assert resp["code"] == 0 24 | # assert len(resp["data"]) > 3 25 | pass -------------------------------------------------------------------------------- /test/test_tts_api.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | @File : test_asr_api.py 4 | @Author : 一力辉 5 | ''' 6 | 7 | import os 8 | import base64 9 | import pytest 10 | from httpx import AsyncClient 11 | from digitalHuman.utils.env import OUTPUT_PATH 12 | 13 | 14 | class Test_TTS_API(): 15 | # @pytest.mark.asyncio(scope="session") 16 | # async def test_baiduAPI_infer(self, version: str, client: AsyncClient): 17 | # url = f"/adh/tts/{version}/infer" 18 | # item = { 19 | # "engine": "BaiduAPI", 20 | # "data": "欢迎来到数字人系统", 21 | # } 22 | # resp = await client.post(url, json=item) 23 | # assert resp.status_code == 200 24 | # resp = resp.json() 25 | # assert resp["code"] == 0 26 | # assert resp["format"] == "wav" 27 | # assert resp["sampleRate"] == 16000 28 | # assert resp["sampleWidth"] == 2 29 | # audio = base64.b64decode(resp["data"]) 30 | # assert len(audio) > 10 31 | # with open(os.path.join(OUTPUT_PATH, "test_baiduAPI_infer." + resp["format"]), "wb") as f: 32 | # f.write(audio) 33 | 34 | @pytest.mark.asyncio(scope="session") 35 | async def test_edgeAPI_infer(self, version, client): 36 | url = f"/adh/tts/{version}/infer" 37 | item = { 38 | "engine": "EdgeAPI", 39 | "data": "欢迎来到数字人系统", 40 | } 41 | resp = await client.post(url, json=item) 42 | assert resp.status_code == 200 43 | resp = resp.json() 44 | assert resp["code"] == 0 45 | assert resp["format"] == "wav" 46 | assert resp["sampleRate"] == 16000 47 | assert resp["sampleWidth"] == 2 48 | audio = base64.b64decode(resp["data"]) 49 | assert len(audio) > 10 50 | with open(os.path.join(OUTPUT_PATH, "test_edgeAPI_infer." + resp["format"]), "wb") as f: 51 | f.write(audio) -------------------------------------------------------------------------------- /test/test_ws_web.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 聊天1 6 | 7 | 8 |

User1 Chat

9 |
10 | 11 | 12 |
13 | 15 | 16 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /web/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | .next 3 | node_modules 4 | dist 5 | -------------------------------------------------------------------------------- /web/.env: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_SERVER_IP="127.0.0.1" 2 | NEXT_PUBLIC_SERVER_PROTOCOL="http" 3 | NEXT_PUBLIC_SERVER_PORT="8880" 4 | NEXT_PUBLIC_SERVER_VERSION="v0" 5 | NEXT_PUBLIC_SERVER_MODE="prod" -------------------------------------------------------------------------------- /web/.env.development.local: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_SERVER_IP="127.0.0.1" 2 | NEXT_PUBLIC_SERVER_PROTOCOL="http" 3 | NEXT_PUBLIC_SERVER_PORT="8880" 4 | NEXT_PUBLIC_SERVER_VERSION="v0" 5 | NEXT_PUBLIC_SERVER_MODE="dev" -------------------------------------------------------------------------------- /web/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next/core-web-vitals", "next/typescript"], 3 | "rules": { 4 | "no-unused-vars": "off", 5 | "@typescript-eslint/no-empty-object-type": "warn", 6 | "@typescript-eslint/no-unused-vars": ["off"], 7 | "@typescript-eslint/no-explicit-any": ["off"] 8 | } 9 | } -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | dist 23 | 24 | # misc 25 | .DS_Store 26 | *.pem 27 | 28 | # debug 29 | npm-debug.log* 30 | yarn-debug.log* 31 | yarn-error.log* 32 | 33 | 34 | # vercel 35 | .vercel 36 | 37 | # typescript 38 | *.tsbuildinfo 39 | next-env.d.ts 40 | 41 | # IDE 42 | .vscode -------------------------------------------------------------------------------- /web/.npmrc: -------------------------------------------------------------------------------- 1 | public-hoist-pattern[]=*@heroui/* -------------------------------------------------------------------------------- /web/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine3.19 2 | # 使用阿里云镜像 3 | # FROM registry.cn-hangzhou.aliyuncs.com/ai-romantic/node:alpine3.19 4 | 5 | # 添加代码 6 | ADD . /workspace 7 | WORKDIR /workspace 8 | 9 | # npm换源 10 | # RUN npm config set registry https://registry.npmmirror.com 11 | 12 | # 安装Python和pip 13 | # RUN sed -i 's#https\?://dl-cdn.alpinelinux.org/alpine#https://mirrors.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories 14 | RUN apk update && apk add --no-cache python3 make gcc g++ musl-dev linux-headers 15 | 16 | # 安装npm依赖库 17 | RUN npm install -g pnpm \ 18 | && pnpm install \ 19 | && pnpm run build 20 | 21 | ENTRYPOINT ["pnpm", "run", "start"] -------------------------------------------------------------------------------- /web/README.md: -------------------------------------------------------------------------------- 1 | # Official Website 2 | 3 | ## 启动 4 | ### 本地启动 5 | ```bash 6 | pnpm install 7 | # 开发模式 8 | pnpm run dev 9 | # 生产模式 10 | pnpm run build 11 | pnpm run start 12 | ``` 13 | ### Docker 启动 14 | ```bash 15 | # 构建镜像 16 | docker build -t registry.cn-hangzhou.aliyuncs.com/ai-romantic/official-website:v0.0.1 . 17 | # 启动镜像 18 | docker run -d --restart=always --name official-website -p 3000:3000 registry.cn-hangzhou.aliyuncs.com/ai-romantic/official-website:v0.0.1 19 | ``` -------------------------------------------------------------------------------- /web/app/(products)/sentio/app.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { useEffect, useState } from "react"; 4 | import { Live2d } from './components/live2d'; 5 | import ChatBot from './components/chatbot'; 6 | import { Header } from './components/header'; 7 | import { useAppConfig } from "./hooks/appConfig"; 8 | import { Spinner } from "@heroui/react"; 9 | 10 | 11 | export default function App() { 12 | const { setAppConfig } = useAppConfig(); 13 | const [ isLoading, setIsLoading ] = useState(true); 14 | 15 | // 初始化应用 16 | useEffect(() => { 17 | setAppConfig(null); 18 | setIsLoading(false); 19 | }, []) 20 | 21 | return ( 22 |
23 | { 24 | isLoading ? 25 | 26 | : 27 |
28 |
29 | 30 |
31 | } 32 | 33 |
34 | ); 35 | } -------------------------------------------------------------------------------- /web/app/(products)/sentio/components/chatbot/index.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { useEffect, memo } from "react"; 4 | import { CHAT_MODE, APP_TYPE } from "@/lib/protocol"; 5 | import { ChatRecord } from "./record"; 6 | import { ChatInput, ChatVadInput } from "./input"; 7 | import { 8 | useSentioChatModeStore, 9 | useSentioThemeStore 10 | } from "@/lib/store/sentio"; 11 | 12 | function FreedomChatBot() { 13 | const { chatMode } = useSentioChatModeStore(); 14 | return ( 15 |
16 | 17 | {chatMode == CHAT_MODE.IMMSERSIVE ? : } 18 |
19 | ) 20 | } 21 | 22 | function ChatBot() { 23 | const { theme } = useSentioThemeStore(); 24 | switch (theme) { 25 | case APP_TYPE.FREEDOM: 26 | return 27 | default: 28 | return 29 | } 30 | } 31 | 32 | export default memo(ChatBot); -------------------------------------------------------------------------------- /web/app/(products)/sentio/components/header.tsx: -------------------------------------------------------------------------------- 1 | import { LogoBar } from "@/components/header/logo"; 2 | import { Items } from "../items"; 3 | import { Switch, addToast } from "@heroui/react"; 4 | import { UserMinusIcon, UserPlusIcon } from "@heroicons/react/24/solid"; 5 | import { useSentioChatModeStore, useChatRecordStore, useSentioAsrStore } from "@/lib/store/sentio"; 6 | import { CHAT_MODE } from "@/lib/protocol"; 7 | import { useTranslations } from 'next-intl'; 8 | 9 | function ChatModeSwitch() { 10 | const t = useTranslations('Products.sentio'); 11 | const { chatMode, setChatMode } = useSentioChatModeStore(); 12 | const { enable } = useSentioAsrStore(); 13 | const { clearChatRecord } = useChatRecordStore(); 14 | const onSelect = (isSelected: boolean) => { 15 | if (enable) { 16 | setChatMode(isSelected ? CHAT_MODE.IMMSERSIVE : CHAT_MODE.DIALOGUE) 17 | clearChatRecord(); 18 | } else { 19 | addToast({ 20 | title: t('asrEnableTip'), 21 | color: "warning" 22 | }) 23 | } 24 | } 25 | return ( 26 | } 29 | endContent={} 30 | isSelected={chatMode == CHAT_MODE.IMMSERSIVE} 31 | onValueChange={onSelect} 32 | /> 33 | ) 34 | } 35 | 36 | export function Header() { 37 | return ( 38 |
39 | 40 |
41 | 42 | 43 |
44 |
45 | ) 46 | } -------------------------------------------------------------------------------- /web/app/(products)/sentio/hooks/live2d.ts: -------------------------------------------------------------------------------- 1 | import { Live2dManager } from "@/lib/live2d/live2dManager"; 2 | import { useSentioLive2DStore } from "@/lib/store/sentio"; 3 | import { ResourceModel } from "@/lib/protocol"; 4 | 5 | export const useLive2D = () => { 6 | const { ready, setReady } = useSentioLive2DStore(); 7 | 8 | const checkLive2DReady = () => { 9 | if (Live2dManager.getInstance().isReady()) { 10 | setReady(true); 11 | } else { 12 | setTimeout(checkLive2DReady, 1000); 13 | } 14 | } 15 | 16 | const setLive2dCharacter = (character: ResourceModel| null) => { 17 | Live2dManager.getInstance().changeCharacter(character); 18 | if (character != null) { 19 | setReady(false); 20 | checkLive2DReady(); 21 | } 22 | 23 | }; 24 | 25 | return { 26 | setLive2dCharacter, 27 | ready, 28 | }; 29 | } -------------------------------------------------------------------------------- /web/app/(products)/sentio/page.tsx: -------------------------------------------------------------------------------- 1 | import App from "./app"; 2 | 3 | export default async function Page() { 4 | return ( 5 | 6 | ); 7 | } -------------------------------------------------------------------------------- /web/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/app/favicon.ico -------------------------------------------------------------------------------- /web/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import {Inter} from 'next/font/google'; 3 | import { NextIntlClientProvider } from 'next-intl'; 4 | import { getLocale, getMessages } from 'next-intl/server'; 5 | import {Providers} from "./providers"; 6 | import { getSrcPath } from '@/lib/path'; 7 | import type { Metadata } from 'next'; 8 | import "@/styles/globals.css"; 9 | // export const dynamic = 'error' 10 | const inter = Inter({subsets: ['latin']}); 11 | 12 | export const metadata: Metadata = { 13 | title: '沐光而行', 14 | icons: 'favicon.icon', 15 | }; 16 | 17 | export default async function RootLayout({ 18 | children, 19 | }: Readonly<{ 20 | children: React.ReactNode; 21 | }>) { 22 | 23 | const locale = await getLocale(); 24 | const messages = await getMessages(); 25 | 26 | return ( 27 | 28 | 29 | 38 | 40 | 50 | 51 | -------------------------------------------------------------------------------- /web/hooks/request.ts: -------------------------------------------------------------------------------- 1 | import { useRef, useEffect } from "react"; 2 | 3 | export function useRequestController() { 4 | const controller = useRef(null); 5 | 6 | const cq = () => { 7 | if (controller.current) { 8 | controller.current.abort(); 9 | } 10 | controller.current = new AbortController(); 11 | return controller.current.signal; 12 | } 13 | 14 | const cr = () => { 15 | if (controller.current) { 16 | controller.current = null; 17 | } 18 | } 19 | 20 | useEffect(() => { 21 | // 清理函数,组件卸载时取消请求 22 | return () => { 23 | if (controller.current) { 24 | controller.current.abort(); 25 | controller.current = null; 26 | } 27 | }; 28 | }, []); 29 | 30 | return { 31 | cq, cr 32 | } 33 | } -------------------------------------------------------------------------------- /web/i18n/config.ts: -------------------------------------------------------------------------------- 1 | export type Locale = (typeof locales)[number]; 2 | 3 | export const locales = ['zh', 'en'] as const; 4 | export const defaultLocale: Locale = 'zh'; -------------------------------------------------------------------------------- /web/i18n/request.ts: -------------------------------------------------------------------------------- 1 | import {getRequestConfig} from 'next-intl/server'; 2 | import {getUserLocale} from '@/lib/locale'; 3 | 4 | export default getRequestConfig(async () => { 5 | const locale = await getUserLocale(); 6 | 7 | return { 8 | locale, 9 | messages: (await import(`./locales/${locale}.json`)).default 10 | }; 11 | }); -------------------------------------------------------------------------------- /web/lib/font.ts: -------------------------------------------------------------------------------- 1 | import localFont from "next/font/local"; 2 | 3 | export const hongLei = localFont({ 4 | src: "../styles/fonts/honglei.ttf" 5 | }); 6 | 7 | export const yunFeng = localFont({ 8 | src: "../styles/fonts/yunFeng.ttf" 9 | }); -------------------------------------------------------------------------------- /web/lib/live2d/Core/LICENSE.md: -------------------------------------------------------------------------------- 1 | ## Live2D Proprietary Software License 2 | 3 | Live2D Cubism Core is available under Live2D Proprietary Software License. 4 | 5 | * [Live2D Proprietary Software License Agreement](https://www.live2d.com/eula/live2d-proprietary-software-license-agreement_en.html) 6 | * [Live2D Proprietary Software 使用許諾契約書](https://www.live2d.com/eula/live2d-proprietary-software-license-agreement_jp.html) 7 | * [Live2D Proprietary Software 使用授权协议](https://www.live2d.com/eula/live2d-proprietary-software-license-agreement_cn.html) 8 | -------------------------------------------------------------------------------- /web/lib/live2d/Core/README.ja.md: -------------------------------------------------------------------------------- 1 | [English](README.md) / [日本語](README.ja.md) 2 | 3 | --- 4 | 5 | # Live2D Cubism Core 6 | 7 | このフォルダーには、JavaScriptまたはTypeScriptアプリケーションを開発するためのコアライブラリファイルが含まれています。 8 | 9 | 10 | ## ファイルリスト 11 | 12 | ### live2dcubismcore.d.ts 13 | 14 | このファイルには、`live2dcubismcore.js`に関するTypeScriptの型情報が含まれています。 15 | TypeScriptで開発する場合は、このファイルを`live2dcubismcore.js`とともに使用してください。 16 | 17 | ### live2dcubismcore.js 18 | 19 | このファイルには、CubismCoreの機能といくつかのラッパーが含まれています。 20 | JavaScriptで開発する場合は、このファイルを使用してください。 21 | 22 | ### live2dcubismcore.js.map 23 | 24 | このファイルは、`live2dcubismcore.d.ts`と`live2dcubismcore.js`の間のソースマップです。 25 | デバッグ時にこのファイルを使用します。 26 | 27 | ### live2dcubismcore.min.js 28 | 29 | このファイルは、`live2dcubismcore.js`のminify版です。 30 | このファイルを本番環境で使用します。 31 | -------------------------------------------------------------------------------- /web/lib/live2d/Core/README.md: -------------------------------------------------------------------------------- 1 | [English](README.md) / [日本語](README.ja.md) 2 | 3 | --- 4 | 5 | # Live2D Cubism Core 6 | 7 | This folder contains core library files for developing JavaScript or TypeScript applications. 8 | 9 | 10 | ## File List 11 | 12 | ### live2dcubismcore.d.ts 13 | 14 | This file contains typescript type information about `live2dcubismcore.js`. 15 | Use this file with `live2dcubismcore.js` when developing with TypeScript. 16 | 17 | ### live2dcubismcore.js 18 | 19 | This file contains Cubism Core features and some wrapper features. 20 | Use this file when developing with JavaScript. 21 | 22 | ### live2dcubismcore.js.map 23 | 24 | This file is the source map between `live2dcubismcore.d.ts` and `live2dcubismcore.js`. 25 | Use this file when debugging. 26 | 27 | ### live2dcubismcore.min.js 28 | 29 | This file is the minified version of `live2dcubismcore.js`. 30 | Use this file in production. 31 | -------------------------------------------------------------------------------- /web/lib/live2d/Core/RedistributableFiles.txt: -------------------------------------------------------------------------------- 1 | The following is a list of files available for redistribution 2 | under the terms of the Live2D Proprietary Software License Agreement: 3 | 4 | - live2dcubismcore.d.ts 5 | - live2dcubismcore.js 6 | - live2dcubismcore.min.js 7 | -------------------------------------------------------------------------------- /web/lib/live2d/Framework/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "build": "tsc", 5 | "test": "tsc --noEmit", 6 | "lint": "eslint src --ext .ts", 7 | "lint:fix": "eslint src --ext .ts --fix", 8 | "clean": "rimraf dist" 9 | }, 10 | "devDependencies": { 11 | "@typescript-eslint/eslint-plugin": "^8.18.0", 12 | "@typescript-eslint/parser": "^8.18.0", 13 | "eslint": "^8.57.0", 14 | "eslint-config-prettier": "^9.1.0", 15 | "eslint-plugin-prettier": "^5.2.1", 16 | "prettier": "^3.4.2", 17 | "rimraf": "^6.0.1", 18 | "typescript": "^5.7.2" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web/lib/live2d/Framework/src/cubismframeworkconfig.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright(c) Live2D Inc. All rights reserved. 3 | * 4 | * Use of this source code is governed by the Live2D Open Software license 5 | * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. 6 | */ 7 | 8 | //======================================================== 9 | // ログ出力関数の設定 10 | //======================================================== 11 | 12 | //---------- ログ出力レベル 選択項目 定義 ---------- 13 | // 詳細ログ出力設定 14 | export const CSM_LOG_LEVEL_VERBOSE = 0; 15 | // デバッグログ出力設定 16 | export const CSM_LOG_LEVEL_DEBUG = 1; 17 | // Infoログ出力設定 18 | export const CSM_LOG_LEVEL_INFO = 2; 19 | // 警告ログ出力設定 20 | export const CSM_LOG_LEVEL_WARNING = 3; 21 | // エラーログ出力設定 22 | export const CSM_LOG_LEVEL_ERROR = 4; 23 | // ログ出力オフ設定 24 | export const CSM_LOG_LEVEL_OFF = 5; 25 | 26 | /** 27 | * ログ出力レベル設定。 28 | * 29 | * 強制的にログ出力レベルを変える時に定義を有効にする。 30 | * CSM_LOG_LEVEL_VERBOSE ~ CSM_LOG_LEVEL_OFF を選択する。 31 | */ 32 | export const CSM_LOG_LEVEL: number = CSM_LOG_LEVEL_VERBOSE; 33 | -------------------------------------------------------------------------------- /web/lib/live2d/Framework/src/icubismallcator.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright(c) Live2D Inc. All rights reserved. 3 | * 4 | * Use of this source code is governed by the Live2D Open Software license 5 | * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. 6 | */ 7 | 8 | /** 9 | * メモリアロケーションを抽象化したクラス 10 | * 11 | * メモリ確保・解放処理をプラットフォーム側で実装して 12 | * フレームワークから呼び出すためのインターフェース 13 | */ 14 | export abstract class ICubismAllocator { 15 | /** 16 | * アラインメント制約なしのヒープ・メモリーを確保します 17 | * 18 | * @param size 確保するバイト数 19 | * @return 成功すると割り当てられたメモリのアドレス。そうでなければ'0'を返す 20 | */ 21 | public abstract allocate(size: number): any; 22 | 23 | /** 24 | * アラインメント制約なしのヒープ・メモリーを解放します。 25 | * 26 | * @param memory 解放するメモリのアドレス 27 | */ 28 | public abstract deallocate(memory: any): void; 29 | 30 | /** 31 | * アラインメント制約有のヒープ・メモリーを確保します。 32 | * @param size 確保するバイト数 33 | * @param alignment メモリーブロックのアラインメント幅 34 | * @return 成功すると割り当てられたメモリのアドレス。そうでなければ'0'を返す 35 | */ 36 | public abstract allocateAligned(size: number, alignment: number): any; 37 | 38 | /** 39 | * アラインメント制約ありのヒープ・メモリーを解放します。 40 | * @param alignedMemory 解放するメモリのアドレス 41 | */ 42 | public abstract deallocateAligned(alignedMemory: any): void; 43 | } 44 | 45 | // Namespace definition for compatibility. 46 | import * as $ from './icubismallcator'; 47 | // eslint-disable-next-line @typescript-eslint/no-namespace 48 | export namespace Live2DCubismFramework { 49 | export const ICubismAllocator = $.ICubismAllocator; 50 | export type ICubismAllocator = $.ICubismAllocator; 51 | } 52 | -------------------------------------------------------------------------------- /web/lib/live2d/Framework/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "moduleResolution": "node", 5 | "esModuleInterop": true, 6 | "experimentalDecorators": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "outDir": "./dist", 9 | "declaration": true, 10 | "declarationMap": true, 11 | "sourceMap": true, 12 | "emitDecoratorMetadata": true, 13 | "noImplicitAny": true, 14 | "useUnknownInCatchVariables": true 15 | }, 16 | "include": [ 17 | "src/**/*.ts", 18 | "../Core/*.ts" 19 | ], 20 | "exclude": [ 21 | "node_modules", 22 | "dist" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /web/lib/live2d/src/lappglmanager.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright(c) Live2D Inc. All rights reserved. 3 | * 4 | * Use of this source code is governed by the Live2D Open Software license 5 | * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. 6 | */ 7 | 8 | /** 9 | * Cubism SDKのサンプルで使用するWebGLを管理するクラス 10 | */ 11 | export class LAppGlManager { 12 | public constructor() { 13 | this._gl = null; 14 | } 15 | 16 | public initialize(canvas: HTMLCanvasElement): boolean { 17 | // glコンテキストを初期化 18 | this._gl = canvas.getContext('webgl2'); 19 | 20 | if (!this._gl) { 21 | // gl初期化失敗 22 | alert('Cannot initialize WebGL. This browser does not support.'); 23 | this._gl = null; 24 | // document.body.innerHTML = 25 | // 'This browser does not support the <canvas> element.'; 26 | return false; 27 | } 28 | return true; 29 | } 30 | 31 | /** 32 | * 解放する。 33 | */ 34 | public release(): void {} 35 | 36 | public getGl(): WebGLRenderingContext | WebGL2RenderingContext { 37 | return this._gl; 38 | } 39 | 40 | private _gl: WebGLRenderingContext | WebGL2RenderingContext = null; 41 | } 42 | -------------------------------------------------------------------------------- /web/lib/live2d/src/lapppal.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright(c) Live2D Inc. All rights reserved. 3 | * 4 | * Use of this source code is governed by the Live2D Open Software license 5 | * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. 6 | */ 7 | 8 | /** 9 | * プラットフォーム依存機能を抽象化する Cubism Platform Abstraction Layer. 10 | * 11 | * ファイル読み込みや時刻取得等のプラットフォームに依存する関数をまとめる。 12 | */ 13 | export class LAppPal { 14 | /** 15 | * ファイルをバイトデータとして読みこむ 16 | * 17 | * @param filePath 読み込み対象ファイルのパス 18 | * @return 19 | * { 20 | * buffer, 読み込んだバイトデータ 21 | * size ファイルサイズ 22 | * } 23 | */ 24 | public static loadFileAsBytes( 25 | filePath: string, 26 | callback: (arrayBuffer: ArrayBuffer, size: number) => void 27 | ): void { 28 | fetch(filePath) 29 | .then(response => response.arrayBuffer()) 30 | .then(arrayBuffer => callback(arrayBuffer, arrayBuffer.byteLength)); 31 | } 32 | 33 | /** 34 | * デルタ時間(前回フレームとの差分)を取得する 35 | * @return デルタ時間[ms] 36 | */ 37 | public static getDeltaTime(): number { 38 | return this.deltaTime; 39 | } 40 | 41 | public static updateTime(): void { 42 | this.currentFrame = Date.now(); 43 | this.deltaTime = (this.currentFrame - this.lastFrame) / 1000; 44 | this.lastFrame = this.currentFrame; 45 | } 46 | 47 | /** 48 | * メッセージを出力する 49 | * @param message 文字列 50 | */ 51 | public static printMessage(message: string): void { 52 | console.log(message); 53 | } 54 | 55 | static lastUpdate = Date.now(); 56 | 57 | static currentFrame = 0.0; 58 | static lastFrame = 0.0; 59 | static deltaTime = 0.0; 60 | } 61 | -------------------------------------------------------------------------------- /web/lib/live2d/src/main.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright(c) Live2D Inc. All rights reserved. 3 | * 4 | * Use of this source code is governed by the Live2D Open Software license 5 | * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. 6 | */ 7 | 8 | import { LAppDelegate } from './lappdelegate'; 9 | import * as LAppDefine from './lappdefine'; 10 | 11 | /** 12 | * ブラウザロード後の処理 13 | */ 14 | window.addEventListener( 15 | 'load', 16 | (): void => { 17 | // Initialize WebGL and create the application instance 18 | if (!LAppDelegate.getInstance().initialize()) { 19 | return; 20 | } 21 | 22 | LAppDelegate.getInstance().run(); 23 | }, 24 | { passive: true } 25 | ); 26 | 27 | /** 28 | * 終了時の処理 29 | */ 30 | window.addEventListener( 31 | 'beforeunload', 32 | (): void => LAppDelegate.releaseInstance(), 33 | { passive: true } 34 | ); 35 | -------------------------------------------------------------------------------- /web/lib/locale.ts: -------------------------------------------------------------------------------- 1 | 'use server'; 2 | 3 | import {cookies} from 'next/headers'; 4 | import {Locale, defaultLocale} from '@/i18n/config'; 5 | 6 | // In this example the locale is read from a cookie. You could alternatively 7 | // also read it from a database, backend service, or any other source. 8 | const COOKIE_NAME = 'NEXT_LOCALE'; 9 | 10 | export async function getUserLocale() { 11 | const c = await cookies(); 12 | return c.get(COOKIE_NAME)?.value || defaultLocale; 13 | } 14 | 15 | export async function setUserLocale(locale: Locale) { 16 | const c = await cookies(); 17 | c.set(COOKIE_NAME, locale); 18 | } -------------------------------------------------------------------------------- /web/lib/path.ts: -------------------------------------------------------------------------------- 1 | import { PUBLIC_SRC_PATH } from "./constants"; 2 | 3 | export function getSrcPath(src: string) { 4 | return `${PUBLIC_SRC_PATH}${src}`; 5 | } -------------------------------------------------------------------------------- /web/lib/store/common.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/lib/store/common.ts -------------------------------------------------------------------------------- /web/next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | // import createMDX from '@next/mdx'; 3 | import createNextIntlPlugin from 'next-intl/plugin'; 4 | const withNextIntl = createNextIntlPlugin(); 5 | const nextConfig: NextConfig = { 6 | // pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'], 7 | // output: 'export', 8 | distDir: './dist', 9 | // 防止dev模式下模拟立即卸载组件和重新挂载组件的行为 10 | reactStrictMode: false, 11 | async rewrites() { 12 | return [ 13 | { 14 | source: '/api/:path*', // 匹配所有以 /api 开头的请求 15 | // destination: 'http://124.222.70.73:9080/api/:path*', // 代理到指定的外部 API 16 | destination: 'https://www.light4ai.com/api/:path*', // 代理到指定的外部 API 17 | }, 18 | { 19 | source: '/adh/:path*', // 匹配所有以 /adh 开头的请求 20 | destination: 'http://127.0.0.1:8000/adh/:path*', // 代理到指定的外部 API 21 | // destination: 'https://www.light4ai.com/adh/:path*', // 代理到指定的外部 API 22 | } 23 | ]; 24 | }, 25 | }; 26 | 27 | // const withMDX = createMDX({ 28 | // // Add markdown plugins here, as desired 29 | // }) 30 | 31 | // export default withMDX(withNextIntl(nextConfig)); 32 | export default withNextIntl(nextConfig); 33 | -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "office-website", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@heroicons/react": "^2.2.0", 13 | "@heroui/react": "^2.7.5", 14 | "@mdx-js/loader": "^3.1.0", 15 | "@mdx-js/react": "^3.1.0", 16 | "@microsoft/fetch-event-source": "^2.0.1", 17 | "@next/mdx": "^15.2.1", 18 | "@ricky0123/vad-react": "^0.0.28", 19 | "@types/mdx": "^2.0.13", 20 | "animate.css": "^4.1.1", 21 | "clsx": "^2.1.1", 22 | "framer-motion": "^11.11.17", 23 | "i": "^0.3.7", 24 | "js-audio-recorder": "^1.0.7", 25 | "lamejs": "^1.2.1", 26 | "next": "15.0.3", 27 | "next-intl": "^3.23.5", 28 | "npm": "^11.2.0", 29 | "qrcode.react": "^4.2.0", 30 | "react": "19.0.0-rc-69d4b800-20241021", 31 | "react-dom": "19.0.0-rc-69d4b800-20241021", 32 | "react-markdown": "^9.0.3", 33 | "remark-gfm": "^4.0.1", 34 | "uuid": "^11.1.0", 35 | "victory": "^37.3.6", 36 | "whatwg-fetch": "^3.6.20", 37 | "zustand": "^5.0.1" 38 | }, 39 | "devDependencies": { 40 | "@types/node": "^20", 41 | "@types/react": "^18", 42 | "@types/react-dom": "^18", 43 | "eslint": "^9.22.0", 44 | "eslint-config-next": "15.0.1", 45 | "postcss": "^8", 46 | "tailwindcss": "^3.4.1", 47 | "typescript": "^5" 48 | } 49 | } -------------------------------------------------------------------------------- /web/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /web/public/image/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/image/loading.png -------------------------------------------------------------------------------- /web/public/sentio/backgrounds/static/夜晚街道.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/backgrounds/static/夜晚街道.jpg -------------------------------------------------------------------------------- /web/public/sentio/backgrounds/static/抽象.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/backgrounds/static/抽象.jpg -------------------------------------------------------------------------------- /web/public/sentio/backgrounds/static/插画.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/backgrounds/static/插画.jpg -------------------------------------------------------------------------------- /web/public/sentio/backgrounds/static/火影忍者.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/backgrounds/static/火影忍者.jpg -------------------------------------------------------------------------------- /web/public/sentio/backgrounds/static/简约.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/backgrounds/static/简约.jpg -------------------------------------------------------------------------------- /web/public/sentio/backgrounds/static/艺术.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/backgrounds/static/艺术.jpg -------------------------------------------------------------------------------- /web/public/sentio/backgrounds/static/赛博朋克.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/backgrounds/static/赛博朋克.jpg -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Chitose/Chitose.model3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "FileReferences": { 4 | "Moc": "chitose.moc3", 5 | "Textures": [ 6 | "chitose.2048/texture_00.png" 7 | ], 8 | "Physics": "chitose.physics3.json", 9 | "Pose": "chitose.pose3.json", 10 | "DisplayInfo": "chitose.cdi3.json", 11 | "Expressions": [ 12 | { 13 | "Name": "angry", 14 | "File": "expressions/生气.exp3.json" 15 | }, 16 | { 17 | "Name": "blushing", 18 | "File": "expressions/脸红.exp3.json" 19 | }, 20 | { 21 | "Name": "embarrass", 22 | "File": "expressions/尴尬.exp3.json" 23 | }, 24 | { 25 | "Name": "smile", 26 | "File": "expressions/微笑.exp3.json" 27 | }, 28 | { 29 | "Name": "sad", 30 | "File": "expressions/伤心.exp3.json" 31 | }, 32 | { 33 | "Name": "happy", 34 | "File": "expressions/开心.exp3.json" 35 | }, 36 | { 37 | "Name": "surprised", 38 | "File": "expressions/惊讶.exp3.json" 39 | } 40 | ], 41 | "Motions": { 42 | "Idle": [ 43 | { 44 | "File": "motions/微笑-看着你.motion3.json" 45 | } 46 | ], 47 | "TapBody": [ 48 | { 49 | "File": "motions/微笑-向左指引.motion3.json" 50 | }, 51 | { 52 | "File": "motions/打招呼-挥手.motion3.json" 53 | }, 54 | { 55 | "File": "motions/微笑-插单手.motion3.json" 56 | } 57 | ] 58 | } 59 | }, 60 | "Groups": [ 61 | { 62 | "Target": "Parameter", 63 | "Name": "EyeBlink", 64 | "Ids": [ 65 | "ParamEyeLOpen", 66 | "ParamEyeROpen" 67 | ] 68 | }, 69 | { 70 | "Target": "Parameter", 71 | "Name": "LipSync", 72 | "Ids": [ 73 | "ParamMouthOpenY" 74 | ] 75 | } 76 | ], 77 | "HitAreas": [] 78 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Chitose/Chitose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Chitose/Chitose.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Chitose/chitose.2048/texture_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Chitose/chitose.2048/texture_00.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Chitose/chitose.moc3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Chitose/chitose.moc3 -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Chitose/chitose.pose3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Pose", 3 | "Groups": [ 4 | [ 5 | { 6 | "Id": "PARTS_01_ARM_R_A", 7 | "Link": [] 8 | }, 9 | { 10 | "Id": "PARTS_01_ARM_R_B", 11 | "Link": [] 12 | } 13 | ], 14 | [ 15 | { 16 | "Id": "PARTS_01_ARM_L_A", 17 | "Link": [] 18 | } 19 | ] 20 | ] 21 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/Epsilon.1024/texture_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Epsilon/Epsilon.1024/texture_00.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/Epsilon.1024/texture_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Epsilon/Epsilon.1024/texture_01.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/Epsilon.1024/texture_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Epsilon/Epsilon.1024/texture_02.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/Epsilon.moc3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Epsilon/Epsilon.moc3 -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/Epsilon.model3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "FileReferences": { 4 | "Moc": "Epsilon.moc3", 5 | "Textures": [ 6 | "Epsilon.1024/texture_00.png", 7 | "Epsilon.1024/texture_01.png", 8 | "Epsilon.1024/texture_02.png" 9 | ], 10 | "Physics": "Epsilon.physics3.json", 11 | "DisplayInfo": "Epsilon.cdi3.json", 12 | "Expressions": [ 13 | { 14 | "Name": "angry", 15 | "File": "expressions/生气.exp3.json" 16 | }, 17 | { 18 | "Name": "blushing", 19 | "File": "expressions/脸红.exp3.json" 20 | }, 21 | { 22 | "Name": "innocent", 23 | "File": "expressions/无辜.exp3.json" 24 | }, 25 | { 26 | "Name": "sad", 27 | "File": "expressions/伤心.exp3.json" 28 | }, 29 | { 30 | "Name": "smile", 31 | "File": "expressions/微笑.exp3.json" 32 | }, 33 | { 34 | "Name": "happy", 35 | "File": "expressions/开心.exp3.json" 36 | }, 37 | { 38 | "Name": "scare", 39 | "File": "expressions/惊吓.exp3.json" 40 | }, 41 | { 42 | "Name": "upset", 43 | "File": "expressions/难过.exp3.json" 44 | } 45 | ], 46 | "Motions": { 47 | "Idle": [ 48 | { 49 | "File": "motions/微笑-平淡.motion3.json", 50 | "FadeInTime": 0.5, 51 | "FadeOutTime": 0.5 52 | } 53 | ], 54 | "TapBody": [ 55 | { 56 | "File": "motions/生气-叉手.motion3.json", 57 | "FadeInTime": 0.5, 58 | "FadeOutTime": 0.5 59 | }, 60 | { 61 | "File": "motions/生气-皱眉.motion3.json", 62 | "FadeInTime": 0.5, 63 | "FadeOutTime": 0.5 64 | } 65 | ] 66 | } 67 | }, 68 | "Groups": [ 69 | { 70 | "Target": "Parameter", 71 | "Name": "EyeBlink", 72 | "Ids": [ 73 | "ParamEyeLOpen", 74 | "ParamEyeROpen" 75 | ] 76 | }, 77 | { 78 | "Target": "Parameter", 79 | "Name": "LipSync", 80 | "Ids": [ 81 | "ParamMouthOpenY" 82 | ] 83 | } 84 | ], 85 | "HitAreas": [] 86 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/Epsilon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Epsilon/Epsilon.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/expressions/伤心.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": -0.13, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": -0.13, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamBrowLY", 16 | "Value": -1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRY", 21 | "Value": -1, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLAngle", 26 | "Value": 1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRAngle", 31 | "Value": 1, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLForm", 36 | "Value": -0.51, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRForm", 41 | "Value": -0.51, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamMouthForm", 46 | "Value": -2, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamMouthOpenY", 51 | "Value": 0, 52 | "Blend": "Add" 53 | } 54 | ] 55 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/expressions/开心.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": -1, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 1, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": -1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 1, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLAngle", 26 | "Value": 0.48, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRAngle", 31 | "Value": 0.46, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamMouthForm", 36 | "Value": 0, 37 | "Blend": "Add" 38 | } 39 | ] 40 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/expressions/微笑.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [] 4 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/expressions/惊吓.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0.5, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": 0.5, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamBrowLY", 16 | "Value": 1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRY", 21 | "Value": 1, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLX", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowLAngle", 31 | "Value": 0.28, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowRAngle", 36 | "Value": 0.31, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLForm", 41 | "Value": 1, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRForm", 46 | "Value": 1, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamMouthForm", 51 | "Value": -2, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamMouthOpenY", 56 | "Value": 0, 57 | "Blend": "Add" 58 | } 59 | ] 60 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/expressions/无辜.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeBallX", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeBallY", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLY", 26 | "Value": -1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRY", 31 | "Value": -1, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLX", 36 | "Value": -0.07, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRX", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLAngle", 46 | "Value": 0.73, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRAngle", 51 | "Value": 0.71, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLForm", 56 | "Value": -0.81, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRForm", 61 | "Value": -0.81, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamMouthForm", 66 | "Value": -2, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamMouthOpenY", 71 | "Value": 0, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamTere", 76 | "Value": 0, 77 | "Blend": "Add" 78 | } 79 | ] 80 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/expressions/生气.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeBallX", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeBallY", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLY", 26 | "Value": -0.59, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRY", 31 | "Value": -0.59, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLX", 36 | "Value": -1, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRX", 41 | "Value": -1, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLAngle", 46 | "Value": -1, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRAngle", 51 | "Value": -1, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLForm", 56 | "Value": -1, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRForm", 61 | "Value": -1, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamMouthForm", 66 | "Value": -2, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamMouthOpenY", 71 | "Value": 0, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamTere", 76 | "Value": 0, 77 | "Blend": "Add" 78 | } 79 | ] 80 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/expressions/脸红.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeBallX", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeBallY", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLY", 26 | "Value": -0.42, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRY", 31 | "Value": -0.44, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLX", 36 | "Value": -0.07, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRX", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLAngle", 46 | "Value": 1, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRAngle", 51 | "Value": 1, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLForm", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRForm", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamMouthForm", 66 | "Value": 0, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamTere", 71 | "Value": 1, 72 | "Blend": "Add" 73 | } 74 | ] 75 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Epsilon/expressions/难过.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": -0.25, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": -0.25, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamBrowLY", 16 | "Value": -0.31, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRY", 21 | "Value": -0.36, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLAngle", 26 | "Value": 0.61, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRAngle", 31 | "Value": 0.62, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLForm", 36 | "Value": -1, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRForm", 41 | "Value": -1, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamMouthForm", 46 | "Value": -1.53, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamMouthOpenY", 51 | "Value": 0, 52 | "Blend": "Add" 53 | } 54 | ] 55 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/Haru.model3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "FileReferences": { 4 | "Moc": "haru.moc3", 5 | "Textures": [ 6 | "haru.1024/texture_00.png", 7 | "haru.1024/texture_01.png", 8 | "haru.1024/texture_02.png" 9 | ], 10 | "Physics": "haru.physics3.json", 11 | "Pose": "haru.pose3.json", 12 | "DisplayInfo": "haru.cdi3.json", 13 | "Motions": { 14 | "Idle": [ 15 | ], 16 | "TapBody": [ 17 | { 18 | "File": "motion/微笑-向右指引.motion3.json" 19 | }, 20 | { 21 | "File": "motion/微笑-肯定点头.motion3.json" 22 | }, 23 | { 24 | "File": "motion/微笑-向右指引.motion3.json" 25 | }, 26 | { 27 | "File": "motion/微笑-肯定点头.motion3.json" 28 | } 29 | ] 30 | } 31 | }, 32 | "Groups": [ 33 | { 34 | "Target": "Parameter", 35 | "Name": "EyeBlink", 36 | "Ids": [ 37 | "ParamEyeLOpen", 38 | "ParamEyeROpen" 39 | ] 40 | }, 41 | { 42 | "Target": "Parameter", 43 | "Name": "LipSync", 44 | "Ids": [ 45 | "ParamMouthOpenY" 46 | ] 47 | } 48 | ], 49 | "HitAreas": [] 50 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/Haru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Haru/Haru.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/expressions/f01.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeForm", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallForm", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLY", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRY", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRX", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLAngle", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRAngle", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowLForm", 66 | "Value": 0, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowRForm", 71 | "Value": 0, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthForm", 76 | "Value": -1, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthOpenY", 81 | "Value": 0, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamTere", 86 | "Value": 0, 87 | "Blend": "Add" 88 | } 89 | ] 90 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/expressions/f02.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": -0.2, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": -0.2, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeForm", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallForm", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLY", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRY", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRX", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLAngle", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRAngle", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowLForm", 66 | "Value": -0.5, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowRForm", 71 | "Value": -0.5, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthForm", 76 | "Value": -2, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthOpenY", 81 | "Value": 0, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamTere", 86 | "Value": 0, 87 | "Blend": "Add" 88 | } 89 | ] 90 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/expressions/开心.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": -1, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 1, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": -1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 1, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeForm", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallForm", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLY", 36 | "Value": 0.3, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRY", 41 | "Value": 0.3, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRX", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLAngle", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRAngle", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowLForm", 66 | "Value": 0.2, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowRForm", 71 | "Value": 0.2, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthForm", 76 | "Value": 0, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthOpenY", 81 | "Value": 0, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamTere", 86 | "Value": 0, 87 | "Blend": "Add" 88 | } 89 | ] 90 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/expressions/微笑.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeForm", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallForm", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLY", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRY", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRX", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLAngle", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRAngle", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowLForm", 66 | "Value": 0, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowRForm", 71 | "Value": 0, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthForm", 76 | "Value": 0, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthOpenY", 81 | "Value": 0, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamTere", 86 | "Value": 0, 87 | "Blend": "Add" 88 | } 89 | ] 90 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/expressions/惊喜.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 1, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeForm", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallForm", 31 | "Value": -1, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLY", 36 | "Value": 0.3, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRY", 41 | "Value": 0.3, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRX", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLAngle", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRAngle", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowLForm", 66 | "Value": 0.5, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowRForm", 71 | "Value": 0.5, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthForm", 76 | "Value": -1.21, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthOpenY", 81 | "Value": 0, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamTere", 86 | "Value": 0, 87 | "Blend": "Add" 88 | } 89 | ] 90 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/expressions/生气.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeForm", 26 | "Value": -1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallForm", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLY", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRY", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRX", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLAngle", 56 | "Value": -0.5, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRAngle", 61 | "Value": -0.5, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowLForm", 66 | "Value": -0.5, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowRForm", 71 | "Value": -0.5, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthForm", 76 | "Value": -2, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthOpenY", 81 | "Value": 0, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamTere", 86 | "Value": 0, 87 | "Blend": "Add" 88 | } 89 | ] 90 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/expressions/脸红.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": -0.1, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": -0.1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeForm", 26 | "Value": 0.3, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallForm", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLY", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRY", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRX", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLAngle", 56 | "Value": 0.25, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRAngle", 61 | "Value": 0.25, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowLForm", 66 | "Value": -0.47, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowRForm", 71 | "Value": -0.43, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthForm", 76 | "Value": -0.5, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthOpenY", 81 | "Value": 0, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamTere", 86 | "Value": 1, 87 | "Blend": "Add" 88 | } 89 | ] 90 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/expressions/难过.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": -0.1, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": -0.1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeForm", 26 | "Value": 1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallForm", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLY", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRY", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRX", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLAngle", 56 | "Value": 0.3, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRAngle", 61 | "Value": 0.3, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowLForm", 66 | "Value": -0.5, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowRForm", 71 | "Value": -0.5, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthForm", 76 | "Value": -1.5, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthOpenY", 81 | "Value": 0, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamTere", 86 | "Value": 0, 87 | "Blend": "Add" 88 | } 89 | ] 90 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/haru.1024/texture_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Haru/haru.1024/texture_00.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/haru.1024/texture_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Haru/haru.1024/texture_01.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/haru.1024/texture_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Haru/haru.1024/texture_02.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/haru.moc3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Haru/haru.moc3 -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Haru/haru.pose3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Pose", 3 | "Groups": [ 4 | [ 5 | { 6 | "Id": "PARTS_01_ARM_R_A_001", 7 | "Link": [] 8 | }, 9 | { 10 | "Id": "PARTS_01_ARM_R_B_001", 11 | "Link": [] 12 | } 13 | ], 14 | [ 15 | { 16 | "Id": "PARTS_01_ARM_L_A_001", 17 | "Link": [] 18 | }, 19 | { 20 | "Id": "PARTS_01_ARM_L_B_001", 21 | "Link": [] 22 | } 23 | ] 24 | ] 25 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/Haru.2048/texture_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/HaruGreeter/Haru.2048/texture_00.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/Haru.2048/texture_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/HaruGreeter/Haru.2048/texture_01.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/Haru.moc3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/HaruGreeter/Haru.moc3 -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/Haru.pose3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Pose", 3 | "Groups": [ 4 | [ 5 | { 6 | "Id": "Part01ArmRA001", 7 | "Link": [] 8 | }, 9 | { 10 | "Id": "Part01ArmRB001", 11 | "Link": [] 12 | } 13 | ], 14 | [ 15 | { 16 | "Id": "Part01ArmLA001", 17 | "Link": [] 18 | }, 19 | { 20 | "Id": "Part01ArmLB001", 21 | "Link": [] 22 | } 23 | ] 24 | ] 25 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/Haru.userdata3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "Meta": { 4 | "UserDataCount": 3, 5 | "TotalUserDataSize": 9 6 | }, 7 | "UserData": [ 8 | { 9 | "Target": "ArtMesh", 10 | "Id": "D_PSD_27", 11 | "Value": "tai" 12 | }, 13 | { 14 | "Target": "ArtMesh", 15 | "Id": "D_PSD_25", 16 | "Value": "tai" 17 | }, 18 | { 19 | "Target": "ArtMesh", 20 | "Id": "D_PSD_24", 21 | "Value": "tai" 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/HaruGreeter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/HaruGreeter/HaruGreeter.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/expressions/冷漠.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0.8, 7 | "Blend": "Multiply" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": 0.8, 12 | "Blend": "Multiply" 13 | }, 14 | { 15 | "Id": "ParamBrowLForm", 16 | "Value": -0.33, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRForm", 21 | "Value": -0.33, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamMouthForm", 26 | "Value": -1.76, 27 | "Blend": "Add" 28 | } 29 | ] 30 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/expressions/开心张嘴.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamBrowLY", 6 | "Value": -1, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamBrowRY", 11 | "Value": -1, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamBrowLForm", 16 | "Value": 1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRForm", 21 | "Value": 1, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamMouthOpenY", 26 | "Value": 1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeForm", 31 | "Value": 0.54, 32 | "Blend": "Add" 33 | } 34 | ] 35 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/expressions/开心眯眼.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Multiply" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 1, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Multiply" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 1, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLY", 26 | "Value": 0.32, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRY", 31 | "Value": 0.32, 32 | "Blend": "Add" 33 | } 34 | ] 35 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/expressions/微笑.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamMouthForm", 6 | "Value": 0.27, 7 | "Blend": "Add" 8 | } 9 | ] 10 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/expressions/惊讶.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 2, 7 | "Blend": "Multiply" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": 2, 12 | "Blend": "Multiply" 13 | }, 14 | { 15 | "Id": "ParamBrowLY", 16 | "Value": 1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRY", 21 | "Value": 1, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamMouthForm", 26 | "Value": -1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallForm", 31 | "Value": -0.65, 32 | "Blend": "Add" 33 | } 34 | ] 35 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/expressions/生气.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamBrowLY", 6 | "Value": -1, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamBrowRY", 11 | "Value": -1, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamBrowLX", 16 | "Value": -1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRX", 21 | "Value": -1, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowRAngle", 26 | "Value": -1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowLForm", 31 | "Value": -1, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowRForm", 36 | "Value": -1, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamMouthForm", 41 | "Value": -2, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamMouthOpenY", 46 | "Value": 1, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamEyeForm", 51 | "Value": -1, 52 | "Blend": "Add" 53 | } 54 | ] 55 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/expressions/脸红.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0.89, 7 | "Blend": "Multiply" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": 0.89, 12 | "Blend": "Multiply" 13 | }, 14 | { 15 | "Id": "ParamBrowLY", 16 | "Value": -0.56, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRY", 21 | "Value": -0.56, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLX", 26 | "Value": -1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRX", 31 | "Value": -1, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLAngle", 36 | "Value": 0.35, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRAngle", 41 | "Value": 0.35, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLForm", 46 | "Value": -0.74, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRForm", 51 | "Value": -0.74, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamMouthForm", 56 | "Value": -0.46, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamTere", 61 | "Value": 1, 62 | "Blend": "Add" 63 | } 64 | ] 65 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/HaruGreeter/expressions/难过.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0.8, 7 | "Blend": "Multiply" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": 0.8, 12 | "Blend": "Multiply" 13 | }, 14 | { 15 | "Id": "ParamBrowLY", 16 | "Value": -0.56, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRY", 21 | "Value": -0.56, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowRX", 26 | "Value": -1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowLAngle", 31 | "Value": 0.35, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowRAngle", 36 | "Value": 0.35, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLForm", 41 | "Value": -0.74, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRForm", 46 | "Value": -0.74, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamMouthForm", 51 | "Value": -1.76, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamEyeForm", 56 | "Value": 1, 57 | "Blend": "Add" 58 | } 59 | ] 60 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hibiki/Hibiki.model3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "FileReferences": { 4 | "Moc": "hibiki.moc3", 5 | "Textures": [ 6 | "hibiki.2048/texture_00.png" 7 | ], 8 | "Physics": "hibiki.physics3.json", 9 | "DisplayInfo": "hibiki.cdi3.json", 10 | "Expressions": [ 11 | { 12 | "Name": "Angry", 13 | "File": "expressions/生气.exp3.json" 14 | }, 15 | { 16 | "Name": "Blushing", 17 | "File": "expressions/脸红.exp3.json" 18 | }, 19 | { 20 | "Name": "coldness", 21 | "File": "expressions/冷漠.exp3.json" 22 | }, 23 | { 24 | "Name": "smile", 25 | "File": "expressions/微笑.exp3.json" 26 | }, 27 | { 28 | "Name": "Sad", 29 | "File": "expressions/伤心.exp3.json" 30 | }, 31 | { 32 | "Name": "Surprised", 33 | "File": "expressions/惊喜.exp3.json" 34 | } 35 | ], 36 | "Motions": { 37 | "Idle": [ 38 | 39 | ], 40 | "TapBody": [ 41 | { 42 | "File": "motions/生气-转无辜.motion3.json" 43 | } 44 | ] 45 | } 46 | }, 47 | "Groups": [ 48 | { 49 | "Target": "Parameter", 50 | "Name": "EyeBlink", 51 | "Ids": [ 52 | "ParamEyeLOpen", 53 | "ParamEyeROpen" 54 | ] 55 | }, 56 | { 57 | "Target": "Parameter", 58 | "Name": "LipSync", 59 | "Ids": [ 60 | "ParamMouthOpenY" 61 | ] 62 | } 63 | ], 64 | "HitAreas": [] 65 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hibiki/Hibiki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Hibiki/Hibiki.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hibiki/expressions/伤心.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamBrowLY", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRY", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLX", 26 | "Value": -0.42, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRX", 31 | "Value": -0.42, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLAngle", 36 | "Value": 0.62, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRAngle", 41 | "Value": 0.68, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLForm", 46 | "Value": -1, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRForm", 51 | "Value": -1, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamMouthForm", 56 | "Value": -0.85, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamMouthOpenY", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamTere", 66 | "Value": 0, 67 | "Blend": "Add" 68 | } 69 | ] 70 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hibiki/expressions/冷漠.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamAngleZ", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLOpen", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowLY", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowRY", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowLX", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowRX", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLAngle", 41 | "Value": 0.1, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRAngle", 46 | "Value": 0.16, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLForm", 51 | "Value": -0.51, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRForm", 56 | "Value": -0.51, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamMouthForm", 61 | "Value": -0.5, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamMouthOpenY", 66 | "Value": 0, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamTere", 71 | "Value": -1, 72 | "Blend": "Add" 73 | } 74 | ] 75 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hibiki/expressions/微笑.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamBrowLY", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRY", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLX", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRX", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLAngle", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRAngle", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLForm", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRForm", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamMouthForm", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamMouthOpenY", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamTere", 66 | "Value": 0, 67 | "Blend": "Add" 68 | } 69 | ] 70 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hibiki/expressions/惊喜.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 1, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": 1, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamBrowLY", 16 | "Value": 0.39, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRY", 21 | "Value": 0.33, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLX", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRX", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLAngle", 36 | "Value": 0.19, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRAngle", 41 | "Value": 0.19, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLForm", 46 | "Value": 1, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRForm", 51 | "Value": 1, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamMouthForm", 56 | "Value": -0.69, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamMouthOpenY", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamTere", 66 | "Value": 0, 67 | "Blend": "Add" 68 | } 69 | ] 70 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hibiki/expressions/生气.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeROpen", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamBrowLY", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowRY", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLX", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRX", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLAngle", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRAngle", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLForm", 46 | "Value": -1, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRForm", 51 | "Value": -1, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamMouthForm", 56 | "Value": -1, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamMouthOpenY", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamTere", 66 | "Value": 0, 67 | "Blend": "Add" 68 | } 69 | ] 70 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hibiki/expressions/脸红.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamAngleZ", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLOpen", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamBrowLY", 21 | "Value": -0.25, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowRY", 26 | "Value": -0.25, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowLX", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowRX", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLAngle", 41 | "Value": 0.54, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRAngle", 46 | "Value": 0.59, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLForm", 51 | "Value": -0.42, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRForm", 56 | "Value": -0.45, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamMouthForm", 61 | "Value": -0.21, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamMouthOpenY", 66 | "Value": 0, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamTere", 71 | "Value": 1, 72 | "Blend": "Add" 73 | } 74 | ] 75 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hibiki/hibiki.2048/texture_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Hibiki/hibiki.2048/texture_00.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hibiki/hibiki.moc3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Hibiki/hibiki.moc3 -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hiyori/Hiyori.2048/texture_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Hiyori/Hiyori.2048/texture_00.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hiyori/Hiyori.2048/texture_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Hiyori/Hiyori.2048/texture_01.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hiyori/Hiyori.moc3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Hiyori/Hiyori.moc3 -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hiyori/Hiyori.model3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "FileReferences": { 4 | "Moc": "Hiyori.moc3", 5 | "Textures": [ 6 | "Hiyori.2048/texture_00.png", 7 | "Hiyori.2048/texture_01.png" 8 | ], 9 | "Physics": "Hiyori.physics3.json", 10 | "Pose": "Hiyori.pose3.json", 11 | "UserData": "Hiyori.userdata3.json", 12 | "DisplayInfo": "Hiyori.cdi3.json", 13 | "Motions": { 14 | "Idle": [ 15 | { 16 | "File": "motions/微笑-看着你.motion3.json", 17 | "FadeInTime": 0.5, 18 | "FadeOutTime": 0.5 19 | } 20 | ], 21 | "TapBody": [ 22 | { 23 | "File": "motions/难过-皱眉.motion3.json", 24 | "FadeInTime": 0.5, 25 | "FadeOutTime": 0.5 26 | }, 27 | { 28 | "File": "motions/无聊-抬头望天摇摆.motion3.json", 29 | "FadeInTime": 0.5, 30 | "FadeOutTime": 0.5 31 | } 32 | ] 33 | } 34 | }, 35 | "Groups": [ 36 | { 37 | "Target": "Parameter", 38 | "Name": "EyeBlink", 39 | "Ids": [ 40 | "ParamEyeLOpen", 41 | "ParamEyeROpen" 42 | ] 43 | }, 44 | { 45 | "Target": "Parameter", 46 | "Name": "LipSync", 47 | "Ids": [ 48 | "ParamMouthOpenY" 49 | ] 50 | } 51 | ], 52 | "HitAreas": [ 53 | { 54 | "Id": "HitArea", 55 | "Name": "Body" 56 | } 57 | ] 58 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hiyori/Hiyori.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Hiyori/Hiyori.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hiyori/Hiyori.pose3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Pose", 3 | "FadeInTime": 0.5, 4 | "Groups": [ 5 | [ 6 | { 7 | "Id": "PartArmA", 8 | "Link": [] 9 | }, 10 | { 11 | "Id": "PartArmB", 12 | "Link": [] 13 | } 14 | ] 15 | ] 16 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Hiyori/Hiyori.userdata3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "Meta": { 4 | "UserDataCount": 7, 5 | "TotalUserDataSize": 35 6 | }, 7 | "UserData": [ 8 | { 9 | "Target": "ArtMesh", 10 | "Id": "ArtMesh93", 11 | "Value": "ribon" 12 | }, 13 | { 14 | "Target": "ArtMesh", 15 | "Id": "ArtMesh94", 16 | "Value": "ribon" 17 | }, 18 | { 19 | "Target": "ArtMesh", 20 | "Id": "ArtMesh95", 21 | "Value": "ribon" 22 | }, 23 | { 24 | "Target": "ArtMesh", 25 | "Id": "ArtMesh57", 26 | "Value": "ribon" 27 | }, 28 | { 29 | "Target": "ArtMesh", 30 | "Id": "ArtMesh58", 31 | "Value": "ribon" 32 | }, 33 | { 34 | "Target": "ArtMesh", 35 | "Id": "ArtMesh59", 36 | "Value": "ribon" 37 | }, 38 | { 39 | "Target": "ArtMesh", 40 | "Id": "ArtMesh60", 41 | "Value": "ribon" 42 | } 43 | ] 44 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/Izumi.model3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "FileReferences": { 4 | "Moc": "izumi.moc3", 5 | "Textures": [ 6 | "izumi.1024/texture_00.png", 7 | "izumi.1024/texture_01.png", 8 | "izumi.1024/texture_02.png", 9 | "izumi.1024/texture_03.png" 10 | ], 11 | "Physics": "izumi.physics3.json", 12 | "DisplayInfo": "izumi.cdi3.json", 13 | "Expressions": [ 14 | { 15 | "Name": "angry", 16 | "File": "expressions/生气.exp3.json" 17 | }, 18 | { 19 | "Name": "blushing", 20 | "File": "expressions/脸红.exp3.json" 21 | }, 22 | { 23 | "Name": "coldness", 24 | "File": "expressions/冷漠.exp3.json" 25 | }, 26 | { 27 | "Name": "smile", 28 | "File": "expressions/微笑.exp3.json" 29 | }, 30 | { 31 | "Name": "sad", 32 | "File": "expressions/伤心.exp3.json" 33 | }, 34 | { 35 | "Name": "happy", 36 | "File": "expressions/开心.exp3.json" 37 | }, 38 | { 39 | "Name": "surprised", 40 | "File": "expressions/惊讶.exp3.json" 41 | } 42 | ], 43 | "Motions": { 44 | "Idle": [ 45 | ], 46 | "TapBody": [ 47 | { 48 | "File": "motions/开心-眯眼.motion3.json" 49 | } 50 | ] 51 | } 52 | }, 53 | "Groups": [ 54 | { 55 | "Target": "Parameter", 56 | "Name": "EyeBlink", 57 | "Ids": [ 58 | "ParamEyeLOpen", 59 | "ParamEyeROpen" 60 | ] 61 | }, 62 | { 63 | "Target": "Parameter", 64 | "Name": "LipSync", 65 | "Ids": [ 66 | "ParamMouthOpenY" 67 | ] 68 | } 69 | ], 70 | "HitAreas": [] 71 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/Izumi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Izumi/Izumi.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/expressions/伤心.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallForm", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowLY", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowRY", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLX", 41 | "Value": -0.59, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRX", 46 | "Value": -0.57, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLAngle", 51 | "Value": 1, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRAngle", 56 | "Value": 1, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowLForm", 61 | "Value": -1, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowRForm", 66 | "Value": -1, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamMouthForm", 71 | "Value": -1.45, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthOpenY", 76 | "Value": 0, 77 | "Blend": "Add" 78 | } 79 | ] 80 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/expressions/冷漠.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 1.5, 7 | "Blend": "Multiply" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 1.5, 17 | "Blend": "Multiply" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallForm", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowLY", 31 | "Value": -0.42, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowRY", 36 | "Value": -0.42, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLX", 41 | "Value": -0.3, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRX", 46 | "Value": -0.3, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLAngle", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRAngle", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowLForm", 61 | "Value": -0.54, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowRForm", 66 | "Value": -0.57, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamMouthForm", 71 | "Value": -1, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthOpenY", 76 | "Value": 0, 77 | "Blend": "Add" 78 | } 79 | ] 80 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/expressions/开心.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Multiply" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 1, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Multiply" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 1, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallForm", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowLY", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowRY", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLX", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLAngle", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRAngle", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowLForm", 61 | "Value": 1, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowRForm", 66 | "Value": 1, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamMouthForm", 71 | "Value": 0, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthOpenY", 76 | "Value": 0, 77 | "Blend": "Add" 78 | } 79 | ] 80 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/expressions/微笑.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallForm", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowLY", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowRY", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLX", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLAngle", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRAngle", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowLForm", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowRForm", 66 | "Value": 0, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamMouthForm", 71 | "Value": 0, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthOpenY", 76 | "Value": 0, 77 | "Blend": "Add" 78 | } 79 | ] 80 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/expressions/惊讶.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 1.5, 7 | "Blend": "Multiply" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 1.5, 17 | "Blend": "Multiply" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallForm", 26 | "Value": -1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowLY", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowRY", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLX", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLAngle", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRAngle", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowLForm", 61 | "Value": 1, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowRForm", 66 | "Value": 1, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamMouthForm", 71 | "Value": -1, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthOpenY", 76 | "Value": 0, 77 | "Blend": "Add" 78 | } 79 | ] 80 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/expressions/生气.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallForm", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowLY", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowRY", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLX", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLAngle", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRAngle", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowLForm", 61 | "Value": -1, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowRForm", 66 | "Value": -1, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamMouthForm", 71 | "Value": -2, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthOpenY", 76 | "Value": 0, 77 | "Blend": "Add" 78 | } 79 | ] 80 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/expressions/脸红.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallForm", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowLY", 31 | "Value": 0.39, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowRY", 36 | "Value": 0.42, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLX", 41 | "Value": -0.48, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRX", 46 | "Value": -0.48, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLAngle", 51 | "Value": 1, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRAngle", 56 | "Value": 1, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowLForm", 61 | "Value": -0.51, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowRForm", 66 | "Value": -0.48, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamMouthForm", 71 | "Value": -0.43, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthOpenY", 76 | "Value": 0, 77 | "Blend": "Add" 78 | } 79 | ] 80 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/izumi.1024/texture_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Izumi/izumi.1024/texture_00.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/izumi.1024/texture_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Izumi/izumi.1024/texture_01.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/izumi.1024/texture_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Izumi/izumi.1024/texture_02.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/izumi.1024/texture_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Izumi/izumi.1024/texture_03.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Izumi/izumi.moc3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Izumi/izumi.moc3 -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Kei/Kei.model3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "FileReferences": { 4 | "Moc": "kei_vowels_pro.moc3", 5 | "Textures": [ 6 | "kei_vowels_pro.2048/texture_00.png" 7 | ], 8 | "Physics": "kei_vowels_pro.physics3.json", 9 | "DisplayInfo": "kei_vowels_pro.cdi3.json", 10 | "MotionSync": "kei_vowels_pro.motionsync3.json", 11 | "Motions": { 12 | "": [ 13 | { 14 | "File": "motions/01_kei_en.motion3.json", 15 | "Sound": "sounds/01_kei_en.wav", 16 | "MotionSync": "Vowels_CRI" 17 | }, 18 | { 19 | "File": "motions/01_kei_jp.motion3.json", 20 | "Sound": "sounds/01_kei_jp.wav", 21 | "MotionSync": "Vowels_CRI" 22 | }, 23 | { 24 | "File": "motions/01_kei_ko.motion3.json", 25 | "Sound": "sounds/01_kei_ko.wav", 26 | "MotionSync": "Vowels_CRI" 27 | }, 28 | { 29 | "File": "motions/01_kei_zh.motion3.json", 30 | "Sound": "sounds/01_kei_zh.wav", 31 | "MotionSync": "Vowels_CRI" 32 | } 33 | ] 34 | } 35 | }, 36 | "Groups": [ 37 | { 38 | "Target": "Parameter", 39 | "Name": "EyeBlink", 40 | "Ids": [ 41 | "ParamEyeLOpen", 42 | "ParamEyeROpen" 43 | ] 44 | }, 45 | { 46 | "Target": "Parameter", 47 | "Name": "LipSync", 48 | "Ids": [ 49 | "ParamMouthOpenY" 50 | ] 51 | } 52 | ], 53 | "HitAreas": [ 54 | { 55 | "Id": "HitAreaHead", 56 | "Name": "Head" 57 | } 58 | ] 59 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Kei/Kei.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Kei/Kei.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Kei/kei_vowels_pro.2048/texture_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Kei/kei_vowels_pro.2048/texture_00.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Kei/kei_vowels_pro.moc3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Kei/kei_vowels_pro.moc3 -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Mao/Mao.2048/texture_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Mao/Mao.2048/texture_00.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Mao/Mao.moc3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Mao/Mao.moc3 -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Mao/Mao.model3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "FileReferences": { 4 | "Moc": "Mao.moc3", 5 | "Textures": [ 6 | "Mao.2048/texture_00.png" 7 | ], 8 | "Physics": "Mao.physics3.json", 9 | "Pose": "Mao.pose3.json", 10 | "DisplayInfo": "Mao.cdi3.json", 11 | "Expressions": [ 12 | { 13 | "Name": "sad", 14 | "File": "expressions/伤心.exp3.json" 15 | }, 16 | { 17 | "Name": "embarrass", 18 | "File": "expressions/尴尬.exp3.json" 19 | }, 20 | { 21 | "Name": "happy", 22 | "File": "expressions/开心.exp3.json" 23 | }, 24 | { 25 | "Name": "smile", 26 | "File": "expressions/微笑.exp3.json" 27 | }, 28 | { 29 | "Name": "scare", 30 | "File": "expressions/惊吓.exp3.json" 31 | }, 32 | { 33 | "Name": "surprised", 34 | "File": "expressions/惊喜.exp3.json" 35 | }, 36 | { 37 | "Name": "angry", 38 | "File": "expressions/生气.exp3.json" 39 | }, 40 | { 41 | "Name": "blushing", 42 | "File": "expressions/脸红.exp3.json" 43 | } 44 | ], 45 | "Motions": { 46 | "Idle": [ 47 | { 48 | "File": "motions/微笑-看着你.motion3.json" 49 | } 50 | ], 51 | "TapBody": [ 52 | { 53 | "File": "motions/画画成功-爱心.motion3.json" 54 | }, 55 | { 56 | "File": "motions/画画失败-爱心.motion3.json" 57 | }, 58 | { 59 | "File": "motions/微笑-挥动双手.motion3.json" 60 | } 61 | ] 62 | } 63 | }, 64 | "Groups": [ 65 | { 66 | "Target": "Parameter", 67 | "Name": "EyeBlink", 68 | "Ids": [ 69 | "ParamEyeLOpen", 70 | "ParamEyeROpen" 71 | ] 72 | }, 73 | { 74 | "Target": "Parameter", 75 | "Name": "LipSync", 76 | "Ids": [ 77 | "ParamMouthOpenY" 78 | ] 79 | } 80 | ], 81 | "HitAreas": [ 82 | { 83 | "Id": "HitAreaHead", 84 | "Name": "Head" 85 | }, 86 | { 87 | "Id": "HitAreaBody", 88 | "Name": "Body" 89 | } 90 | ] 91 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Mao/Mao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Mao/Mao.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Mao/Mao.pose3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Pose", 3 | "Groups": [ 4 | [ 5 | { 6 | "Id": "PartArmLA", 7 | "Link": [] 8 | }, 9 | { 10 | "Id": "PartArmLB", 11 | "Link": [] 12 | } 13 | ], 14 | [ 15 | { 16 | "Id": "PartArmRA", 17 | "Link": [] 18 | }, 19 | { 20 | "Id": "PartArmRB", 21 | "Link": [] 22 | } 23 | ] 24 | ] 25 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Rice/Rice.2048/texture_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Rice/Rice.2048/texture_00.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Rice/Rice.2048/texture_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Rice/Rice.2048/texture_01.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Rice/Rice.moc3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Rice/Rice.moc3 -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Rice/Rice.model3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "FileReferences": { 4 | "Moc": "Rice.moc3", 5 | "Textures": [ 6 | "Rice.2048/texture_00.png", 7 | "Rice.2048/texture_01.png" 8 | ], 9 | "Physics": "Rice.physics3.json", 10 | "DisplayInfo": "Rice.cdi3.json", 11 | "Motions": { 12 | "Idle": [ 13 | { 14 | "File": "motions/平淡.motion3.json" 15 | }, 16 | { 17 | "File": "motions/魔法-书点火.motion3.json" 18 | } 19 | ], 20 | "TapBody": [ 21 | { 22 | "File": "motions/魔法-小能量攻击.motion3.json" 23 | }, 24 | { 25 | "File": "motions/魔法-大能量攻击.motion3.json" 26 | } 27 | ] 28 | } 29 | }, 30 | "Groups": [ 31 | { 32 | "Target": "Parameter", 33 | "Name": "EyeBlink", 34 | "Ids": [ 35 | "ParamEyeLOpen", 36 | "ParamEyeROpen" 37 | ] 38 | }, 39 | { 40 | "Target": "Parameter", 41 | "Name": "LipSync", 42 | "Ids": [ 43 | "ParamMouthOpenY" 44 | ] 45 | } 46 | ], 47 | "HitAreas": [ 48 | { 49 | "Id": "HitAreaBody", 50 | "Name": "Body" 51 | } 52 | ] 53 | } 54 | -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Rice/Rice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Rice/Rice.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Shizuku/Shizuku.model3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "FileReferences": { 4 | "Moc": "shizuku.moc3", 5 | "Textures": [ 6 | "shizuku.1024/texture_00.png", 7 | "shizuku.1024/texture_01.png", 8 | "shizuku.1024/texture_02.png", 9 | "shizuku.1024/texture_03.png", 10 | "shizuku.1024/texture_04.png" 11 | ], 12 | "Physics": "shizuku.physics3.json", 13 | "Pose": "shizuku.pose3.json", 14 | "DisplayInfo": "shizuku.cdi3.json", 15 | "Motions": { 16 | "Idle": [ 17 | 18 | ], 19 | "TapBody": [ 20 | { 21 | "File": "motions/打哈欠-眯眼.motion3.json" 22 | }, 23 | { 24 | "File": "motions/打哈欠-脸红.motion3.json" 25 | } 26 | ] 27 | 28 | } 29 | }, 30 | "Groups": [ 31 | { 32 | "Target": "Parameter", 33 | "Name": "EyeBlink", 34 | "Ids": [ 35 | "ParamEyeLOpen", 36 | "ParamEyeROpen" 37 | ] 38 | }, 39 | { 40 | "Target": "Parameter", 41 | "Name": "LipSync", 42 | "Ids": [ 43 | "ParamMouthOpenY" 44 | ] 45 | } 46 | ], 47 | "HitAreas": [] 48 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Shizuku/Shizuku.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Shizuku/Shizuku.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Shizuku/shizuku.1024/texture_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Shizuku/shizuku.1024/texture_00.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Shizuku/shizuku.1024/texture_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Shizuku/shizuku.1024/texture_01.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Shizuku/shizuku.1024/texture_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Shizuku/shizuku.1024/texture_02.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Shizuku/shizuku.1024/texture_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Shizuku/shizuku.1024/texture_03.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Shizuku/shizuku.1024/texture_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Shizuku/shizuku.1024/texture_04.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Shizuku/shizuku.moc3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Shizuku/shizuku.moc3 -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Shizuku/shizuku.pose3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Pose", 3 | "Groups": [ 4 | [ 5 | { 6 | "Id": "PARTS_01_ARM_R_02", 7 | "Link": [] 8 | }, 9 | { 10 | "Id": "PARTS_01_ARM_R_01", 11 | "Link": [] 12 | } 13 | ], 14 | [ 15 | { 16 | "Id": "PARTS_01_ARM_L_02", 17 | "Link": [] 18 | }, 19 | { 20 | "Id": "PARTS_01_ARM_L_01", 21 | "Link": [] 22 | } 23 | ] 24 | ] 25 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Tsumiki/Tsumiki.model3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 3, 3 | "FileReferences": { 4 | "Moc": "tsumiki.moc3", 5 | "Textures": [ 6 | "tsumiki.2048/texture_00.png", 7 | "tsumiki.2048/texture_01.png" 8 | ], 9 | "Physics": "tsumiki.physics3.json", 10 | "DisplayInfo": "tsumiki.cdi3.json", 11 | "Expressions": [ 12 | { 13 | "Name": "angry", 14 | "File": "expressions/生气.exp3.json" 15 | }, 16 | { 17 | "Name": "blushing", 18 | "File": "expressions/脸红.exp3.json" 19 | }, 20 | { 21 | "Name": "sad", 22 | "File": "expressions/伤心.exp3.json" 23 | }, 24 | { 25 | "Name": "wigged", 26 | "File": "expressions/呵斥.exp3.json" 27 | }, 28 | { 29 | "Name": "happy-01", 30 | "File": "expressions/开心-01.exp3.json" 31 | }, 32 | { 33 | "Name": "happy-01", 34 | "File": "expressions/开心-02.exp3.json" 35 | }, 36 | { 37 | "Name": "smile", 38 | "File": "expressions/微笑.exp3.json" 39 | }, 40 | { 41 | "Name": "surprised", 42 | "File": "expressions/惊讶.exp3.json" 43 | }, 44 | { 45 | "Name": "speechless", 46 | "File": "expressions/无语.exp3.json" 47 | }, 48 | { 49 | "Name": "embarrass", 50 | "File": "expressions/尴尬.exp3.json" 51 | } 52 | ], 53 | "Motions": { 54 | "Idle": [ 55 | { 56 | "File": "motions/微笑-眨眼.motion3.json" 57 | } 58 | ], 59 | "TapBody": [ 60 | { 61 | "File": "motions/微笑-看着你.motion3.json" 62 | } 63 | ] 64 | } 65 | }, 66 | "Groups": [ 67 | { 68 | "Target": "Parameter", 69 | "Name": "EyeBlink", 70 | "Ids": [ 71 | "ParamEyeLOpen", 72 | "ParamEyeROpen" 73 | ] 74 | }, 75 | { 76 | "Target": "Parameter", 77 | "Name": "LipSync", 78 | "Ids": [ 79 | "ParamMouthOpenY" 80 | ] 81 | } 82 | ], 83 | "HitAreas": [] 84 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Tsumiki/Tsumiki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Tsumiki/Tsumiki.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Tsumiki/expressions/伤心.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": -0.25, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 1, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": -0.25, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 1, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallX", 26 | "Value": 1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallY", 31 | "Value": -0.5, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLY", 36 | "Value": -0.5, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRY", 41 | "Value": -0.5, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLX", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRX", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLAngle", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRAngle", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowLForm", 66 | "Value": -0.6, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowRForm", 71 | "Value": -0.6, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthForm", 76 | "Value": -1, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthOpenY", 81 | "Value": 0, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamHairTair", 86 | "Value": -1, 87 | "Blend": "Add" 88 | } 89 | ] 90 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Tsumiki/expressions/呵斥.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallX", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallY", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamEyeBallForm", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLY", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRY", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLX", 51 | "Value": 0.5, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRX", 56 | "Value": 0.5, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowLAngle", 61 | "Value": -0.5, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowRAngle", 66 | "Value": -0.5, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowLForm", 71 | "Value": -1, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamBrowRForm", 76 | "Value": -1, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthForm", 81 | "Value": 0, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamMouthOpenY", 86 | "Value": 1, 87 | "Blend": "Add" 88 | }, 89 | { 90 | "Id": "ParamHairAho", 91 | "Value": 1, 92 | "Blend": "Add" 93 | }, 94 | { 95 | "Id": "ParamHairTair", 96 | "Value": -1, 97 | "Blend": "Add" 98 | } 99 | ] 100 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Tsumiki/expressions/开心-01.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": -1, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 1, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": -1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 1, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallX", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallY", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamEyeBallForm", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLY", 41 | "Value": 1, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRY", 46 | "Value": 1, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLX", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRX", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowLAngle", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowRAngle", 66 | "Value": 0, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowLForm", 71 | "Value": 0, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamBrowRForm", 76 | "Value": 0, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthForm", 81 | "Value": 1, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamMouthOpenY", 86 | "Value": 0, 87 | "Blend": "Add" 88 | }, 89 | { 90 | "Id": "ParamHairAho", 91 | "Value": -1, 92 | "Blend": "Add" 93 | }, 94 | { 95 | "Id": "ParamHairTair", 96 | "Value": 1, 97 | "Blend": "Add" 98 | } 99 | ] 100 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Tsumiki/expressions/开心-02.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": -1, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": -1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamBrowLY", 26 | "Value": 1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamBrowRY", 31 | "Value": 1, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLX", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRX", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLAngle", 46 | "Value": 1, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRAngle", 51 | "Value": 1, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLForm", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRForm", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamMouthForm", 66 | "Value": 1, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamMouthOpenY", 71 | "Value": 0, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamHairAho", 76 | "Value": 0, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamHairTair", 81 | "Value": 1, 82 | "Blend": "Add" 83 | } 84 | ] 85 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Tsumiki/expressions/微笑.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 0, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 0, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallX", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallY", 31 | "Value": 0, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamEyeBallForm", 36 | "Value": 0, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLY", 41 | "Value": 0, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRY", 46 | "Value": 0, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLX", 51 | "Value": 0, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRX", 56 | "Value": 0, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowLAngle", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowRAngle", 66 | "Value": 0, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowLForm", 71 | "Value": 0, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamBrowRForm", 76 | "Value": 0, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthForm", 81 | "Value": 1, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamMouthOpenY", 86 | "Value": 0, 87 | "Blend": "Add" 88 | }, 89 | { 90 | "Id": "ParamHairAho", 91 | "Value": 0, 92 | "Blend": "Add" 93 | }, 94 | { 95 | "Id": "ParamHairTair", 96 | "Value": 0, 97 | "Blend": "Add" 98 | } 99 | ] 100 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Tsumiki/expressions/惊讶.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": 1, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": 1, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallX", 26 | "Value": 0, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallY", 31 | "Value": 0.5, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamEyeBallForm", 36 | "Value": -1, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowLY", 41 | "Value": 1, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowRY", 46 | "Value": 1, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowLX", 51 | "Value": 0.5, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowRX", 56 | "Value": 0.5, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowLAngle", 61 | "Value": 0, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowRAngle", 66 | "Value": 0, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowLForm", 71 | "Value": 0, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamBrowRForm", 76 | "Value": 0, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthForm", 81 | "Value": 0, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamMouthOpenY", 86 | "Value": 1, 87 | "Blend": "Add" 88 | }, 89 | { 90 | "Id": "ParamHairAho", 91 | "Value": -1, 92 | "Blend": "Add" 93 | }, 94 | { 95 | "Id": "ParamHairTair", 96 | "Value": 1, 97 | "Blend": "Add" 98 | } 99 | ] 100 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Tsumiki/expressions/无语.exp3.json: -------------------------------------------------------------------------------- 1 | { 2 | "Type": "Live2D Expression", 3 | "Parameters": [ 4 | { 5 | "Id": "ParamEyeLOpen", 6 | "Value": -0.5, 7 | "Blend": "Add" 8 | }, 9 | { 10 | "Id": "ParamEyeLSmile", 11 | "Value": 0.5, 12 | "Blend": "Add" 13 | }, 14 | { 15 | "Id": "ParamEyeROpen", 16 | "Value": -0.5, 17 | "Blend": "Add" 18 | }, 19 | { 20 | "Id": "ParamEyeRSmile", 21 | "Value": 0.5, 22 | "Blend": "Add" 23 | }, 24 | { 25 | "Id": "ParamEyeBallX", 26 | "Value": 1, 27 | "Blend": "Add" 28 | }, 29 | { 30 | "Id": "ParamEyeBallY", 31 | "Value": 0.5, 32 | "Blend": "Add" 33 | }, 34 | { 35 | "Id": "ParamBrowLY", 36 | "Value": -1, 37 | "Blend": "Add" 38 | }, 39 | { 40 | "Id": "ParamBrowRY", 41 | "Value": -1, 42 | "Blend": "Add" 43 | }, 44 | { 45 | "Id": "ParamBrowLX", 46 | "Value": -1, 47 | "Blend": "Add" 48 | }, 49 | { 50 | "Id": "ParamBrowRX", 51 | "Value": -1, 52 | "Blend": "Add" 53 | }, 54 | { 55 | "Id": "ParamBrowLAngle", 56 | "Value": -0.75, 57 | "Blend": "Add" 58 | }, 59 | { 60 | "Id": "ParamBrowRAngle", 61 | "Value": -0.75, 62 | "Blend": "Add" 63 | }, 64 | { 65 | "Id": "ParamBrowLForm", 66 | "Value": 1, 67 | "Blend": "Add" 68 | }, 69 | { 70 | "Id": "ParamBrowRForm", 71 | "Value": 1, 72 | "Blend": "Add" 73 | }, 74 | { 75 | "Id": "ParamMouthForm", 76 | "Value": -1, 77 | "Blend": "Add" 78 | }, 79 | { 80 | "Id": "ParamMouthOpenY", 81 | "Value": 0, 82 | "Blend": "Add" 83 | }, 84 | { 85 | "Id": "ParamHairAho", 86 | "Value": 0, 87 | "Blend": "Add" 88 | }, 89 | { 90 | "Id": "ParamHairTair", 91 | "Value": 0, 92 | "Blend": "Add" 93 | } 94 | ] 95 | } -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Tsumiki/tsumiki.2048/texture_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Tsumiki/tsumiki.2048/texture_00.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Tsumiki/tsumiki.2048/texture_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Tsumiki/tsumiki.2048/texture_01.png -------------------------------------------------------------------------------- /web/public/sentio/characters/free/Tsumiki/tsumiki.moc3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/sentio/characters/free/Tsumiki/tsumiki.moc3 -------------------------------------------------------------------------------- /web/public/vad/ort-wasm-simd.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/vad/ort-wasm-simd.wasm -------------------------------------------------------------------------------- /web/public/vad/silero_vad_legacy.onnx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/vad/silero_vad_legacy.onnx -------------------------------------------------------------------------------- /web/public/vad/silero_vad_v5.onnx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/public/vad/silero_vad_v5.onnx -------------------------------------------------------------------------------- /web/styles/fonts/honglei.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/styles/fonts/honglei.ttf -------------------------------------------------------------------------------- /web/styles/fonts/yunFeng.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wan-h/awesome-digital-human-live2d/28bf319de99bae994f2d39ec90771f070a788d06/web/styles/fonts/yunFeng.ttf -------------------------------------------------------------------------------- /web/styles/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | 6 | @layer utilities { 7 | /* 隐藏 Chrome, Safari 和 Opera 的滚动条 */ 8 | .no-scrollbar::-webkit-scrollbar { 9 | display: none; 10 | } 11 | /* 隐藏 IE, Edge 和 Firefox 的滚动条 */ 12 | .no-scrollbar { 13 | -ms-overflow-style: none; /* IE 和 Edge */ 14 | scrollbar-width: none; /* Firefox */ 15 | } 16 | 17 | .full-height-minus-64px { 18 | height: calc(100vh - 64px); 19 | } 20 | } -------------------------------------------------------------------------------- /web/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | import { heroui } from "@heroui/react"; 3 | 4 | const config: Config = { 5 | content: [ 6 | "./pages/**/*.{js,ts,jsx,tsx,mdx}", 7 | "./components/**/*.{js,ts,jsx,tsx,mdx}", 8 | "./app/**/*.{js,ts,jsx,tsx,mdx}", 9 | "./node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}", 10 | ], 11 | theme: { 12 | extend: { 13 | colors: { 14 | background: "var(--background)", 15 | foreground: "var(--foreground)", 16 | }, 17 | }, 18 | }, 19 | darkMode: "class", 20 | plugins: [heroui()], 21 | }; 22 | export default config; 23 | -------------------------------------------------------------------------------- /web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "strict": true, 12 | "noEmit": true, 13 | "esModuleInterop": true, 14 | "module": "esnext", 15 | "moduleResolution": "bundler", 16 | "resolveJsonModule": true, 17 | "isolatedModules": true, 18 | "jsx": "preserve", 19 | "incremental": true, 20 | "strictNullChecks": false, 21 | "plugins": [ 22 | { 23 | "name": "next" 24 | } 25 | ], 26 | "paths": { 27 | "@/*": [ 28 | "./*" 29 | ], 30 | "@framework/*": [ 31 | "./lib/live2d/Framework/src/*" 32 | ], 33 | "@live2dCore/*": [ 34 | "./lib/live2d/Core/*" 35 | ] 36 | } 37 | }, 38 | "include": [ 39 | "**/*.ts", 40 | "**/*.tsx", 41 | ".next/types/**/*.ts", 42 | "next-env.d.ts", 43 | "./dist/types/**/*.ts" 44 | ], 45 | "exclude": [ 46 | "node_modules" 47 | ] 48 | } 49 | --------------------------------------------------------------------------------