diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2703f31
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,11 @@
+*/*-lock.json
+*/node_modules
+*.sqlite
+*.lock
+*target
+*.db
+**.DS_Store
+*.DS_Store
+/scpt/*.jpeg
+/scpt/*.png
+config
diff --git a/github/PixelStreamingInfrastructure/Public/player.html b/github/PixelStreamingInfrastructure/Public/player.html
new file mode 100644
index 0000000..59b073e
--- /dev/null
+++ b/github/PixelStreamingInfrastructure/Public/player.html
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pixel Streaming
+
+
+
+
+
+
+
+
+
diff --git a/github/restreamer/compose.yaml b/github/restreamer/compose.yaml
new file mode 100644
index 0000000..3639ad8
--- /dev/null
+++ b/github/restreamer/compose.yaml
@@ -0,0 +1,13 @@
+services:
+
+ restreamer:
+ image: datarhei/restreamer
+ #image: datarhei/restreamer:cuda-latest
+ ports:
+ - 8080:8080
+ - 1935:1935
+ - 6000:6000/udp
+ restart: always
+ volumes:
+ - ./data/config:/core/config
+ - ./data/data:/core/data
diff --git a/github/rust-bbs/Cargo.toml b/github/rust-bbs/Cargo.toml
new file mode 100644
index 0000000..b950790
--- /dev/null
+++ b/github/rust-bbs/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "rust-bbs"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+actix-web = "4.0"
+url = "2.3.1"
+rusqlite = { version = "0.28", features = ["bundled"] }
+serde = { version = "1.0", features = ["derive"] }
+askama = "*"
diff --git a/github/rust-bbs/Dockerfile b/github/rust-bbs/Dockerfile
new file mode 100644
index 0000000..658c0fa
--- /dev/null
+++ b/github/rust-bbs/Dockerfile
@@ -0,0 +1,8 @@
+FROM syui/aios
+
+WORKDIR /app
+COPY ./src ./src
+COPY ./templates ./templates
+COPY ./Cargo.toml ./Cargo.toml
+RUN cargo build --release
+CMD ["/app/target/release/rust-bbs"]
diff --git a/github/rust-bbs/compose.yml b/github/rust-bbs/compose.yml
new file mode 100644
index 0000000..d4e3dd7
--- /dev/null
+++ b/github/rust-bbs/compose.yml
@@ -0,0 +1,7 @@
+services:
+ web:
+ build: .
+ ports:
+ - 8080:8080
+ volumes:
+ - ./sqlite.db:/app/sqlite.db
diff --git a/github/rust-bbs/src/main.rs b/github/rust-bbs/src/main.rs
new file mode 100644
index 0000000..a970690
--- /dev/null
+++ b/github/rust-bbs/src/main.rs
@@ -0,0 +1,127 @@
+use askama::Template;
+use serde::{Deserialize, Serialize};
+use rusqlite::{Connection, Result as SqliteResult};
+use actix_web::{web, App, HttpServer, HttpResponse, Responder, HttpRequest, Error};
+use actix_web::error::{ErrorInternalServerError};
+
+use std::fmt;
+impl fmt::Display for Post {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "@{} {}", self.handle.as_deref().unwrap_or("anonymous"), self.content)
+ }
+}
+
+#[derive(Deserialize, Default)]
+struct QueryParams {
+ handle: Option,
+}
+#[derive(Serialize, Deserialize)]
+struct Post {
+ id: i32,
+ handle: Option,
+ content: String,
+}
+
+#[derive(Template)]
+#[template(path = "index.html")]
+struct IndexTemplate {
+ posts: Vec,
+}
+
+#[derive(Template)]
+#[template(path = "post.html")]
+struct PostTemplate {}
+
+fn init_db() -> SqliteResult<()> {
+ let conn = Connection::open("sqlite.db")?;
+ conn.execute(
+ "CREATE TABLE IF NOT EXISTS posts (
+ id INTEGER PRIMARY KEY,
+ handle TEXT NOT NULL,
+ content TEXT NOT NULL
+ )",
+ [],
+ )?;
+ Ok(())
+}
+
+async fn index() -> impl Responder {
+ let conn = Connection::open("sqlite.db").unwrap();
+ let mut stmt = conn.prepare("SELECT id, handle, content FROM posts ORDER BY id DESC").unwrap();
+ let posts = stmt.query_map([], |row| {
+ Ok(Post {
+ id: row.get(0)?,
+ handle: row.get(1)?,
+ content: row.get(2)?,
+ })
+ }).unwrap().filter_map(Result::ok).collect::>();
+
+ let template = IndexTemplate { posts };
+ HttpResponse::Ok().body(template.render().unwrap())
+}
+
+async fn post_form() -> impl Responder {
+ let template = PostTemplate {};
+ HttpResponse::Ok().body(template.render().unwrap())
+}
+
+#[derive(Deserialize)]
+struct FormData {
+ handle: String,
+ content: String,
+}
+
+async fn submit_post(
+ req: HttpRequest,
+ form: web::Form
+) -> Result {
+ let query = web::Query::::from_query(req.query_string())
+ .unwrap_or_else(|_| web::Query(QueryParams { handle: None }));
+ //let handle = query.handle.clone().filter(|h| !h.is_empty());
+ //println!("Debug: Extracted handle: {:?}", handle);
+let handle = if !form.handle.is_empty() {
+ form.handle.clone()
+} else {
+ query.handle.clone().unwrap_or_default()
+};
+
+println!("Debug: Using handle: {:?}", handle);
+
+ let conn = Connection::open("sqlite.db")
+ .map_err(|_| ErrorInternalServerError("Database connection failed"))?;
+ let result = conn.execute(
+ "INSERT INTO posts (handle, content) VALUES (?1, ?2)",
+ &[&form.handle, &form.content],
+ );
+ match result {
+ Ok(_) => {
+ let redirect_url = if !handle.is_empty() {
+ format!("/?handle={}", handle)
+ } else {
+ "/".to_string()
+ };
+ Ok(HttpResponse::SeeOther()
+ .append_header(("Location",
+ redirect_url))
+ .finish())
+ },
+
+ //Ok(_) => Ok(web::Redirect::to("/" + "?handle=" + handle).see_other()),
+ Err(_) => Err(ErrorInternalServerError("Failed to insert post")),
+ }
+}
+
+#[actix_web::main]
+async fn main() -> std::io::Result<()> {
+ init_db().unwrap();
+
+ HttpServer::new(|| {
+ App::new()
+ .route("/", web::get().to(index))
+ .route("/post", web::get().to(post_form))
+ .route("/submit", web::post().to(submit_post))
+ })
+ .bind("0.0.0.0:8080")?
+ .run()
+ .await
+}
diff --git a/github/rust-bbs/templates/index.html b/github/rust-bbs/templates/index.html
new file mode 100644
index 0000000..135db2c
--- /dev/null
+++ b/github/rust-bbs/templates/index.html
@@ -0,0 +1,79 @@
+
+
+
+ Simple BBS
+
+
+
+
+
+
+
+ {% for post in posts %}
+ - {{ post }}
+ {% endfor %}
+
+
+
+
+
+
+
+
+
diff --git a/github/rust-bbs/templates/post.html b/github/rust-bbs/templates/post.html
new file mode 100644
index 0000000..0246b13
--- /dev/null
+++ b/github/rust-bbs/templates/post.html
@@ -0,0 +1,14 @@
+
+
+
+ New Post
+
+
+ New Post
+
+
+
diff --git a/github/slidev/.gitignore b/github/slidev/.gitignore
new file mode 100644
index 0000000..52f2323
--- /dev/null
+++ b/github/slidev/.gitignore
@@ -0,0 +1,7 @@
+node_modules
+.DS_Store
+dist
+*.local
+.vite-inspect
+.remote-assets
+components.d.ts
diff --git a/github/slidev/.npmrc b/github/slidev/.npmrc
new file mode 100644
index 0000000..05932b8
--- /dev/null
+++ b/github/slidev/.npmrc
@@ -0,0 +1,3 @@
+# for pnpm
+shamefully-hoist=true
+auto-install-peers=true
diff --git a/github/slidev/README.md b/github/slidev/README.md
new file mode 100644
index 0000000..0b3e721
--- /dev/null
+++ b/github/slidev/README.md
@@ -0,0 +1,15 @@
+# Welcome to [Slidev](https://github.com/slidevjs/slidev)!
+
+To start the slide show:
+
+- `npm install`
+- `npm run dev`
+- visit
+
+Edit the [slides.md](./slides.md) to see the changes.
+
+Learn more about Slidev at the [documentation](https://sli.dev/).
+
+```sh
+$ slidev build --base /slide
+```
diff --git a/github/slidev/components/Counter.vue b/github/slidev/components/Counter.vue
new file mode 100644
index 0000000..eaa6a79
--- /dev/null
+++ b/github/slidev/components/Counter.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+ {{ counter }}
+
+
+
diff --git a/github/slidev/netlify.toml b/github/slidev/netlify.toml
new file mode 100644
index 0000000..9f91d0e
--- /dev/null
+++ b/github/slidev/netlify.toml
@@ -0,0 +1,16 @@
+[build]
+publish = "dist"
+command = "npm run build"
+
+[build.environment]
+NODE_VERSION = "20"
+
+[[redirects]]
+from = "/.well-known/*"
+to = "/.well-known/:splat"
+status = 200
+
+[[redirects]]
+from = "/*"
+to = "/index.html"
+status = 200
diff --git a/github/slidev/package.json b/github/slidev/package.json
new file mode 100644
index 0000000..e069d20
--- /dev/null
+++ b/github/slidev/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "slidev",
+ "type": "module",
+ "private": true,
+ "scripts": {
+ "build": "slidev build",
+ "dev": "slidev --open",
+ "export": "slidev export"
+ },
+ "dependencies": {
+ "@slidev/cli": "^0.49.29",
+ "@slidev/theme-default": "latest",
+ "@slidev/theme-seriph": "latest",
+ "slidev-theme-eloc": "^1.0.2",
+ "vue": "^3.4.38"
+ }
+}
diff --git a/github/slidev/pages/imported-slides.md b/github/slidev/pages/imported-slides.md
new file mode 100644
index 0000000..3fff217
--- /dev/null
+++ b/github/slidev/pages/imported-slides.md
@@ -0,0 +1,27 @@
+# Imported Slides
+
+You can split your slides.md into multiple files and organize them as you want using the `src` attribute.
+
+#### `slides.md`
+
+```markdown
+# Page 1
+
+Page 2 from main entry.
+
+---
+
+## src: ./subpage.md
+```
+
+
+
+#### `subpage.md`
+
+```markdown
+# Page 2
+
+Page 2 from another file.
+```
+
+[Learn more](https://sli.dev/guide/syntax.html#importing-slides)
diff --git a/github/slidev/slides.md b/github/slidev/slides.md
new file mode 100644
index 0000000..8ce5869
--- /dev/null
+++ b/github/slidev/slides.md
@@ -0,0 +1,135 @@
+---
+theme: eloc
+class: text-center
+highlighter: shiki
+lineNumbers: false
+info: |
+ ## Slidev Starter Template
+ Presentation slides for developers.
+
+ Learn more at [Sli.dev](https://sli.dev)
+drawings:
+ persist: false
+transition: slide-left
+title: Unreal Engine 5.5 | aiue
+---
+
+# `aiue`
+
+物語は空と海に囲まれた西の都(みやこ)からはじまる...
+
+---
+
+## 配信で使える最新技術の紹介
+
+### `unreal engine`
+
+- vrm4u, vmc, livelink, streaming
+- chatgpt, atproto
+- `ai` + `ue`
+
+---
+
+## `unreal engine`
+
+- ue 5.5.0p
+- ue 5.4.4
+
+---
+
+## `vrm4u`
+
+キャラクターを表示しよう
+
+---
+
+`vmc`と`livelink`で体の動きを反映
+
+- vmcはABP
+- livelinkはCBP
+
+---
+
+## `web browser`
+
+WBPからwebを使おう
+
+---
+
+- widget3dをworldに表示させると画質が悪いので`EngineMaterials/Widget3DPassThrough`以外のmaterialを使います
+
+
+
+https://blueprintue.com/blueprint/-49_059w/
+
+---
+
+## `pixel streaming`
+
+webでゲーム配信や操作ができる
+
+```sh
+$ git clone https://github.com/EpicGamesExt/PixelStreamingInfrastructure
+$ cd ./PixelStreamingInfrastructure/SignallingWebServer/platform_scripts/cmd/
+$ ./Start_SignallingServer_nopublic.ps1
+```
+
+---
+
+## `atproto`
+
+blueskyが使っているprotocol
+
+---
+
+## `game animation sample`
+
+キャラクターの基本操作をカスタマイズ
+
+---
+
+## `city sample`
+
+人や車が動く最先端の街
+
+---
+
+## `ultra dynamic sky`
+
+- `sky atmoshpere` + `volumetric cloud`
+
+---
+
+## `whisper` + `chatgpt` + `elevenlabs`
+
+キャラ設定と会話
+
+- whisper : RuntimeSpeechRecognizer
+
+---
+
+```sh
+# perplexity.ai
+$ curl -X POST "https://api.elevenlabs.io/v1/text-to-speech/VOICE_ID" \
+ -H "xi-api-key: YOUR_API_KEY" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "text": "Hello world!",
+ "model_id": "eleven_monolingual_v1",
+ "voice_settings": {
+ "stability": 0.5,
+ "similarity_boost": 0.5
+ }
+ }' \
+ --output output.mp3
+```
+
+---
+
+@syui.ai
+
+
+
+
diff --git a/github/slidev/snippets/external.ts b/github/slidev/snippets/external.ts
new file mode 100644
index 0000000..40c109b
--- /dev/null
+++ b/github/slidev/snippets/external.ts
@@ -0,0 +1,12 @@
+/* eslint-disable no-console */
+
+// #region snippet
+// Inside ./snippets/external.ts
+export function emptyArray(length: number) {
+ return Array.from({ length })
+}
+// #endregion snippet
+
+export function sayHello() {
+ console.log('Hello from snippets/external.ts')
+}
diff --git a/github/slidev/vercel.json b/github/slidev/vercel.json
new file mode 100644
index 0000000..9276941
--- /dev/null
+++ b/github/slidev/vercel.json
@@ -0,0 +1,7 @@
+{
+ "rewrites": [
+ { "source": "/(.*)", "destination": "/index.html" }
+ ],
+ "buildCommand": "npm run build",
+ "outputDirectory": "dist"
+}
diff --git a/img/issue-9-0001.png b/img/issue-9-0001.png
new file mode 100755
index 0000000..08389bc
Binary files /dev/null and b/img/issue-9-0001.png differ
diff --git a/img/issue-9-0002.png b/img/issue-9-0002.png
new file mode 100755
index 0000000..e87c6b9
Binary files /dev/null and b/img/issue-9-0002.png differ
diff --git a/img/issue-9-0003.png b/img/issue-9-0003.png
new file mode 100755
index 0000000..1539db6
Binary files /dev/null and b/img/issue-9-0003.png differ
diff --git a/img/issue-9-0004.png b/img/issue-9-0004.png
new file mode 100755
index 0000000..7bb0701
Binary files /dev/null and b/img/issue-9-0004.png differ
diff --git a/img/ue-2024-10-31-151413.png b/img/ue-2024-10-31-151413.png
new file mode 100644
index 0000000..e8ee7f7
Binary files /dev/null and b/img/ue-2024-10-31-151413.png differ
diff --git a/img/ue-2024-11-18-220316.png b/img/ue-2024-11-18-220316.png
new file mode 100644
index 0000000..cc0bad0
Binary files /dev/null and b/img/ue-2024-11-18-220316.png differ
diff --git a/img/ue-2024-11-18-220359.png b/img/ue-2024-11-18-220359.png
new file mode 100644
index 0000000..bc6b6c7
Binary files /dev/null and b/img/ue-2024-11-18-220359.png differ
diff --git a/img/ue-2024-11-18-220524.png b/img/ue-2024-11-18-220524.png
new file mode 100644
index 0000000..540ae36
Binary files /dev/null and b/img/ue-2024-11-18-220524.png differ
diff --git a/img/ue-2024-11-18-220605.png b/img/ue-2024-11-18-220605.png
new file mode 100644
index 0000000..c800ac6
Binary files /dev/null and b/img/ue-2024-11-18-220605.png differ
diff --git a/img/ue5.5-2024-12-02 093031.png b/img/ue5.5-2024-12-02 093031.png
new file mode 100644
index 0000000..cf4675f
Binary files /dev/null and b/img/ue5.5-2024-12-02 093031.png differ
diff --git a/img/ue5.5-2024-12-02 093116.png b/img/ue5.5-2024-12-02 093116.png
new file mode 100644
index 0000000..0d2c649
Binary files /dev/null and b/img/ue5.5-2024-12-02 093116.png differ
diff --git a/img/ue5.5-2024-12-02 093118.png b/img/ue5.5-2024-12-02 093118.png
new file mode 100644
index 0000000..09f5b36
Binary files /dev/null and b/img/ue5.5-2024-12-02 093118.png differ
diff --git a/img/ue5.5-2024-12-02 093119.png b/img/ue5.5-2024-12-02 093119.png
new file mode 100644
index 0000000..5584e60
Binary files /dev/null and b/img/ue5.5-2024-12-02 093119.png differ
diff --git a/img/ue5.5-2024-12-02 093130.png b/img/ue5.5-2024-12-02 093130.png
new file mode 100644
index 0000000..e60e3fa
Binary files /dev/null and b/img/ue5.5-2024-12-02 093130.png differ
diff --git a/img/wiki-frontpage-0001.png b/img/wiki-frontpage-0001.png
new file mode 100644
index 0000000..7990327
Binary files /dev/null and b/img/wiki-frontpage-0001.png differ
diff --git a/lexicons/ai/syui/game/user.json b/lexicons/ai/syui/game/user.json
new file mode 100644
index 0000000..32d57be
--- /dev/null
+++ b/lexicons/ai/syui/game/user.json
@@ -0,0 +1,125 @@
+{
+ "lexicon": 1,
+ "id": "ai.syui.game.user",
+ "defs": {
+ "main": {
+ "type": "record",
+ "key": "tid",
+ "description": "Record containing a game user.",
+ "input": {
+ "encoding": "application/json",
+ "record": {
+ "type": "object",
+ "required": [
+ "did",
+ "createdAt"
+ ],
+ "properties": {
+ "aiten": {
+ "type": "integer",
+ "default": 0
+ },
+ "limit": {
+ "type": "bool"
+ },
+ "login": {
+ "type": "bool"
+ },
+ "did": {
+ "type": "string"
+ },
+ "handle": {
+ "type": "string"
+ },
+ "gender": {
+ "type": "string",
+ "enum": [
+ "none",
+ "male",
+ "famale"
+ ]
+ },
+ "charactor": {
+ "type": "object",
+ "enum": [ "ai", "chinese", "manny", "quinn", "phoenix", "kirin", "leviathan", "wyvern", "cerberus", "dragon", "kitsune", "pegasus" ],
+ "properties": {
+ "type": "object",
+ "properties": {
+ "season": {
+ "type": "integer",
+ "default": 0
+ },
+ "group": {
+ "type": "string",
+ "default": "origin"
+ },
+ "img": {
+ "type": "uri",
+ "default": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4hqjfn7m6n5hno3doamuhgef/bafkreie34pjuc6coenzcdwrgrh4fbacq7bkhsz263g5vpbsqxwaz37kkwy@jpeg"
+ },
+ "lv": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 7,
+ "default": 1
+ },
+ "exp": {
+ "type": "integer"
+ },
+ "hp": {
+ "type": "integer",
+ "maximum": 255,
+ "default": 0
+ },
+ "attach": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 255,
+ "default": 0
+ },
+ "attach_post": {
+ "type": "integer",
+ "default": 0
+ },
+ "critical": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 255,
+ "default": 0
+ },
+ "critical_d": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 255,
+ "default": 0
+ },
+ "rank": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 7,
+ "default": 0
+ },
+ "mode": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 3,
+ "default": 0
+ }
+ }
+ }
+ }
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "datetime",
+ "description": "Client-declared timestamp when this post was originally created."
+ },
+ "updatedAt": {
+ "type": "string",
+ "format": "datetime"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/plugins/vmc4ue/VMC4UEBlueprintFunctionLibrary.cpp.patch b/plugins/vmc4ue/VMC4UEBlueprintFunctionLibrary.cpp.patch
new file mode 100644
index 0000000..4d89ecd
--- /dev/null
+++ b/plugins/vmc4ue/VMC4UEBlueprintFunctionLibrary.cpp.patch
@@ -0,0 +1,56 @@
+--- ./VMC4UE/VMC4UE/Source/VMC4UE/Source/VMC4UEBlueprintFunctionLibrary.cpp
++++ ./VMC4UEBlueprintFunctionLibrary.cpp
+@@ -119,27 +119,29 @@ UVMC4UEStreamingSkeletalMeshTransform* UVMC4UEBlueprin
+ {
+ return nullptr;
+ }
+-
++
++ UVMC4UEStreamingSkeletalMeshTransform* StreamingSkeletalMeshTransform = nullptr;
++
++ // Try to get existing transform
+ {
+- // Get
+ FRWScopeLock RWScopeLock(OSCManager->RWLock, FRWScopeLockType::SLT_ReadOnly);
+- auto StreamingSkeletalMeshTransform = OSCManager->StreamingSkeletalMeshTransformMap.Find(Port);
+- if (StreamingSkeletalMeshTransform != nullptr)
++ auto FoundTransform = OSCManager->StreamingSkeletalMeshTransformMap.Find(Port);
++ if (FoundTransform != nullptr)
+ {
+- return *StreamingSkeletalMeshTransform;
++ return *FoundTransform;
+ }
+ }
++
++ // Create new transform if not found
+ {
+- // Create
+ FRWScopeLock RWScopeLock(OSCManager->RWLock, FRWScopeLockType::SLT_Write);
+- auto StreamingSkeletalMeshTransform = OSCManager->StreamingSkeletalMeshTransformMap.Find(Port);
+- if (StreamingSkeletalMeshTransform != nullptr)
++ auto FoundTransform = OSCManager->StreamingSkeletalMeshTransformMap.Find(Port);
++ if (FoundTransform != nullptr)
+ {
+- return *StreamingSkeletalMeshTransform;
++ return *FoundTransform;
+ }
+- UVMC4UEStreamingSkeletalMeshTransform* NewStreamingSkeletalMeshTransform = NewObject();
+
+- //FRWScopeLock RWScopeLock2(NewStreamingSkeletalMeshTransform->RWLock, FRWScopeLockType::SLT_Write);
++ UVMC4UEStreamingSkeletalMeshTransform* NewStreamingSkeletalMeshTransform = NewObject();
+ OSCManager->StreamingSkeletalMeshTransformMap.Emplace(Port, NewStreamingSkeletalMeshTransform);
+
+ // Bind Port
+@@ -149,9 +151,10 @@ UVMC4UEStreamingSkeletalMeshTransform* UVMC4UEBlueprin
+
+ OSCManager->OscReceivers.Emplace(OscReceiver);
+
+- return NewStreamingSkeletalMeshTransform;
++ StreamingSkeletalMeshTransform = NewStreamingSkeletalMeshTransform;
+ }
+- return nullptr;
++
++ return StreamingSkeletalMeshTransform;
+ }
+
+ void UVMC4UEBlueprintFunctionLibrary::RefreshConnection(float Seconds)
diff --git a/plugins/vmc4ue/VMC4UEBoneMappingAssetFactory.cpp.patch b/plugins/vmc4ue/VMC4UEBoneMappingAssetFactory.cpp.patch
new file mode 100644
index 0000000..2020e39
--- /dev/null
+++ b/plugins/vmc4ue/VMC4UEBoneMappingAssetFactory.cpp.patch
@@ -0,0 +1,25 @@
+--- ./VMC4UE/Source/VMC4UEEd/Source/VMC4UEBoneMappingAssetFactory.cpp
++++ ./VMC4UEBoneMappingAssetFactory.cpp
+@@ -5,6 +5,8 @@
+ #include "../../VMC4UE/Include/VMC4UEStreamingData.h"
+ #include "Dom/JsonObject.h"
+ #include "JsonObjectConverter.h"
++#include "UObject/ConstructorHelpers.h"
++#include "UObject/UObjectGlobals.h"
+
+ UVMC4UEBoneMappingAssetFactory::UVMC4UEBoneMappingAssetFactory(const FObjectInitializer &ObjectInitializer)
+ : Super(ObjectInitializer)
+@@ -26,11 +28,12 @@
+ return UVMC4UEVRMMapping::StaticClass();
+ }
+
++
+ UObject *UVMC4UEBoneMappingAssetFactory::FactoryCreateText(UClass *InClass, UObject *InParent, FName InName, EObjectFlags Flags, UObject *Context, const TCHAR *Type, const TCHAR *&Buffer, const TCHAR *BuferEnd, FFeedbackContext *Warn)
+ {
+ FString TextData = FString(Buffer);
+
+- UVMC4UEVRMMapping *NewAsset = CastChecked(StaticConstructObject_Internal(InClass, InParent, InName, Flags));
++ UVMC4UEVRMMapping* NewAsset = NewObject(InParent, InClass, InName, Flags);
+ if (!IsValid(NewAsset))
+ {
+ return nullptr;
diff --git a/plugins/vmc4ue/readme.md b/plugins/vmc4ue/readme.md
new file mode 100644
index 0000000..b0ad812
--- /dev/null
+++ b/plugins/vmc4ue/readme.md
@@ -0,0 +1,23 @@
+vmc4ue patch rebuild for `ue5.4`
+
+- https://github.com/HAL9HARUKU/VMC4UE
+- https://github.com/HAL9HARUKU/ueOSC
+- https://github.com/HAL9HARUKU/VRMMapExporter
+- https://github.com/vrm-c/UniVRM
+
+[unity](https://unity.com/)で`VRMMapExporter`から`$model.vrmmap`を作る。ABPで読み込む。
+
+`VMC4UE`は`$project.sln`を生成して`visual studio solution`でrebuildする。
+
+ただし、この方法で表情を動かすことはできない。
+
+```sh
+$ git clone https://github.com/HAL9HARUKU/VMC4UE
+$ cd VMC4UE
+$ git reset --hard b5a6cf96e5928551d8e3e20b74705e3e8f22a1df
+$ cd ..
+
+# example
+$ patch -u ./VMC4UE/VMC4UE/Source/VMC4UE/Source/VMC4UEBlueprintFunctionLibrary.cpp < VMC4UEBlueprintFunctionLibrary.cpp.patch
+$ patch -u ./VMC4UE/VMC4UE/Source/VMC4UEEd/Source/VMC4UEBoneMappingAssetFactory.cpp < VMC4UEBoneMappingAssetFactory.cpp.patch
+```
diff --git a/readme.md b/readme.md
index 3e4d6ff..19a63b5 100644
--- a/readme.md
+++ b/readme.md
@@ -1,41 +1,87 @@
# yui
-- pixel streaming : https://ue.syui.ai
-- support : `windows 64bit`
-
-|title|推奨スペック|
-|---|---|
-|cpu|AMD Ryzen 7 5700X|
-|memory|32GB / DDR4-3200 DIMM (PC4-25600)|
-|gpu|GeForce RTX 4060Ti 8GB|
-|storage|1TB M.2 NVMe SSD|
-
-ハイスペックなパソコンが必要です。
-
-## help
-
-web板は同じ画面と操作が共有されています。他の人がログインしてプレイしているときは邪魔しないようにしましょう。
-
-## download & start
-
-ダウンロードは数時間かかります。
-
-```sh
-# ダウンロード
-$ git clone https://git.syui.ai/ai/ue
-$ cd ue
-
-# 解凍
-$ aunpack yui.zip
-
-# 実行
-$ ./Windows/yui.exe
-```
+[aiverse](https://git.syui.ai/ai/ue/wiki/verse) project.
## log
|version|commit|
|---|---|
-|v0.1 β|世界を作っているところ|
-|v0.2 β|物語を作った。webに対応|
+|v0.1 β|world create|
+|v0.2 β|support web|
+|v0.3 β|support vmc|
+|v0.4 β|support at|
+## at
+
+the player data is stored in the pds.
+
+```sh
+├── [yui.syui.ai]
+│ ├── ai.syui.game.user
+│ │ ├── lv
+│ │ ├── hp
+│ │ └── coin
+│ └── ai.syui.game.login
+│ ├── login
+│ ├── updatedAt
+│ └── username
+└─── [user.bsky.social]
+ └── ai.syui.game
+ ├── account
+ └── createdAt
+```
+
+```sh
+# https://git.syui.ai/ai/at/src/branch/main/at.zsh
+$ ./at.zsh u at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game.user/syui
+{
+ "uri": "at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game.user/syui",
+ "cid": "bafyreigijd4vonyzgjkzotrbtq5j5gyoecokoij3u7jw4sqnx6wkh7attq",
+ "value": {
+ "did": "did:plc:uqzpqmrjnptsxezjx4xuh2mn",
+ "$type": "ai.syui.game.user",
+ "aiten": 0,
+ "limit": false,
+ "login": false,
+ "gender": "male",
+ "handle": "syui.ai",
+ "character": {
+ "ai": {
+ "hp": 9,
+ "lv": 1,
+ "exp": 0,
+ "img": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4hqjfn7m6n5hno3doamuhgef/bafkreie34pjuc6coenzcdwrgrh4fbacq7bkhsz263g5vpbsqxwaz37kkwy@jpeg",
+ "mode": 0,
+ "rank": 0,
+ "group": "origin",
+ "attach": 0,
+ "season": 0,
+ "critical": 1,
+ "critical_d": 0,
+ "attach_post": 14102
+ }
+ },
+ "createdAt": "2024-11-29T21:34:27.833Z",
+ "updatedAt": "2024年12月8日 11:25:17 GMT"
+ }
+}
+```
+
+## service
+
+|title|url|
+|---|---|
+|game|https://ue.syui.ai|
+|live|https://live.syui.ai|
+|chat|https://o.syui.ai|
+
+## support
+
+`windows 64bit`
+
+|title|spec|
+|---|---|
+|cpu|AMD Ryzen 7 5700X|
+|memory|32GB / DDR4-3200 DIMM (PC4-25600)|
+|gpu|GeForce RTX 4060Ti 8GB|
+|storage|1TB M.2 NVMe SSD|
diff --git a/scpt/character.zsh b/scpt/character.zsh
new file mode 100755
index 0000000..aed8d8e
--- /dev/null
+++ b/scpt/character.zsh
@@ -0,0 +1,169 @@
+#!/bin/zsh
+
+function download_character_icon(){
+
+t=(
+ "https://sketchfab.com/3d-models/super-9a80a6d6cf6f4b08906505c7f945d3ce"
+)
+
+t=(
+"https://sketchfab.com/3d-models/cerberus-quirky-series-4379b571b5a440119d1ebaddb0711142"
+"https://sketchfab.com/3d-models/chinese-dragon-quirky-series-a383d3cf5b004978ac620806558b2924"
+"https://sketchfab.com/3d-models/dragon-quirky-series-9a0989aae9b84ebdade28e84a0702a71"
+"https://sketchfab.com/3d-models/kirin-quirky-series-b280c8bc5b87471eac1068acc91fdce1"
+"https://sketchfab.com/3d-models/kitsune-quirky-series-4fc8b2ade43f4d4bb8a8e6e227f00a62"
+"https://sketchfab.com/3d-models/leviathan-quirky-series-002200e1db2c461fbcaa8d2fdac2d766"
+"https://sketchfab.com/3d-models/pegasus-quirky-series-a4488ae7a2d2405c927a50f5a8b2d6bb"
+"https://sketchfab.com/3d-models/phoenix-quirky-series-1f0a01247b78441ab5b9cf8e9711e78e"
+"https://sketchfab.com/3d-models/wyvern-quirky-series-7baad217325a45b4877514b3f5924be9"
+)
+
+for i in $t; do
+ name=`echo $i|cut -d / -f 5|cut -d - -f 1`
+ tt=`curl -sL $i|tr ' ' '\n' |grep .jpeg|cut -d '"' -f 2`
+ normal=`echo $tt|awk "NR==1"`
+ min=`echo $tt|awk "NR==2"`
+ if [ ! -f $name.jpeg ];then
+ curl -sL $normal -o $name.jpeg
+ fi
+ if [ ! -f ${name}-min.jpeg ];then
+ #curl -sL $min -o ${name}-min.jpeg
+ fi
+ array+=(`echo $tt|sed "1,2d"|cut -d ";" -f 2|cut -d '&' -f 1|tr '\n' ' '`)
+ echo $name
+ for ((i=1; i<=$#array; i++)); do
+ #echo "Index: $i, Value: ${array[$i]}"
+ #curl -sL ${array[$i]} -o ${name}-${i}.jpeg
+ done
+done
+}
+
+handle_yui=yui.syui.ai
+did_yui=did:plc:4hqjfn7m6n5hno3doamuhgef
+token_yui=`cat ~/.config/ai/token.json|jq -r .accessJwt`
+host=bsky.social
+
+case $OSTYPE in
+ darwin*)
+ day=`gdate --iso-8601=seconds`
+ ;;
+ *)
+ day=`date --iso-8601=seconds`
+ ;;
+esac
+
+function create_game_character() {
+ t=(
+ ai
+ chinese
+ kirin
+ leviathan
+ phoenix
+ wyvern
+ cerberus
+ dragon
+ kitsune
+ pegasus
+ )
+
+ for ((i=1; i<=$#t; i++)); do
+ created=2001-01-01T00:00:00+09:00
+ col=ai.syui.game.character
+ req=com.atproto.repo.getRecord
+ url=https://$host/xrpc/$req
+
+ id=$i
+ name=${t[$i]}
+ chara=$name
+ rkey=$chara
+ repo=$did_yui
+ json="{\"collection\":\"$col\", \"rkey\":\"$rkey\", \"repo\":\"$repo\"}"
+ if [ $((RANDOM % 2)) -eq 0 ];then
+ gender=male
+ else
+ gender=female
+ fi
+
+ case $name in
+ ai)
+ gender=none
+ group=origin
+ season=0
+ ;;
+ chinese|dragon|cerberus|pegasus|leviathan)
+ gender=male
+ group=fantasy
+ season=1
+ ;;
+ kitsune|phoenix|kirin|wyvern)
+ gender=female
+ group=fantasy
+ season=1
+ ;;
+ *)
+ continue ;;
+ esac
+
+ jj=`curl -sL "$url?repo=$repo&collection=$col&rkey=$rkey"`
+
+ link=`echo $jj|jq -r '.value.embed.external.thumb.ref.[]'`
+ size=`echo $jj|jq -r .value.embed.external.thumb.size`
+ mtype=`echo $jj|jq -r .value.embed.external.thumb.mimeType`
+ echo $name
+ echo $gender
+ echo https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4hqjfn7m6n5hno3doamuhgef/$link
+
+ ## upload img
+ #if [ -f ./${name}.jpeg ];then
+ # jj=`ai img-upload ./${name}.jpeg`
+ #elif [ -f ./${name}.png ];then
+ # jj=`ai img-upload ./${name}.png`
+ #fi
+ #link=`echo $jj|jq -r ".blob.ref.[]"`
+ #size=`echo $jj|jq -r .blob.size`
+ #mtype=`echo $jj|jq -r .blob.mimeType`
+
+ req=com.atproto.repo.putRecord
+ url=https://$host/xrpc/$req
+
+ nickname=$name
+ fullname=$name
+ uri=at://${did_yui}/$col/$chara
+
+
+json="{
+ \"repo\": \"$handle_yui\",
+ \"did\": \"$did_yui\",
+ \"collection\": \"$col\",
+ \"rkey\": \"$chara\",
+ \"record\": {
+ \"id\": $id,
+ \"name\": \"$name\",
+ \"fullname\": \"$fullname\",
+ \"nickname\": \"$nickname\",
+ \"gender\": \"$gender\",
+ \"season\": $season,
+ \"group\": \"$group\",
+ \"embed\": {
+ \"\$type\": \"app.bsky.embed.external\",
+ \"external\": {
+ \"uri\": \"$uri\",
+ \"thumb\": {
+ \"\$type\": \"blob\",
+ \"ref\": {
+ \"\$link\": \"$link\"
+ },
+ \"mimeType\": \"$mtype\",
+ \"size\": $size
+} } }, \"createdAt\": \"$created\", \"updatedAt\": \"$day\" } }"
+
+ if echo $json|jq . ;then
+ curl -sL -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $token_yui" -d $json $url
+ fi
+ done
+
+}
+
+#download_character_icon
+create_game_character
+
diff --git a/texture/T__02.PNG b/texture/T__02.PNG
new file mode 100644
index 0000000..8b0898c
Binary files /dev/null and b/texture/T__02.PNG differ
diff --git a/ue.json b/ue.json
new file mode 100644
index 0000000..da39996
--- /dev/null
+++ b/ue.json
@@ -0,0 +1,427 @@
+{
+ "aiue": {
+ "name": "ue",
+ "body": {
+ "text": "ai unreal engine, game naming conventions, character attribute",
+ "lang": {
+ "ja": "AI Unreal Engine, ゲームの命名規則, キャラクターの属性"
+ }
+ },
+ "tag": [
+ "ai",
+ "atom",
+ "molecule",
+ "atmosphere",
+ "universe"
+ ],
+ "ai": {
+ "name": "ai",
+ "group": [
+ "origin"
+ ],
+ "lang": {
+ "ja": "アイ"
+ },
+ "ref": "at://syui.ai",
+ "body": {
+ "text": "the smallest unit in this world, smaller than a quark. the smaller it is, the more it can gather together. it generates enormous gravity, and black holes are made up of these particles. this world is the world of existence. existence is made up of the consciousness of existence. the consciousness of existence is the smallest thing in this world, and all matter is a collection of this consciousness.",
+ "lang": {
+ "ja": "クォークよりも小さいこの世界の最小単位。小さいほど集まることができる。膨大な重力が発生し、ブラックホールはこの粒子で構成されている。この世界は存在の世界。存在は存在の意識で構成される。存在の意識はこの世界で最も小さいもので、あらゆる物質はこの意識の集合体"
+ }
+ },
+ "tag": [
+ "ai",
+ "yui"
+ ],
+ "ai": {
+ "name": "ai",
+ "color": "#fff700",
+ "lang": {
+ "ja": "アイ"
+ },
+ "story": {
+ "body": {
+ "text": "there is nothing the same in this world. even though we may seem to be looking at the same thing, we are actually looking at something different. there is uniqueness in everything",
+ "lang": {
+ "ja": "この世に同じものは何一つない。同じものを見ているように見えても、実は違うものを見ている。すべての存在は唯一性を持つ"
+ }
+ }
+ }
+ },
+ "yui": {
+ "name": "yui",
+ "color": "#313131",
+ "lang": {
+ "ja": "ユイ"
+ }
+ }
+ },
+ "atom": {
+ "name": "atom",
+ "group": [
+ "fantasy"
+ ],
+ "lang": {
+ "ja": "原子"
+ },
+ "ref": "https://en.wikipedia.org/wiki/atom",
+ "body": {
+ "text": "the word atom comes from the greek word atmos, which means indivisible. an atom consists of an atomic nucleus, which is made up of protons and neutrons, and electrons distributed around the nucleus",
+ "lang": {
+ "ja": "アトムはギリシャ語のアトモス、これ以上分割できないという単語が由来。原子は陽子と中性子からなる原子核と、その周囲に分布する電子から構成される"
+ }
+ },
+ "tag": [
+ "proton",
+ "neutron",
+ "atomic",
+ "electron",
+ "quark"
+ ],
+ "proton": {
+ "name": "proton",
+ "color": "#e74c3c",
+ "lang": {
+ "ja": "陽子"
+ }
+ },
+ "neutron": {
+ "name": "neutron",
+ "color": "#cacfd2",
+ "lang": {
+ "ja": "中性子"
+ }
+ },
+ "atomic": {
+ "name": "atomic",
+ "color": "#1abc9c",
+ "lang": {
+ "ja": "核"
+ }
+ },
+ "electron": {
+ "name": "electron",
+ "color": "#3498db",
+ "lang": {
+ "ja": "電子"
+ }
+ },
+ "quark": {
+ "name": "quark",
+ "color": "#9b59b6",
+ "lang": {
+ "ja": "クォーク"
+ }
+ },
+ "molecule": {
+ "name": "molecule",
+ "group": [
+ "animal"
+ ],
+ "lang": {
+ "ja": "分子"
+ },
+ "ref": "https://en.wikipedia.org/wiki/molecule",
+ "body": {
+ "text": "a neutrally charged substance made up of two or more atoms",
+ "lang": {
+ "ja": "2つ以上の原子から構成される電荷的に中性な物質"
+ }
+ },
+ "tag": [
+ "water",
+ "wind",
+ "rock",
+ "ice",
+ "fire"
+ ],
+ "water": {
+ "name": "water",
+ "color": "#blue",
+ "lang": {
+ "ja": "水"
+ }
+ },
+ "fire": {
+ "name": "fire",
+ "color": "#red",
+ "lang": {
+ "ja": "火"
+ }
+ },
+ "wind": {
+ "name": "wind",
+ "color": "#green",
+ "lang": {
+ "ja": "風"
+ }
+ },
+ "rock": {
+ "name": "rock",
+ "color": "#black",
+ "lang": {
+ "ja": "岩"
+ }
+ },
+ "ice": {
+ "name": "ice",
+ "color": "#white",
+ "lang": {
+ "ja": "氷"
+ }
+ }
+ }
+ },
+ "atmosphere": {
+ "name": "atmo",
+ "lang": {
+ "ja": "大気圏"
+ },
+ "exoshere": {
+ "name": "exo",
+ "lang": {
+ "ja": "外気圏"
+ },
+ "km": [
+ {
+ "min": 700,
+ "max": 10000
+ }
+ ],
+ "tag": [
+ "universe"
+ ]
+ },
+ "thermoshere": {
+ "name": "thermo",
+ "lang": {
+ "ja": "熱圏"
+ },
+ "km": [
+ {
+ "min": 80,
+ "max": 700
+ }
+ ],
+ "tag": [
+ "aurora"
+ ]
+ },
+ "mesoshere": {
+ "name": "meso",
+ "lang": {
+ "ja": "中間圏"
+ },
+ "km": [
+ {
+ "min": 50,
+ "max": 80
+ }
+ ],
+ "tag": [
+ "meteor"
+ ]
+ },
+ "stratoshere": {
+ "name": "strato",
+ "lang": {
+ "ja": "成層圏"
+ },
+ "km": [
+ {
+ "min": 12,
+ "max": 50
+ }
+ ],
+ "tag": [
+ "ozone"
+ ]
+ },
+ "troposhere": {
+ "name": "tropo",
+ "lang": {
+ "ja": "対流圏"
+ },
+ "km": [
+ {
+ "min": 0,
+ "max": 12
+ }
+ ],
+ "tag": [
+ "sky"
+ ]
+ },
+ "ref": "https://en.wikipedia.org/wiki/atmosphere_of_earth"
+ },
+ "universe": {
+ "name": "universe",
+ "lang": {
+ "ja": "宇宙"
+ },
+ "ref": "https://en.wikipedia.org/wiki/universe",
+ "tag": [
+ "earth",
+ "moon",
+ "sun",
+ "mercury",
+ "venus",
+ "mars",
+ "jupiter",
+ "saturn",
+ "uranus",
+ "neptune",
+ "neutronstar",
+ "blackhole",
+ "galaxy"
+ ],
+ "earth": {
+ "name": "earth",
+ "lang": {
+ "ja": "地球"
+ },
+ "mass": 1.0
+ },
+ "moon": {
+ "name": "moon",
+ "lang": {
+ "lang": {
+ "ja": "月"
+ },
+ "mass": 0.0123
+ },
+ "sun": {
+ "name": "sun",
+ "tag": [
+ "solar"
+ ],
+ "lang": {
+ "ja": "太陽"
+ },
+ "mass": 333000.01
+ },
+ "mars": {
+ "name": "mars",
+ "lang": {
+ "ja": "火星"
+ },
+ "mass": 0.107
+ },
+ "mercury": {
+ "name": "mercury",
+ "lang": {
+ "ja": "水星"
+ },
+ "mass": 0.055
+ },
+ "venus": {
+ "name": "venus",
+ "lang": {
+ "ja": "金星"
+ },
+ "mass": 0.815
+ },
+ "jupiter": {
+ "name": "jupiter",
+ "lang": {
+ "ja": "木星"
+ },
+ "mass": 317.8
+ },
+ "saturn": {
+ "name": "saturn",
+ "lang": {
+ "ja": "土星"
+ },
+ "mass": 95.16
+ },
+ "uranus": {
+ "name": "uranus",
+ "lang": {
+ "ja": "天王星"
+ },
+ "mass": 14.54
+ },
+ "neptune": {
+ "name": "neptune",
+ "lang": {
+ "ja": "海王星"
+ },
+ "mass": 17.15
+ },
+ "neutronstar": {
+ "name": "neutronstar",
+ "lang": {
+ "ja": "中性子星"
+ },
+ "mass": 466666.0
+ },
+ "blackhole": {
+ "name": "blackhole",
+ "lang": {
+ "ja": "ブラックホール"
+ },
+ "mass": 1000000000000.0
+ },
+ "galaxy": {
+ "name": "galaxy",
+ "ref": "https://en.wikipedia.org/wiki/galaxy",
+ "lang": {
+ "ja": "銀河"
+ },
+ "tag": [
+ "milkyway",
+ "andromeda",
+ "bode",
+ "cigar",
+ "whirlpool",
+ "cartwheel",
+ "ringnebula"
+ ],
+ "milkyway": {
+ "name": "milkyway",
+ "lang": {
+ "ja": "天の川"
+ }
+ },
+ "andromeda": {
+ "name": "andromeda",
+ "lang": {
+ "ja": "アンドロメダ"
+ }
+ },
+ "bode": {
+ "name": "bode's",
+ "lang": {
+ "ja": "ボーデ"
+ }
+ },
+ "cigar": {
+ "name": "cigar",
+ "lang": {
+ "ja": "葉巻"
+ }
+ },
+ "whirlpool": {
+ "name": "whirlpool",
+ "lang": {
+ "ja": "子持ち"
+ }
+ },
+ "cartwheel": {
+ "name": "cartwheel",
+ "lang": {
+ "ja": "車輪"
+ }
+ },
+ "ringnebula": {
+ "name": "ringnebula",
+ "lang": {
+ "ja": "環状"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/verse/bgm/aiend.mp3 b/verse/bgm/aiend.mp3
new file mode 100644
index 0000000..ece695a
Binary files /dev/null and b/verse/bgm/aiend.mp3 differ
diff --git a/verse/bgm/aiend.wav b/verse/bgm/aiend.wav
new file mode 100644
index 0000000..83fc495
Binary files /dev/null and b/verse/bgm/aiend.wav differ
diff --git a/verse/bgm/aihouse.mp3 b/verse/bgm/aihouse.mp3
new file mode 100644
index 0000000..3b9d68f
Binary files /dev/null and b/verse/bgm/aihouse.mp3 differ
diff --git a/verse/bgm/aihouse.wav b/verse/bgm/aihouse.wav
new file mode 100644
index 0000000..c5fd910
Binary files /dev/null and b/verse/bgm/aihouse.wav differ
diff --git a/verse/bgm/aiverse.mp3 b/verse/bgm/aiverse.mp3
new file mode 100644
index 0000000..1b6a4a6
Binary files /dev/null and b/verse/bgm/aiverse.mp3 differ
diff --git a/verse/bgm/aiverse.wav b/verse/bgm/aiverse.wav
new file mode 100644
index 0000000..f41c4d0
Binary files /dev/null and b/verse/bgm/aiverse.wav differ
diff --git a/verse/bgm/test.wav b/verse/bgm/test.wav
new file mode 100644
index 0000000..608b2ec
Binary files /dev/null and b/verse/bgm/test.wav differ
diff --git a/verse/img/aiverse.png b/verse/img/aiverse.png
new file mode 100644
index 0000000..66c406b
Binary files /dev/null and b/verse/img/aiverse.png differ
diff --git a/verse/img/ep.mdp b/verse/img/ep.mdp
new file mode 100644
index 0000000..639d781
Binary files /dev/null and b/verse/img/ep.mdp differ
diff --git a/verse/img/ep.png b/verse/img/ep.png
new file mode 100644
index 0000000..7ac4fcb
Binary files /dev/null and b/verse/img/ep.png differ
diff --git a/verse/img/fantasy.png b/verse/img/fantasy.png
new file mode 100644
index 0000000..322b0de
Binary files /dev/null and b/verse/img/fantasy.png differ
diff --git a/verse/img/fly.gif b/verse/img/fly.gif
new file mode 100644
index 0000000..ccf7223
Binary files /dev/null and b/verse/img/fly.gif differ
diff --git a/verse/img/mode_ai.jpeg b/verse/img/mode_ai.jpeg
new file mode 100644
index 0000000..eaafbf2
Binary files /dev/null and b/verse/img/mode_ai.jpeg differ
diff --git a/verse/img/mode_ai.png b/verse/img/mode_ai.png
new file mode 100644
index 0000000..fb31001
Binary files /dev/null and b/verse/img/mode_ai.png differ
diff --git a/verse/img/mode_normal.png b/verse/img/mode_normal.png
new file mode 100644
index 0000000..48cd30c
Binary files /dev/null and b/verse/img/mode_normal.png differ
diff --git a/verse/img/pomudachi.gif b/verse/img/pomudachi.gif
new file mode 100644
index 0000000..536dc5c
Binary files /dev/null and b/verse/img/pomudachi.gif differ
diff --git a/verse/img/recoder.gif b/verse/img/recoder.gif
new file mode 100644
index 0000000..e42f23a
Binary files /dev/null and b/verse/img/recoder.gif differ
diff --git a/verse/img/shinka.png b/verse/img/shinka.png
new file mode 100644
index 0000000..95653f2
Binary files /dev/null and b/verse/img/shinka.png differ
diff --git a/verse/img/shinryu.png b/verse/img/shinryu.png
new file mode 100644
index 0000000..96e8ef8
Binary files /dev/null and b/verse/img/shinryu.png differ
diff --git a/verse/img/ue.mdp b/verse/img/ue.mdp
new file mode 100644
index 0000000..1279f06
Binary files /dev/null and b/verse/img/ue.mdp differ
diff --git a/verse/img/ue.png b/verse/img/ue.png
new file mode 100644
index 0000000..732f45f
Binary files /dev/null and b/verse/img/ue.png differ
diff --git a/verse/img/wa.png b/verse/img/wa.png
new file mode 100644
index 0000000..a271d61
Binary files /dev/null and b/verse/img/wa.png differ
diff --git a/verse/img/wall.png b/verse/img/wall.png
new file mode 100644
index 0000000..4a8e57e
Binary files /dev/null and b/verse/img/wall.png differ
diff --git a/verse/md/ep.md b/verse/md/ep.md
new file mode 100644
index 0000000..3b95d7d
--- /dev/null
+++ b/verse/md/ep.md
@@ -0,0 +1,16 @@
+# syui・ai
+
+(シュイ・アイ)
+
+THE FUZZY ONE
+
+|title|body|
+|---|---|
+|nickname|syai|
+|age|∞|
+|height|123cm|
+|birthday|1/23|
+|lang|ja & en|
+|text|「hello ai !」 一つの言葉しか覚えられない。自分やリスナーのことをアイと呼ぶ。世界を作るのが趣味。普段は地球を歩き回っている。|
+|en|"Hello Ai!" I can only remember one word. I call myself and my listeners Ai. My hobby is creating worlds. I usually walk around the Earth.|
+
diff --git a/verse/md/ue.md b/verse/md/ue.md
new file mode 100644
index 0000000..cdc4253
--- /dev/null
+++ b/verse/md/ue.md
@@ -0,0 +1,54 @@
+# Unreal Engine 5.4 | 初めてのゲーム制作、世界を作る
+
+## vrm4u
+
+キャラクターを表示しよう。
+
+## game animation sample
+
+今後はこの形式が基本になりそう。
+
+## city sample
+
+最初に難易度と負荷を高くする。
+
+## sky atmoshpere + volumetric cloud
+
+`dynamic volumetric sky -> ultra dynamic sky`
+
+## whisper + chatgpt + elevenlabs
+
+- whisper : RuntimeSpeechRecognizer
+
+```sh
+# perplexity.ai
+$ curl https://api.openai.com/v1/chat/completions \
+ -H "Content-Type: application/json" \
+ -H "Authorization: Bearer YOUR_API_KEY" \
+ -d '{
+ "model": "gpt-4o-mini",
+ "messages": [{"role": "user", "content": "Your question here"}],
+ "temperature": 0.7
+ }'
+```
+
+```sh
+# perplexity.ai
+$ curl -X POST "https://api.elevenlabs.io/v1/text-to-speech/VOICE_ID" \
+ -H "xi-api-key: YOUR_API_KEY" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "text": "Hello world!",
+ "model_id": "eleven_monolingual_v1",
+ "voice_settings": {
+ "stability": 0.5,
+ "similarity_boost": 0.5
+ }
+ }' \
+ --output output.mp3
+```
+
+## ue vs unity
+
+ueは手順通りやっても動くことは稀。つまり、動かない。そのため情報も少ない。unityがおすすめ。
+
diff --git a/verse/music/aidream.mp3 b/verse/music/aidream.mp3
new file mode 100644
index 0000000..d6263dd
Binary files /dev/null and b/verse/music/aidream.mp3 differ
diff --git a/verse/music/aimoon.mp3 b/verse/music/aimoon.mp3
new file mode 100644
index 0000000..4078d8e
Binary files /dev/null and b/verse/music/aimoon.mp3 differ
diff --git a/verse/music/aimoon.wav b/verse/music/aimoon.wav
new file mode 100644
index 0000000..1966eb1
Binary files /dev/null and b/verse/music/aimoon.wav differ
diff --git a/verse/music/aipalette.mp3 b/verse/music/aipalette.mp3
new file mode 100644
index 0000000..9ed42d8
Binary files /dev/null and b/verse/music/aipalette.mp3 differ
diff --git a/verse/readme.md b/verse/readme.md
new file mode 100644
index 0000000..9ede601
--- /dev/null
+++ b/verse/readme.md
@@ -0,0 +1,26 @@
+# aiverse
+
+aiverse project.
+
+- https://youtube.com/@syai
+
+## AI
+
+```json
+{
+ "music": "https://suno.com/@syui",
+ "anime": "https://domoai.app",
+ "3d": "https://tripo3d.ai"
+}
+```
+
+## ref
+
+- [octoverse](https://octoverse.github.com/)
+- [hololive](https://hololive.hololivepro.com/talents?gp=myth)
+
+##
+
+character, lyrics, composition, illustrations, game production, modeling, etc.
+
+© syui
diff --git a/verse/video/op.mp4 b/verse/video/op.mp4
new file mode 100644
index 0000000..f394cdc
Binary files /dev/null and b/verse/video/op.mp4 differ
diff --git a/verse/video/opload.mp4 b/verse/video/opload.mp4
new file mode 100644
index 0000000..97ba933
Binary files /dev/null and b/verse/video/opload.mp4 differ