├── .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 |  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 |  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 |  27 | 28 | ### 5. 系统本地部署dify接口请求返回错误。 29 | 本地部署dify,配置服务后数字人一直返回“dify接口请求错误” 30 |  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 |Could not find requested resource
9 | 10 | Return Home 11 | 12 |{t('title')}
16 |科技让人们更加热爱这个世界!
29 |<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 |
--------------------------------------------------------------------------------