
diff --git a/docs/content/ko/blog/DevLog-2025.08.26/index.md b/docs/content/ko/blog/DevLog-2025.08.26/index.md
index 7f91228d4..00895c96d 100644
--- a/docs/content/ko/blog/DevLog-2025.08.26/index.md
+++ b/docs/content/ko/blog/DevLog-2025.08.26/index.md
@@ -3,7 +3,7 @@ title: DevLog @ 2025.08.26
category: DevLog
date: 2025-08-26
excerpt: |
- `airi-factorio` 의 순수 비전 방향에서 이룬 진전을 공유하며, 생각이 증발하기 전에 붙잡아 둡니다.
+ `airi-factorio`의 순수 비전 방향에서 이룬 진전을 공유하며, 생각이 증발하기 전에 붙잡아 둡니다.
preview-cover:
# TODO
---
@@ -13,25 +13,25 @@ import airiFactorioYoloV0PlaygroundVnc from '../../../en/blog/DevLog-2025.08.26/
import NmsIou from '../../../en/blog/DevLog-2025.08.26/components/nms-iou.vue'
-오랜만입니다, 여러분! AIRI 메인테이너 중 한 명인 [@LemonNeko](https://github.com/LemonNekoGH) 입니다. ~~아, 이렇게 시작하는 것도 슬슬 지겹네요. 꼭 LLM 같잖아요.~~
+오랜만입니다, 여러분! AIRI 메인테이너 중 한 명인 [@LemonNeko](https://github.com/LemonNekoGH)입니다. ~~아, 이렇게 시작하는 것도 슬슬 지겹네요. 꼭 LLM 같잖아요.~~
-지난 [DevLog](../DevLog-2025.07.18/) 에서는 [Factorio Learning Environment](https://arxiv.org/abs/2503.09617) 논문을 간단히 살펴보고 `airi-factorio` 를 어떻게 개선할지 이야기했습니다. 그런데... 오늘 나눌 이야기는 그것이 아니라 순수 비전 방향에서의 진전입니다.
+지난 [DevLog](../DevLog-2025.07.18/) 에서는 [Factorio Learning Environment](https://arxiv.org/abs/2503.09617) 논문을 간단히 살펴보고 `airi-factorio`를 어떻게 개선할지 이야기했습니다. 그런데... 오늘 나눌 이야기는 그것이 아니라 순수 비전 방향에서의 진전입니다.
-올해 6월, [@nekomeowww](https://github.com/nekomeowww) 가 거의 실시간으로 동작하는 [VLM Playground](https://huggingface.co/spaces/moeru-ai/smolvlm-realtime-webgpu-vue) HuggingFace Space 를 공개했는데 정말 멋져 보였습니다. 그래서 먼저 간단한 실시간 이미지 인식(당시엔 객체 탐지와 이미지 인식을 헷갈렸습니다)을 시도하고, 어떻게든 AI 에게 넘겨 판단하게 한 뒤, 어떤 방식으로든 게임에 동작을 출력하기로 했습니다.
+올해 6월, [@nekomeowww](https://github.com/nekomeowww)가 거의 실시간으로 동작하는 [VLM Playground](https://huggingface.co/spaces/moeru-ai/smolvlm-realtime-webgpu-vue) HuggingFace Space를 공개했는데 정말 멋져 보였습니다. 그래서 먼저 간단한 실시간 이미지 인식(당시엔 객체 탐지와 이미지 인식을 헷갈렸습니다)을 시도하고, 어떻게든 AI에게 넘겨 판단하게 한 뒤, 어떤 방식으로든 게임에 동작을 출력하기로 했습니다.
먼저 결과부터 보여 드리겠습니다:
-영상에서 저는 웹 페이지의 VNC 연결로 Factorio 를 플레이하고 있고, 오른쪽에는 객체 탐지 결과가 거의 실시간으로 표시됩니다. [HuggingFace Space](https://huggingface.co/spaces/proj-airi/factorio-yolo-v0-playground) 에도 배포했으니 편하게 써 보세요.
+영상에서 저는 웹 페이지의 VNC 연결로 Factorio를 플레이하고 있고, 오른쪽에는 객체 탐지 결과가 거의 실시간으로 표시됩니다. [HuggingFace Space](https://huggingface.co/spaces/proj-airi/factorio-yolo-v0-playground)에도 배포했으니 편하게 써 보세요.
그럼 이걸 어떻게 구현했을까요?
-## Factorio 클라이언트를 Docker 에 넣기
+## Factorio 클라이언트를 Docker에 넣기
-AI 가 게임 화면을 보게 하려면 Factorio 가 창 크기나 위치 같은 것에 영향받지 않는 통제된 환경에서 돌아가야 합니다. 동시에 이 환경이 바로 쓸 수 있는 상태이길 원했기에, Factorio 를 Docker 에 넣기로 했습니다.
+AI가 게임 화면을 보게 하려면 Factorio가 창 크기나 위치 같은 것에 영향받지 않는 통제된 환경에서 돌아가야 합니다. 동시에 이 환경이 바로 쓸 수 있는 상태이길 원했기에, Factorio를 Docker에 넣기로 했습니다.
-Factorio 는 공식 [Docker 이미지](https://hub.docker.com/r/factoriotools/factorio)를 제공하지만 이는 순수 서버용입니다. AI 가 화면을 보고 게임을 조작하게 하려면 클라이언트가 필요한데, 기존 Docker 이미지를 찾을 수 없었고 (Factorio 라이선스 계약상 클라이언트를 이런 식으로 배포할 수도 없습니다) 직접 패키징해야 했습니다 (그리고 패키징한 클라이언트 이미지도 배포할 수 없어서 Dockerfile 만 공유할 수 있습니다).
+Factorio는 공식 [Docker 이미지](https://hub.docker.com/r/factoriotools/factorio)를 제공하지만 이는 순수 서버용입니다. AI가 화면을 보고 게임을 조작하게 하려면 클라이언트가 필요한데, 기존 Docker 이미지를 찾을 수 없었고 (Factorio 라이선스 계약상 클라이언트를 이런 식으로 배포할 수도 없습니다) 직접 패키징해야 했습니다 (그리고 패키징한 클라이언트 이미지도 배포할 수 없어서 Dockerfile만 공유할 수 있습니다).
그럼 Factorio 클라이언트~~라는 코끼리~~를 Docker~~라는 냉장고~~에 넣으려면 몇 단계가 필요할까요~~?~~
@@ -39,7 +39,7 @@ Factorio 는 공식 [Docker 이미지](https://hub.docker.com/r/factoriotools/fa
2. 가상 디스플레이 준비: 그래픽 애플리케이션은 화면을 표시할 디스플레이가 필요합니다.
3. VNC 서비스 준비: 가상 디스플레이의 내용을 읽어 외부 VNC 클라이언트로 화면을 전송하고, 사용자 입력을 게임에 전달할 수 있습니다.
-뭔가 빠진 것 같나요? 아, 오디오요? 무슨 오디오요? 없습니다. 지금의 AI 는 아직 소리를 듣지 못하니 일단 무시하겠습니다.
+뭔가 빠진 것 같나요? 아, 오디오요? 무슨 오디오요? 없습니다. 지금의 AI는 아직 소리를 듣지 못하니 일단 무시하겠습니다.
### Factorio 클라이언트 다운로드
@@ -56,47 +56,47 @@ sudo apt install -y xvfb x11-apps mesa-utils
```
여기서:
-- `xvfb` 는 가상 프레임버퍼이자 X 서버입니다.
-- `x11-apps` 는 X 관련 도구 모음으로, 설치하면 X 환경도 함께 설치됩니다.
-- `mesa-utils` 는 Mesa 관련 도구 모음입니다. Mesa 는 OpenGL 의 소프트웨어 구현이며, OpenGL 애플리케이션을 테스트하고 디버깅하는 데 도움이 되는 도구를 제공합니다.
+- `xvfb`는 가상 프레임버퍼이자 X 서버입니다.
+- `x11-apps`는 X 관련 도구 모음으로, 설치하면 X 환경도 함께 설치됩니다.
+- `mesa-utils`는 Mesa 관련 도구 모음입니다. Mesa는 OpenGL의 소프트웨어 구현이며, OpenGL 애플리케이션을 테스트하고 디버깅하는 데 도움이 되는 도구를 제공합니다.
### VNC 서비스 준비
-VNC 는 Virtual Network Computing 의 약자로, 마치 그 앞에 앉아 있는 것처럼 다른 컴퓨터를 원격으로 제어할 수 있게 해 주는 원격 데스크톱 프로토콜입니다.
+VNC는 Virtual Network Computing의 약자로, 마치 그 앞에 앉아 있는 것처럼 다른 컴퓨터를 원격으로 제어할 수 있게 해 주는 원격 데스크톱 프로토콜입니다.
```bash
sudo apt install -y x11vnc
```
-여기까지 하면 Docker 에서 Factorio 클라이언트를 실행하고 VNC 로 제어할 수 있습니다.
+여기까지 하면 Docker에서 Factorio 클라이언트를 실행하고 VNC로 제어할 수 있습니다.
-하지만 아직 부족합니다. 제 목표는 브라우저에서 플레이하면서 실시간으로 객체 탐지 추론을 돌리는 것입니다. 그런데 브라우저는 HTTP 프로토콜만 쓸 수 있으므로, VNC 프로토콜을 HTTP 로 변환해 줄 `websockify` 같은 도구가 필요합니다. 또 디버깅 편의를 위해 VNC 화면을 보여 줄 웹 인터페이스도 필요해서 `novnc` 도 설치합니다.
+하지만 아직 부족합니다. 제 목표는 브라우저에서 플레이하면서 실시간으로 객체 탐지 추론을 돌리는 것입니다. 그런데 브라우저는 HTTP 프로토콜만 쓸 수 있으므로, VNC 프로토콜을 HTTP로 변환해 줄 `websockify` 같은 도구가 필요합니다. 또 디버깅 편의를 위해 VNC 화면을 보여 줄 웹 인터페이스도 필요해서 `novnc`도 설치합니다.
```bash
sudo apt install -y websockify novnc
```
-좋습니다! 이제 Docker 이미지가 준비됐습니다. 전체 [Dockerfile](https://github.com/moeru-ai/airi-factorio/blob/a6bf243f14cbc0d765ff7ed13389bca33c1fdfa2/docker/Dockerfile) 과 [사용 안내](https://github.com/moeru-ai/airi-factorio/tree/ba46a4e47b31187dd064b06314b595b551ed3411/apps/factorio-yolo-v0-playground)는 여기서 볼 수 있습니다.
+좋습니다! 이제 Docker 이미지가 준비됐습니다. 전체 [Dockerfile](https://github.com/moeru-ai/airi-factorio/blob/a6bf243f14cbc0d765ff7ed13389bca33c1fdfa2/docker/Dockerfile)과 [사용 안내](https://github.com/moeru-ai/airi-factorio/tree/ba46a4e47b31187dd064b06314b595b551ed3411/apps/factorio-yolo-v0-playground)는 여기서 볼 수 있습니다.
## 객체 탐지 모델 학습
-빠른 검증을 위해 YOLO11n 의 사전 학습 모델을 기반으로 저희 객체 탐지 모델을 학습시켰습니다.
+빠른 검증을 위해 YOLO11n의 사전 학습 모델을 기반으로 저희 객체 탐지 모델을 학습시켰습니다.
### 데이터셋 준비
데이터셋은 이렇게 수집했습니다:
1. [`surface.create_entity`](https://lua-api.factorio.com/latest/classes/LuaSurface.html#create_entity) 함수로 씬의 임의 위치에 기계를 배치하고, 선택 박스 크기와 위치를 함께 얻습니다.
-2. [`game.take_screenshot`](https://lua-api.factorio.com/latest/classes/LuaGameScript.html#take_screenshot) 으로 다양한 줌 레벨과 조명 조건(낮)에서 스크린샷을 찍습니다.
-3. 선택 박스를 바탕으로 어노테이션 데이터를 생성하고 [`helpers.write_file`](https://lua-api.factorio.com/latest/classes/LuaHelpers.html#write_file) 로 파일에 저장합니다.
+2. [`game.take_screenshot`](https://lua-api.factorio.com/latest/classes/LuaGameScript.html#take_screenshot)으로 다양한 줌 레벨과 조명 조건(낮)에서 스크린샷을 찍습니다.
+3. 선택 박스를 바탕으로 어노테이션 데이터를 생성하고 [`helpers.write_file`](https://lua-api.factorio.com/latest/classes/LuaHelpers.html#write_file)로 파일에 저장합니다.
-제 수집 스크립트는 [여기](https://github.com/moeru-ai/airi-factorio/blob/ba46a4e47b31187dd064b06314b595b551ed3411/packages/factorio-rcon-snippets-for-node/src/factorio_yolo_dataset_collector_v0.ts)에 있습니다. `typescript-to-lua` 로 TypeScript 를 Lua 로 컴파일한 뒤 RCON 으로 Factorio 에 넘겨 실행합니다.
+제 수집 스크립트는 [여기](https://github.com/moeru-ai/airi-factorio/blob/ba46a4e47b31187dd064b06314b595b551ed3411/packages/factorio-rcon-snippets-for-node/src/factorio_yolo_dataset_collector_v0.ts)에 있습니다. `typescript-to-lua`로 TypeScript를 Lua로 컴파일한 뒤 RCON으로 Factorio에 넘겨 실행합니다.
스크립트에서는 조립기 3종과 컨베이어를 수집했고, 기계마다 이미지 20장씩, 각 이미지는 UI 없이 1280x1280 해상도로 찍었습니다.
-아 참, 수집 스크립트를 더 잘 디버깅하려고 [VSCode 플러그인](https://github.com/moeru-ai/airi-factorio/blob/ba46a4e47b31187dd064b06314b595b551ed3411/packages/vscode-factorio-rcon-evaluator/README.md)도 만들었습니다. CodeLens 로 클릭 한 번에 스크립트를 컴파일하고 실행할 수 있습니다.
+아 참, 수집 스크립트를 더 잘 디버깅하려고 [VSCode 플러그인](https://github.com/moeru-ai/airi-factorio/blob/ba46a4e47b31187dd064b06314b595b551ed3411/packages/vscode-factorio-rcon-evaluator/README.md)도 만들었습니다. CodeLens로 클릭 한 번에 스크립트를 컴파일하고 실행할 수 있습니다.
-이미지와 어노테이션 데이터를 모은 뒤에는 [YOLO 공식 형식](https://docs.ultralytics.com/datasets/detect/)에 맞춰 데이터셋을 정리하고, [Ultralytics Hub](https://www.ultralytics.com/hub) 에 업로드해 결과를 확인합니다:
+이미지와 어노테이션 데이터를 모은 뒤에는 [YOLO 공식 형식](https://docs.ultralytics.com/datasets/detect/)에 맞춰 데이터셋을 정리하고, [Ultralytics Hub](https://www.ultralytics.com/hub)에 업로드해 결과를 확인합니다:

@@ -114,7 +114,7 @@ model.train(data="./dataset/detect.yaml", epochs=100, imgsz=640, device="mps")
model.export(format="onnx")
```
-640x640 해상도로 MPS 디바이스를 써서(macOS 에서는 MPS 디바이스가 성능이 더 좋습니다) 100 에포크 학습했고, 에포크당 배치는 5개, 대략 70 에포크쯤에서 최적 성능에 도달했으며 ONNX 모델로 내보냈습니다. 학습에는 약 8분이 걸렸고 모델 크기는 약 10MB 입니다.
+640x640 해상도로 MPS 디바이스를 써서(macOS에서는 MPS 디바이스가 성능이 더 좋습니다) 100 에포크 학습했고, 에포크당 배치는 5개, 대략 70 에포크쯤에서 최적 성능에 도달했으며 ONNX 모델로 내보냈습니다. 학습에는 약 8분이 걸렸고 모델 크기는 약 10MB입니다.
데이터셋, 학습 코드, 내보낸 ONNX 모델은 [여기](https://github.com/moeru-ai/airi-factorio/blob/ba46a4e47b31187dd064b06314b595b551ed3411/apps/factorio-yolo-v0-playground)에서 볼 수 있습니다.
@@ -122,34 +122,34 @@ model.export(format="onnx")
이제 위 두 부분을 조립할 수 있습니다. 저는 다음을 사용했습니다:
-1. `@novnc/novnc` 로 브라우저에 VNC 화면을 표시하면서 캔버스 데이터를 뽑아 모델에 먹입니다.
-2. `onnxruntime-web` 으로 브라우저에서 추론을 수행합니다. WebGPU 를 지원해서 GPU 성능을 활용할 수 있습니다.
+1. `@novnc/novnc`로 브라우저에 VNC 화면을 표시하면서 캔버스 데이터를 뽑아 모델에 먹입니다.
+2. `onnxruntime-web`으로 브라우저에서 추론을 수행합니다. WebGPU를 지원해서 GPU 성능을 활용할 수 있습니다.
-처음에는 추론이 400ms 정도로 매우 느렸고 UI 까지 멈춰 버려 VNC 를 쓸 수 없었습니다. 급히 WebWorker 사용법을 익혀 추론과 화면 표시를 분리해 이 문제를 해결했습니다. 그리고 사실 WebGPU 가 켜져 있지 않았다는 것도 알게 됐는데, 그래서 속도가 여전히 느렸던 것이죠.
+처음에는 추론이 400ms 정도로 매우 느렸고 UI까지 멈춰 버려 VNC를 쓸 수 없었습니다. 급히 WebWorker 사용법을 익혀 추론과 화면 표시를 분리해 이 문제를 해결했습니다. 그리고 사실 WebGPU가 켜져 있지 않았다는 것도 알게 됐는데, 그래서 속도가 여전히 느렸던 것이죠.
```typescript
ort.InferenceSession.create(model, { executionProviders: ['webgpu', 'wasm'] })
```
-WebGPU 와 WASM 실행 방식을 모두 허용한다고 명시해야, WebGPU 를 쓸 수 없을 때 자동으로 WASM 실행으로 전환됩니다.
+WebGPU와 WASM 실행 방식을 모두 허용한다고 명시해야, WebGPU를 쓸 수 없을 때 자동으로 WASM 실행으로 전환됩니다.
-WebGPU 를 켜자 추론 속도가 약 80ms 로 개선됐습니다. 여전히 만족스럽지 않았지만 더 최적화할 방법을 몰랐죠. 그때 Cursor 가 이렇게 알려 줬습니다: "픽셀 색상 값을 정규화할 때 계속 255 로 나누고 있습니다. `1/255` 를 먼저 계산해 두고 그 값을 곱해서 나눗셈을 피하세요."
+WebGPU를 켜자 추론 속도가 약 80ms로 개선됐습니다. 여전히 만족스럽지 않았지만 더 최적화할 방법을 몰랐죠. 그때 Cursor가 이렇게 알려 줬습니다: "픽셀 색상 값을 정규화할 때 계속 255로 나누고 있습니다. `1/255`를 먼저 계산해 두고 그 값을 곱해서 나눗셈을 피하세요."
네? 잠깐, 나눗셈이 곱셈보다 느리다고요? 건너뛴 컴퓨터 과학 수업을 정말 보충해야겠네요.
-Cursor 의 제안대로 코드를 고치자 추론 속도가 약 20ms 로 개선됐습니다. 이제 체감이 꽤 좋습니다.
+Cursor의 제안대로 코드를 고치자 추론 속도가 약 20ms로 개선됐습니다. 이제 체감이 꽤 좋습니다.
앞에서 모델 출력을 처리하는 부분은 건너뛰었는데, 이제 살펴봅시다.
### 모델 출력 처리하기
-모델은 원소 84,000개짜리 배열과 `dims` 가 `[1, 10, 8400]` 인 배열을 출력합니다. 즉 84,000개 원소가 10개씩 묶여 있고, 각 묶음은 바운딩 박스 중심의 x, y 좌표, 박스의 너비와 높이, 그리고 6개 카테고리의 신뢰도 점수를 담고 있으며, 총 8,400개의 결과 묶음이 됩니다.
+모델은 원소 84,000개짜리 배열과 `dims`가 `[1, 10, 8400]` 인 배열을 출력합니다. 즉 84,000개 원소가 10개씩 묶여 있고, 각 묶음은 바운딩 박스 중심의 x, y 좌표, 박스의 너비와 높이, 그리고 6개 카테고리의 신뢰도 점수를 담고 있으며, 총 8,400개의 결과 묶음이 됩니다.
-임계값 0.6 으로 신뢰도가 낮은 바운딩 박스를 걸러낸 뒤에도, 겹치는 박스를 제거하기 위해 NMS 방법으로 IOU 를 써야 합니다.
+임계값 0.6으로 신뢰도가 낮은 바운딩 박스를 걸러낸 뒤에도, 겹치는 박스를 제거하기 위해 NMS 방법으로 IOU를 써야 합니다.
-IOU 와 NMS 에 대해서는 [이 글](https://medium.com/@jesse419419/understanding-iou-and-nms-by-a-j-dcebaad60652)을 참고하세요. 간단히 말하면 두 박스의 넓이를 더한 뒤 겹치는 넓이를 빼서 실제 차지하는 넓이를 구하고, 겹치는 넓이를 실제 차지하는 넓이로 나눠 IOU 를 얻는 것입니다.
+IOU와 NMS에 대해서는 [이 글](https://medium.com/@jesse419419/understanding-iou-and-nms-by-a-j-dcebaad60652)을 참고하세요. 간단히 말하면 두 박스의 넓이를 더한 뒤 겹치는 넓이를 빼서 실제 차지하는 넓이를 구하고, 겹치는 넓이를 실제 차지하는 넓이로 나눠 IOU를 얻는 것입니다.
-저는 아주 단순한 NMS 구현을 썼습니다. 모든 바운딩 박스를 신뢰도로 정렬한 뒤 높은 것부터 순회하며, IOU 가 0.7 보다 크면 같은 객체로 보고 걸러냅니다.
+저는 아주 단순한 NMS 구현을 썼습니다. 모든 바운딩 박스를 신뢰도로 정렬한 뒤 높은 것부터 순회하며, IOU가 0.7보다 크면 같은 객체로 보고 걸러냅니다.
```typescript
function nms(boxes: Box[], iouThreshold: number): Box[] {
@@ -180,7 +180,7 @@ function nms(boxes: Box[], iouThreshold: number): Box[] {
Playground 전체 소스 코드는 [여기](https://github.com/moeru-ai/airi-factorio/tree/ba46a4e47b31187dd064b06314b595b551ed3411/apps/factorio-yolo-v0-playground)에서 볼 수 있습니다.
-아래 시각화 컴포넌트에서 라벨을 드래그해 박스 위치를 바꿔 가며 IOU 와 NMS 효과를 직접 만져 볼 수도 있습니다:
+아래 시각화 컴포넌트에서 라벨을 드래그해 박스 위치를 바꿔 가며 IOU와 NMS 효과를 직접 만져 볼 수도 있습니다:
@@ -190,10 +190,10 @@ Playground 전체 소스 코드는 [여기](https://github.com/moeru-ai/airi-fac
이번 실습을 통해 몇 가지 문제를 발견했습니다:
-1. 정사각형이 아닌 이미지를 인식하지 못함: 정사각형이 아닌 이미지를 만나면 모든 결과의 신뢰도가 매우 낮아지거나 심지어 0 이 됩니다.
+1. 정사각형이 아닌 이미지를 인식하지 못함: 정사각형이 아닌 이미지를 만나면 모든 결과의 신뢰도가 매우 낮아지거나 심지어 0이 됩니다.
2. 모델이 1티어와 2티어 조립기를 구분하기는 하지만, 상자처럼 네모난 물체도 조립기로 인식합니다.
3. 실제 플레이에서는 기계 텍스처 위에 전력, 현재 레시피, 장착된 모듈 같은 상태 표시가 겹쳐 있어 모델 인식을 방해합니다.
## 맺으며
-이것이 이번 달 작업의 결과입니다. 꽤 알찼네요! 도움을 준 [@nekomeowww](https://github.com/nekomeowww), [@dsh0416](https://github.com/dsh0416), [makito](https://github.com/sumimakito) 에게 깊이 감사드립니다. 다음으로는 모델 성능을 개선할 방법을 찾고, 어떻게든 AI 가 게임을 조작하게 만들어야 합니다.
+이것이 이번 달 작업의 결과입니다. 꽤 알찼네요! 도움을 준 [@nekomeowww](https://github.com/nekomeowww), [@dsh0416](https://github.com/dsh0416), [makito](https://github.com/sumimakito)에게 깊이 감사드립니다. 다음으로는 모델 성능을 개선할 방법을 찾고, 어떻게든 AI가 게임을 조작하게 만들어야 합니다.
diff --git a/docs/content/ko/blog/DevLog-2025.10.20/index.md b/docs/content/ko/blog/DevLog-2025.10.20/index.md
index 7257d77df..d551b67d7 100644
--- a/docs/content/ko/blog/DevLog-2025.10.20/index.md
+++ b/docs/content/ko/blog/DevLog-2025.10.20/index.md
@@ -3,7 +3,7 @@ title: DevLog @ 2025.10.20
category: DevLog
date: 2025-10-20
excerpt: |
- Tauri 에서 Electron 으로의 마이그레이션, 새 Live2D 모델, 그리고 여러 오픈소스 프로젝트 업데이트까지 AIRI 프로젝트의 최근 진행 상황을 나눕니다.
+ Tauri에서 Electron 으로의 마이그레이션, 새 Live2D 모델, 그리고 여러 오픈소스 프로젝트 업데이트까지 AIRI 프로젝트의 최근 진행 상황을 나눕니다.
preview-cover:
# TODO
---
@@ -12,22 +12,22 @@ preview-cover:
요즘 AI 트레이딩 봇이 엄청 뜨겁죠. 저희도 비슷한 연구를 나눌 게 있는데, 우선 개발 이야기부터 시작하겠습니다...
-## Tauri 에서 Electron 으로의 마이그레이션
+## Tauri에서 Electron 으로의 마이그레이션
-며칠 전 Tauri 가 다시 화제가 됐죠. 저희는 3월에 일찌감치 도입했고 플러그인 설계가 마음에 들어서 crate 도 잔뜩 감쌌습니다. 6월에 드디어 v0.7.2 를 릴리스했지만, 모두가 원하던 음성 대화를 제공하려고 3개월을 고생했습니다... 3개월요... Tauri 의 WebKit 과 지독히 까다로운 Web Audio API, DevTools 와 씨름하면서... 9월까지 계속요...
+며칠 전 Tauri가 다시 화제가 됐죠. 저희는 3월에 일찌감치 도입했고 플러그인 설계가 마음에 들어서 crate도 잔뜩 감쌌습니다. 6월에 드디어 v0.7.2를 릴리스했지만, 모두가 원하던 음성 대화를 제공하려고 3개월을 고생했습니다... 3개월요... Tauri의 WebKit과 지독히 까다로운 Web Audio API, DevTools와 씨름하면서... 9월까지 계속요...
-...결국 더는 못 버티고, 국경절 연휴에 Electron 으로 완전히 갈아탔습니다!
+...결국 더는 못 버티고, 국경절 연휴에 Electron으로 완전히 갈아탔습니다!

-이제 기존 Electron 기반 위에 Linux 지원을 추가했고, 저희가 컨트롤 아일랜드라고 부르는 것을 도입했으며, macOS 전체 화면 모드에서도 인터페이스 위에 겹쳐 띄울 수 있게 됐습니다.
+이제 기존 Electron 기반 위에 Linux 지원을 추가했고, 저희가 Controls Island라고 부르는 것을 도입했으며, macOS 전체 화면 모드에서도 인터페이스 위에 겹쳐 띄울 수 있게 됐습니다.
-호환성이 훌륭해서 정말 마음에 듭니다. 어제는 마침내 자막 오버레이가 동작하게 되어서, 이제 Neuro-sama 처럼 자막으로 AI 가 무엇을 출력하는지 볼 수 있습니다!
+호환성이 훌륭해서 정말 마음에 듭니다. 어제는 마침내 자막 오버레이가 동작하게 되어서, 이제 Neuro-sama처럼 자막으로 AI가 무엇을 출력하는지 볼 수 있습니다!
-컨트롤 아일랜드
+Controls Island
## 새 Live2D 모델
@@ -42,17 +42,17 @@ preview-cover:
## Three.js MMD 지원
-여러분이 가지고 있거나 구할 수 있는 모델이 전부 Live2D/VRM 은 아닐 겁니다. 사실 가장 풍부하고 좋은 건 여전히 MMD 모델이죠.
+여러분이 가지고 있거나 구할 수 있는 모델이 전부 Live2D/VRM은 아닐 겁니다. 사실 가장 풍부하고 좋은 건 여전히 MMD 모델이죠.
-저희도 3D 렌더링에 Three.js 를 쓰고 있지만, 현실적으로 Three.js 에는 더 이상 동작하는 MMD 구현이 없습니다. kwaa 의 작업 덕분에 이제 이를 위한 저장소가 생겼습니다!
+저희도 3D 렌더링에 Three.js를 쓰고 있지만, 현실적으로 Three.js에는 더 이상 동작하는 MMD 구현이 없습니다. kwaa의 작업 덕분에 이제 이를 위한 저장소가 생겼습니다!
관심 있으시다면 함께 유지보수해 주세요! [moeru-ai/three-mmd](https://github.com/moeru-ai/three-mmd)
-## Velin: Vue 로 프롬프트 작성하기
+## Velin: Vue로 프롬프트 작성하기
>"[Vue](https://velin-dev.netlify.app/#/) 로 프롬프트를 작성할 수 있습니다"!
-5월에 저희 프롬프트 라이브러리를 소개했던 걸 기억하시나요? RainbowBird 의 노력과 기여 덕분에 Velin 이 이제 정식으로 Moeru AI 의 일부가 됐습니다! AIRI 의 거의 모든 프롬프트가 Velin 으로 돌아가는데, 크로스 플랫폼 걱정은 마세요. Velin 은 Node.js 환경에서도 잘 동작합니다!
+5월에 저희 프롬프트 라이브러리를 소개했던 걸 기억하시나요? RainbowBird의 노력과 기여 덕분에 Velin이 이제 정식으로 Moeru AI의 일부가 됐습니다! AIRI의 거의 모든 프롬프트가 Velin으로 돌아가는데, 크로스 플랫폼 걱정은 마세요. Velin은 Node.js 환경에서도 잘 동작합니다!

@@ -60,13 +60,13 @@ preview-cover:
>"Events are all you need"
-Vercel AI SDK 와 비슷한 방식으로 브라우저에서 순수 로컬 추론을 할 수 있게 해 주는 프로젝트 [netlify](https://velin-dev.netlify.app/#/) 를 소개한 적이 있습니다.
+Vercel AI SDK와 비슷한 방식으로 브라우저에서 순수 로컬 추론을 할 수 있게 해 주는 프로젝트 [netlify](https://velin-dev.netlify.app/#/) 를 소개한 적이 있습니다.
-이런 로컬 추론은 전부 Web Worker / worker_threads 에서만 돌 수 있고, 이들은 이벤트로 통신합니다. Electron IPC 도 마찬가지인데, 저희는 그게 충분히 우아하지 않다고 느꼈습니다. RainbowBird 덕분에 이제 이벤트 기반 IPC/RPC 구현을 이끄는 라이브러리 eventa 가 생겼습니다. [Eventa](https://github.com/moeru-ai/eventa) 도 이제 정식으로 Moeru AI 의 일부입니다!
+이런 로컬 추론은 전부 Web Worker / worker_threads 에서만 돌 수 있고, 이들은 이벤트로 통신합니다. Electron IPC도 마찬가지인데, 저희는 그게 충분히 우아하지 않다고 느꼈습니다. RainbowBird 덕분에 이제 이벤트 기반 IPC/RPC 구현을 이끄는 라이브러리 eventa가 생겼습니다. [Eventa](https://github.com/moeru-ai/eventa)도 이제 정식으로 Moeru AI의 일부입니다!
## 프로젝트 개발 현황
-이제 Moeru AI 와 Project AIRI 는 거대한 조직으로 성장해, 머신러닝·데이터 처리·프론트엔드·백엔드 등을 아우르는 50개 이상의 자체 저장소를 TypeScript/Python/Rust/Go 등 여러 언어로 운영하고 있습니다.
+이제 Moeru AI와 Project AIRI는 거대한 조직으로 성장해, 머신러닝·데이터 처리·프론트엔드·백엔드 등을 아우르는 50개 이상의 자체 저장소를 TypeScript/Python/Rust/Go 등 여러 언어로 운영하고 있습니다.
전체 팔로워 수는 800명을 넘었습니다. 1년 전 처음 시작할 때는 상상도 못 했던 일입니다. 정말로, 성원해 주셔서 진심으로 감사합니다!
@@ -82,16 +82,16 @@ Project AIRI
## 순수 Rust TTS 구현
-작은 예고: 최근 kwaa 와 팀을 이뤄 잘 알려진 TTS 모델 chatterbox 를 순수 Rust 구현으로 포팅했습니다. 이제 까다로운 Python 환경 설정으로 골머리를 앓지 않아도 됩니다!
+작은 예고: 최근 kwaa와 팀을 이뤄 잘 알려진 TTS 모델 chatterbox를 순수 Rust 구현으로 포팅했습니다. 이제 까다로운 Python 환경 설정으로 골머리를 앓지 않아도 됩니다!
4080S 기준 한 번에 약 5초 추론. 정말 마음에 듭니다.
-Python 모델 아키텍처를 사실상 1:1 로 Rust 에 재현했고, 다른 SOTA TTS 모델까지 활용하는 아주 간결한 로컬 TTS 추론 엔진으로 발전시키고 싶습니다.
+Python 모델 아키텍처를 사실상 1:1로 Rust에 재현했고, 다른 SOTA TTS 모델까지 활용하는 아주 간결한 로컬 TTS 추론 엔진으로 발전시키고 싶습니다.

## 마치며
-오늘의 "one more thing" 은 여기까지입니다. 연달아 이어진 긴 스레드를 즐기셨기를 바랍니다!
+오늘의 "one more thing"은 여기까지입니다. 연달아 이어진 긴 스레드를 즐기셨기를 바랍니다!
내일도 계속 업데이트해서 더 많은 이야깃거리를 가져오겠습니다. VLA/VLM 게이밍 분야에서의 탐구, 어떻게 접근하고 있는지, 어떤 결과를 보고 있는지 소개하겠습니다.
diff --git a/docs/content/ko/blog/DevLog-2026.01.01/index.md b/docs/content/ko/blog/DevLog-2026.01.01/index.md
index 7a213f773..0f0a883ad 100644
--- a/docs/content/ko/blog/DevLog-2026.01.01/index.md
+++ b/docs/content/ko/blog/DevLog-2026.01.01/index.md
@@ -3,17 +3,17 @@ title: DevLog @ 2026.01.01
category: DevLog
date: 2026-01-01
excerpt: |
- AIRI 의 iOS 플랫폼 진전과 그 과정에서 만난 문제·해결책, 그리고 LemonNeko 가 FlowChat 에서 진행한 기억 계층 실험의 성과와 구현 세부 사항을 나눕니다.
+ AIRI의 iOS 플랫폼 진전과 그 과정에서 만난 문제·해결책, 그리고 LemonNeko가 FlowChat에서 진행한 기억 계층 실험의 성과와 구현 세부 사항을 나눕니다.
preview-cover:
light: "@assets('/en/blog/DevLog-2026.01.01/assets/cover-light.png')"
dark: "@assets('/en/blog/DevLog-2026.01.01/assets/cover-dark.png')"
---
::: info AI 번역
-이 글은 중국어 원문을 AI 로 영어로 옮긴 판을 다시 한국어로 번역한 것입니다. 중국어 원문은 [여기](/zh-Hans/blog/DevLog-2026.01.01/)에서 볼 수 있습니다. 번역에 문제가 있다면 편하게 이슈를 열거나 Pull Request 를 보내 주세요.
+이 글은 중국어 원문을 AI로 영어로 옮긴 판을 다시 한국어로 번역한 것입니다. 중국어 원문은 [여기](/zh-Hans/blog/DevLog-2026.01.01/)에서 볼 수 있습니다. 번역에 문제가 있다면 편하게 이슈를 열거나 Pull Request를 보내 주세요.
:::
-새해 복 많이 받으세요! AIRI 메인테이너 중 한 명인 [@LemonNekoGH](https://github.com/LemonNekoGH) 입니다. 새해 첫 DevLog 는 제 차례네요. (B 키를 눌러 웃는 이모티콘 선택) 하하하하하!
+새해 복 많이 받으세요! AIRI 메인테이너 중 한 명인 [@LemonNekoGH](https://github.com/LemonNekoGH)입니다. 새해 첫 DevLog는 제 차례네요. (B 키를 눌러 웃는 이모티콘 선택) 하하하하하!
@@ -23,9 +23,9 @@ preview-cover:
## AIRI Pocket
-이틀 전, AIRI 의 모바일 애플리케이션을 만들기 위해 [Capacitor](https://capacitorjs.com/) 를 도입했습니다 ([#845](https://github.com/moeru-ai/airi/pull/845)). 이를 AIRI Pocket 이라고 부릅니다.
+이틀 전, AIRI의 모바일 애플리케이션을 만들기 위해 [Capacitor](https://capacitorjs.com/) 를 도입했습니다 ([#845](https://github.com/moeru-ai/airi/pull/845)). 이를 AIRI Pocket이라고 부릅니다.
-iOS 를 동작시켰고 알림 기능도 추가했습니다. 즉 그녀가 원한다면 알림을 통해 함께 시간을 보내자고 먼저 말을 걸 수 있습니다.
+iOS를 동작시켰고 알림 기능도 추가했습니다. 즉 그녀가 원한다면 알림을 통해 함께 시간을 보내자고 먼저 말을 걸 수 있습니다.
@@ -33,19 +33,19 @@ iOS 를 동작시켰고 알림 기능도 추가했습니다. 즉 그녀가 원
기본 Capacitor 아이콘은 너무 신경 쓰지 마세요. 나중에 교체할 예정입니다.
-영상에서 저는 AIRI 를 백그라운드 앱 목록에서 제거했고, 잠시 뒤 AIRI 가 알림을 띄웠습니다. 이런 백그라운드 알림은 PWA 에서는 구현하기 어렵지만 네이티브 iOS 앱에서는 아주 쉽습니다.
+영상에서 저는 AIRI를 백그라운드 앱 목록에서 제거했고, 잠시 뒤 AIRI가 알림을 띄웠습니다. 이런 백그라운드 알림은 PWA에서는 구현하기 어렵지만 네이티브 iOS 앱에서는 아주 쉽습니다.
잠깐, 그렇게 순조로웠을까요? 문제가 없었을까요?
### 안전하지 않은 컨텍스트로 인한 기능 제약
-당연히 문제가 있었습니다. 첫 번째는 VAD(음성 활성 감지) 컴포넌트였습니다. VAD 는 `AudioWorkletNode` 에 의존하는데, 이 클래스는 보안 컨텍스트에서만 쓸 수 있습니다. 그런데 Capacitor 의 iOS 앱은 개발 중 핫 리로드가 필요해서 개발 환경이 노출한 포트에 직접 접근합니다. 그 결과 브라우저가 이를 안전하지 않은 컨텍스트로 판단해 `AudioWorkletNode` 클래스를 제공하지 않고, VAD 가 실패합니다.
+당연히 문제가 있었습니다. 첫 번째는 VAD(음성 활성 감지) 컴포넌트였습니다. VAD는 `AudioWorkletNode`에 의존하는데, 이 클래스는 보안 컨텍스트에서만 쓸 수 있습니다. 그런데 Capacitor의 iOS 앱은 개발 중 핫 리로드가 필요해서 개발 환경이 노출한 포트에 직접 접근합니다. 그 결과 브라우저가 이를 안전하지 않은 컨텍스트로 판단해 `AudioWorkletNode` 클래스를 제공하지 않고, VAD가 실패합니다.
패키징 후 프로덕션에서는 보안 컨텍스트가 되지만 개발 중에도 테스트해야 하니 이 문제는 반드시 풀어야 했습니다.
-AI 와 검색 엔진의 도움으로 `vite-plugin-mkcert` 플러그인을 찾았습니다. 자체 서명 인증서를 생성해 시스템에 설치해 주어 브라우저가 보안 컨텍스트로 인식하게 만들어 줍니다.
+AI와 검색 엔진의 도움으로 `vite-plugin-mkcert` 플러그인을 찾았습니다. 자체 서명 인증서를 생성해 시스템에 설치해 주어 브라우저가 보안 컨텍스트로 인식하게 만들어 줍니다.
-그래서 해결됐을까요? 아직입니다. 인증서가 로컬 시스템에는 설치됐지만 iOS 에는 설치되지 않아서 WKWebView 가 이 인증서를 신뢰하지 않습니다. 그런데 IP 가 바뀔 때마다 인증서를 다시 설치해야 한다면 너무 번거롭습니다.
+그래서 해결됐을까요? 아직입니다. 인증서가 로컬 시스템에는 설치됐지만 iOS에는 설치되지 않아서 WKWebView가 이 인증서를 신뢰하지 않습니다. 그런데 IP가 바뀔 때마다 인증서를 다시 설치해야 한다면 너무 번거롭습니다.
개발 중에는 네이티브 코드를 직접 고쳐서 모든 인증서를 신뢰하게 하면 어떨까요? 실제로 동작합니다:
@@ -83,21 +83,21 @@ extension DevBridgeViewController: WKNavigationDelegate {
`#if DEBUG` 매크로에 주의하세요. 개발 중에만 활성화하기 위한 것이고 프로덕션에서는 최적화로 제거됩니다. 그러지 않으면 프로덕션에서도 모든 인증서를 허용하게 되는데, 당연히 안전하지 않습니다.
-## FlowChat 의 기억 계층 실험
+## FlowChat의 기억 계층 실험
-LemonNeko 가 FlowChat 에서 진행한 기억 계층 실험 결과를 보여 드리겠습니다:
+LemonNeko가 FlowChat에서 진행한 기억 계층 실험 결과를 보여 드리겠습니다:
-영상에서 저는 LLM 에게 제 이름을 기억하라고 했습니다. 답변을 생성한 뒤 설정 화면에서 기억했다는 것을 확인할 수 있었고, 새 대화를 시작해도 여전히 떠올릴 수 있었습니다.
+영상에서 저는 LLM에게 제 이름을 기억하라고 했습니다. 답변을 생성한 뒤 설정 화면에서 기억했다는 것을 확인할 수 있었고, 새 대화를 시작해도 여전히 떠올릴 수 있었습니다.
어떻게 구현했을까요? 현재 구현은 꽤 단순합니다:
1. 기억 테이블을 만듭니다.
-2. LLM 에게 도구 함수를 제공합니다. 기억해야 할 것이 있다고 판단하면 무엇을 기억할지 서술문으로 요약한 뒤 이 도구 함수를 호출합니다.
+2. LLM에게 도구 함수를 제공합니다. 기억해야 할 것이 있다고 판단하면 무엇을 기억할지 서술문으로 요약한 뒤 이 도구 함수를 호출합니다.
3. 매번 새 답변을 요청할 때 모든 기억을 시스템 프롬프트에 이어 붙입니다.
-프롬프트를 어떻게 동적으로 이어 붙일까요? [`@velin-dev/vue`](https://github.com/moeru-ai/velin/tree/main/packages/vue) 패키지를 썼습니다. Vue 로 프롬프트를 작성할 수 있게 해 주고, Vue 가 가진 모든 능력을 그대로 쓸 수 있습니다.
+프롬프트를 어떻게 동적으로 이어 붙일까요? [`@velin-dev/vue`](https://github.com/moeru-ai/velin/tree/main/packages/vue) 패키지를 썼습니다. Vue로 프롬프트를 작성할 수 있게 해 주고, Vue가 가진 모든 능력을 그대로 쓸 수 있습니다.
`prompt.velin.md`
@@ -121,12 +121,12 @@ const props = defineProps<{
위 코드는 markdown 작성도 지원합니다.
-혹시 눈치채셨나요? 단계를 소개할 때 "모든 기억을 프롬프트에 이어 붙인다"고 했습니다. 기억이 늘어나면 이 프롬프트는 점점 길어집니다. 어떻게 최적화할까요? 모르겠습니다. 어쩌면 다음 DevLog 의 내용이 될지도요.
+혹시 눈치채셨나요? 단계를 소개할 때 "모든 기억을 프롬프트에 이어 붙인다"고 했습니다. 기억이 늘어나면 이 프롬프트는 점점 길어집니다. 어떻게 최적화할까요? 모르겠습니다. 어쩌면 다음 DevLog의 내용이 될지도요.
## 맺으며
-자, 올해 첫 DevLog 를 제가 ~~대충~~ 썼습니다. 즐겁게 읽으셨기를 바랍니다.
+자, 올해 첫 DevLog를 제가 ~~대충~~ 썼습니다. 즐겁게 읽으셨기를 바랍니다.
-다음 DevLog 에서 만나요.
+다음 DevLog에서 만나요.
*커버 이미지는 [Google Gemini](https://gemini.google.com/) 로 생성했습니다*
diff --git a/docs/content/ko/blog/DevLog-2026.02.16/index.md b/docs/content/ko/blog/DevLog-2026.02.16/index.md
index 2909047c9..852a56ee5 100644
--- a/docs/content/ko/blog/DevLog-2026.02.16/index.md
+++ b/docs/content/ko/blog/DevLog-2026.02.16/index.md
@@ -3,18 +3,18 @@ title: DevLog @ 2026.02.16
category: DevLog
date: 2026-02-16
excerpt: |
- LemonNeko 가 Dome Keeper 방향에서 최근 이룬 진전을 나눕니다.
+ LemonNeko가 Dome Keeper 방향에서 최근 이룬 진전을 나눕니다.
---
-설날 전야 잘 보내고 계신가요! [@LemonNekoGH](https://github.com/LemonNekoGH) 입니다. 춘절 전 마지막 DevLog 를 제가 씁니다.
+설날 전야 잘 보내고 계신가요! [@LemonNekoGH](https://github.com/LemonNekoGH)입니다. 춘절 전 마지막 DevLog를 제가 씁니다.
## 돌아보기
-작년 [DevLog](../DevLog-2025.08.26/) 에서는 `airi-factorio` 의 순수 비전 방향 진전을 나눴습니다. 오늘은 Dome Keeper 방향에서 무엇을 해 왔는지 이야기하려 합니다.
+작년 [DevLog](../DevLog-2025.08.26/) 에서는 `airi-factorio`의 순수 비전 방향 진전을 나눴습니다. 오늘은 Dome Keeper 방향에서 무엇을 해 왔는지 이야기하려 합니다.
-잠깐, LemonNeko? `airi-factorio` 를 계속 안 하고요?
+잠깐, LemonNeko? `airi-factorio`를 계속 안 하고요?
-솔직히 겁이 났습니다. Factorio 는 너무 열려 있고 복잡해서 제가 통제할 수 없었거든요. 그래서 비교적 단순한 게임인 [Dome Keeper](https://store.steampowered.com/app/1637320/Dome_Keeper/) 로 옮겼습니다.
+솔직히 겁이 났습니다. Factorio는 너무 열려 있고 복잡해서 제가 통제할 수 없었거든요. 그래서 비교적 단순한 게임인 [Dome Keeper](https://store.steampowered.com/app/1637320/Dome_Keeper/) 로 옮겼습니다.

@@ -28,45 +28,45 @@ excerpt: |

-아직 많지는 않지만, 기록해 둘 만한 함정과 세부 사항을 벌써 여러 개 만났습니다. 그래서 이 DevLog 를 씁니다.
+아직 많지는 않지만, 기록해 둘 만한 함정과 세부 사항을 벌써 여러 개 만났습니다. 그래서 이 DevLog를 씁니다.
### 세부 사항
- 저장소 구조.
- Dome Keeper 모드를 개발하려면 게임을 디컴파일해야 하는데, 그 소스 코드는 공개할 수 없습니다. 그래서 저장소 구조를 신중히 설계해야 했습니다. 디컴파일한 게임은 최상위 `external/` 폴더에 두고 `.gitignore` 에 넣었으며, 모드 코드는 게임 소스 디렉터리로 링크했습니다.
+ Dome Keeper 모드를 개발하려면 게임을 디컴파일해야 하는데, 그 소스 코드는 공개할 수 없습니다. 그래서 저장소 구조를 신중히 설계해야 했습니다. 디컴파일한 게임은 최상위 `external/` 폴더에 두고 `.gitignore`에 넣었으며, 모드 코드는 게임 소스 디렉터리로 링크했습니다.
- 샘플링 전략.
처음 전략은 0.5초마다 한 프레임을 캡처하는 것이었는데, 프레임에 대상이 없는 경우가 많았습니다. "네거티브 샘플"이 너무 많이 생겨서 데이터셋 크기는 커지는데 유효 정보 밀도는 떨어졌습니다.
- 이후 규칙을 바꿨습니다. `enemy` 또는 `ore_*` 가 포함된 프레임만 "대상 프레임"으로 세고, **대상 프레임 5장당 대상 없는 프레임을 1장만 허용**합니다. 배경을 약간 남기면서도 데이터셋이 희석되는 것을 막습니다.
+ 이후 규칙을 바꿨습니다. `enemy` 또는 `ore_*`가 포함된 프레임만 "대상 프레임"으로 세고, **대상 프레임 5장당 대상 없는 프레임을 1장만 허용**합니다. 배경을 약간 남기면서도 데이터셋이 희석되는 것을 막습니다.
- UI 오버레이가 "잘못된 라벨"을 만드는 문제.
- 일시정지 메뉴나 업그레이드 패널(TechTree)이 열려 있으면 UI 가 장면을 덮는데도 라벨은 여전히 광석과 적을 표시합니다. 라벨 파일이 정상처럼 보이고 시각화할 때만 문제가 드러나서 알아채기 까다롭습니다.
+ 일시정지 메뉴나 업그레이드 패널(TechTree)이 열려 있으면 UI가 장면을 덮는데도 라벨은 여전히 광석과 적을 표시합니다. 라벨 파일이 정상처럼 보이고 시각화할 때만 문제가 드러나서 알아채기 까다롭습니다.
- PauseMenu / TechTreePopup 에 그룹을 태그하고, 그 그룹의 보이는 노드가 있으면 캡처를 건너뛰는 방식으로 해결했습니다.
+ PauseMenu / TechTreePopup에 그룹을 태그하고, 그 그룹의 보이는 노드가 있으면 캡처를 건너뛰는 방식으로 해결했습니다.
- 좌표 불일치로 인한 전역 오프셋.
- 가장 고통스러운 버그였습니다. 모든 bbox 가 같은 방향으로 밀려 있어서 이미지 전체가 잘못 스케일된 것처럼 보였습니다.
+ 가장 고통스러운 버그였습니다. 모든 bbox가 같은 방향으로 밀려 있어서 이미지 전체가 잘못 스케일된 것처럼 보였습니다.
- 근본 원인은 **논리적 뷰 크기**와 **실제 텍스처 픽셀 크기**의 불일치였습니다. bbox 계산에는 `viewport.get_visible_rect().size` 를 썼는데 스크린샷은 텍스처에서 찍었던 것이죠. 해결책은 bbox 를 먼저 뷰 공간에서 이미지 공간으로 스케일한 뒤 letterbox 스케일 + 오프셋을 적용하는 것이었습니다.
+ 근본 원인은 **논리적 뷰 크기**와 **실제 텍스처 픽셀 크기**의 불일치였습니다. bbox 계산에는 `viewport.get_visible_rect().size`를 썼는데 스크린샷은 텍스처에서 찍었던 것이죠. 해결책은 bbox를 먼저 뷰 공간에서 이미지 공간으로 스케일한 뒤 letterbox 스케일 + 오프셋을 적용하는 것이었습니다.
-- letterbox 가 라벨에 영향을 주는 문제.
+- letterbox가 라벨에 영향을 주는 문제.
- 출력을 `640×640` 으로 정규화하면서 가운데 정렬 패딩(회색 `114/255`)을 넣습니다. 같은 변환을 bbox 에도 적용하지 않으면 라벨이 틀어집니다.
+ 출력을 `640×640`으로 정규화하면서 가운데 정렬 패딩(회색 `114/255`)을 넣습니다. 같은 변환을 bbox에도 적용하지 않으면 라벨이 틀어집니다.
- 그래서 해법은 2단계 변환입니다. 스케일 + 오프셋을 적용한 뒤 `640×640` 으로 정규화합니다.
+ 그래서 해법은 2단계 변환입니다. 스케일 + 오프셋을 적용한 뒤 `640×640`으로 정규화합니다.
- 데이터셋 분할 전략.
- 처음에는 세션 단위로 나누려 했지만, 한 세션에 여러 판이 들어갈 수 있고 길이도 꽤 깁니다. 그래서 시간 기반 분할로 바꿨습니다. **구간당 30초**로 잘라 **4/1/1** 로 순환시켜 `train/val/test` 에 배분합니다. 3분이면 분할 한 주기가 완성되니 검증 비용이 훨씬 싸집니다.
+ 처음에는 세션 단위로 나누려 했지만, 한 세션에 여러 판이 들어갈 수 있고 길이도 꽤 깁니다. 그래서 시간 기반 분할로 바꿨습니다. **구간당 30초**로 잘라 **4/1/1**로 순환시켜 `train/val/test`에 배분합니다. 3분이면 분할 한 주기가 완성되니 검증 비용이 훨씬 싸집니다.
- 성능과 프레임 끊김.
- `Image.resize()` 와 `save_png()` 는 CPU/IO 부담이 큽니다. 너무 자주 캡처하면 끊김이 생깁니다. 곧바로 멀티스레딩으로 가기보다 대상 없는 프레임을 줄이는 쪽을 택했습니다.
+ `Image.resize()`와 `save_png()`는 CPU/IO 부담이 큽니다. 너무 자주 캡처하면 끊김이 생깁니다. 곧바로 멀티스레딩으로 가기보다 대상 없는 프레임을 줄이는 쪽을 택했습니다.
### 요약
@@ -74,12 +74,12 @@ excerpt: |
캡처 → 네거티브 필터링 → 자동 분할 → `data.yaml` 자동 생성 → 바로 학습.
학습 로그에 이미 진전이 보입니다.
-광석 클래스(ore_*)는 괜찮은 mAP 를 달성했는데, 파이프라인이 올바르다는 뜻입니다.
-dome / enemy / player 는 아직 샘플이 부족해서 더 필요합니다.
+광석 클래스(ore_*)는 괜찮은 mAP를 달성했는데, 파이프라인이 올바르다는 뜻입니다.
+dome / enemy / player는 아직 샘플이 부족해서 더 필요합니다.
## 다음 단계
-`airi-factorio` 저장소의 순수 비전 Playground 기억하시나요? 그것을 Dome Keeper 로 확장해서 `proj-airi` 조직 전체가 재사용할 수 있게 할 계획입니다. 샘플도 더 필요하고, 특히 `dome`, `enemy`, `player` 가 부족합니다.
+`airi-factorio` 저장소의 순수 비전 Playground 기억하시나요? 그것을 Dome Keeper로 확장해서 `proj-airi` 조직 전체가 재사용할 수 있게 할 계획입니다. 샘플도 더 필요하고, 특히 `dome`, `enemy`, `player`가 부족합니다.
다음 업데이트를 기대해 주세요. 아, 모드 코드는 이미 오픈소스로 공개했으니 편하게 [써 보세요](https://github.com/proj-airi/game-playing-ai-dome-keeper)!
diff --git a/docs/content/ko/blog/DevLog-2026.03.14/index.md b/docs/content/ko/blog/DevLog-2026.03.14/index.md
index 5eb0d5677..450a2ebd6 100644
--- a/docs/content/ko/blog/DevLog-2026.03.14/index.md
+++ b/docs/content/ko/blog/DevLog-2026.03.14/index.md
@@ -3,23 +3,23 @@ title: DevLog @ 2026.03.14
category: DevLog
date: 2026-03-14
excerpt: |
- PR #1194 이야기 — AIRI 의 VRM 3D 스테이지를 디버깅하고 생애주기를 다시 설계하며, 창 단위 캐시를 도입하고 ThreeScene 관측 가능성의 첫 토대를 놓은 과정입니다.
+ PR #1194 이야기 — AIRI의 VRM 3D 스테이지를 디버깅하고 생애주기를 다시 설계하며, 창 단위 캐시를 도입하고 ThreeScene 관측 가능성의 첫 토대를 놓은 과정입니다.
preview-cover:
light: "@assets('/en/blog/DevLog-2026.03.14/assets/cover-light.avif')"
dark: "@assets('/en/blog/DevLog-2026.03.14/assets/cover-dark.avif')"
---
-안녕하세요, [@Lilia-Chen](https://github.com/Lilia-Chen) 입니다.
+안녕하세요, [@Lilia-Chen](https://github.com/Lilia-Chen)입니다.
-최근 AIRI 의 VRM / Three.js 런타임, 즉 AIRI 의 웹·데스크톱·모바일 앱이 공유하는 3D 스테이지를 작업해 왔습니다. 오늘 DevLog 는 2026년 3월 8일에 열고 3월 12일에 머지한 [#1194](https://github.com/moeru-ai/airi/pull/1194) 에 관한 이야기입니다.
+최근 AIRI의 VRM / Three.js 런타임, 즉 AIRI의 웹·데스크톱·모바일 앱이 공유하는 3D 스테이지를 작업해 왔습니다. 오늘 DevLog는 2026년 3월 8일에 열고 3월 12일에 머지한 [#1194](https://github.com/moeru-ai/airi/pull/1194)에 관한 이야기입니다.
이야기는 단순합니다. VRM 스테이지가, 생애주기 실수가 렌더링 버그나 성능 버그, 혹은 "영원히 로딩 중" 같은 무작위 버그로 위장하기 너무 쉬운 지점에 이르렀던 것입니다.
그래서 이 작업은 정리이자 재설계이자 디버깅 일기가 되었습니다.
-작업 전반에 걸쳐 리뷰와 도움을 준 [@neko](https://github.com/nekomeowww) 와 [@Makito](https://github.com/sumimakito) 에게도 감사드립니다.
+작업 전반에 걸쳐 리뷰와 도움을 준 [@neko](https://github.com/nekomeowww)와 [@Makito](https://github.com/sumimakito)에게도 감사드립니다.
-또한 이번이 `stage-tamagotchi` 런타임을 처음으로 제대로 훑어본 경험이었습니다. 스테이지 디버깅이 곧 단일 컴포넌트의 문제가 아니게 되면서, Eventa 와 `injeca` 에 대해 예상보다 훨씬 많이 배우게 됐습니다.
+또한 이번이 `stage-tamagotchi` 런타임을 처음으로 제대로 훑어본 경험이었습니다. 스테이지 디버깅이 곧 단일 컴포넌트의 문제가 아니게 되면서, Eventa와 `injeca`에 대해 예상보다 훨씬 많이 배우게 됐습니다.
## 애초에 왜 이 코드를 건드렸나
@@ -27,10 +27,10 @@ preview-cover:
- VRM 인스턴스가 겹치거나, 옛 모델이 정말로 사라지지 않은 것처럼 동작할 수 있었습니다.
- 스테이지가 `loading` 상태에 갇힐 수 있었습니다.
-- 서로 다른 VRM 모델을 반복해서 불러오면 GPU 와 메모리 사용량이 건강하지 않은 영역까지 올라갈 수 있었습니다.
+- 서로 다른 VRM 모델을 반복해서 불러오면 GPU와 메모리 사용량이 건강하지 않은 영역까지 올라갈 수 있었습니다.
- 깊은 해제(deep disposal)와 자원 소유권이 일관되지 않아, 어느 씬이 실제로 현재 모델을 "소유" 하는지 알기 어려웠습니다.
-디버깅을 시작하자 실패 양상이 더 이상해졌습니다. 개발 환경에서는 특정 버튼을 처음 클릭하는 것만으로도 씬의 일부가 다시 마운트되고, 다시 `loading` 으로 돌아가 그대로 갇혀 버릴 수 있었습니다.
+디버깅을 시작하자 실패 양상이 더 이상해졌습니다. 개발 환경에서는 특정 버튼을 처음 클릭하는 것만으로도 씬의 일부가 다시 마운트되고, 다시 `loading`으로 돌아가 그대로 갇혀 버릴 수 있었습니다.
## 첫 진단: 더 나은 생애주기 관리가 필요했다
@@ -75,7 +75,7 @@ interface ManagedVrmCacheState {
}
```
-각 `ManagedVrmInstance` 는 현재 분리된 런타임 묶음을 담습니다:
+각 `ManagedVrmInstance`는 현재 분리된 런타임 묶음을 담습니다:
- `VRM`,
- 그 `Group`,
@@ -84,15 +84,15 @@ interface ManagedVrmCacheState {
- `modelSrc`,
- 그리고 `scopeKey`.
-`scopeKey` 는 `window.location.href` 에서 파생되고, 캐시 상태는 모듈 상태에 살아 있습니다. 개발 중에는 `import.meta.hot.data` 도 포함합니다. 실제로 이것이 뜻하는 바는:
+`scopeKey`는 `window.location.href`에서 파생되고, 캐시 상태는 모듈 상태에 살아 있습니다. 개발 중에는 `import.meta.hot.data`도 포함합니다. 실제로 이것이 뜻하는 바는:
- 각 브라우저 창이 자신의 캐시 상태를 갖고,
- 각 라우트 스코프가 자신의 분리 슬롯을 갖고,
-- HMR 이 모듈을 다시 불러올 때마다 캐시를 자동으로 날려 버리지 않는다는 것입니다.
+- HMR이 모듈을 다시 불러올 때마다 캐시를 자동으로 날려 버리지 않는다는 것입니다.
-메인 스테이지와 설정 미리보기는 같은 `modelSrc` 를 가리킬 수 있지만, 같은 씬 생애주기에 속하지는 않습니다. 전역 낙관적 캐시는 소유권을 아주 빠르게 애매하게 만듭니다. 창 단위이고 스코프 키로 구분되는 캐시는 훨씬 추론하기 쉽습니다.
+메인 스테이지와 설정 미리보기는 같은 `modelSrc`를 가리킬 수 있지만, 같은 씬 생애주기에 속하지는 않습니다. 전역 낙관적 캐시는 소유권을 아주 빠르게 애매하게 만듭니다. 창 단위이고 스코프 키로 구분되는 캐시는 훨씬 추론하기 쉽습니다.
-캐시 API 는:
+캐시 API는:
- `takeManagedVrmInstance`
- `stashManagedVrmInstance`
@@ -100,8 +100,8 @@ interface ManagedVrmCacheState {
그리고 해제 정책은 이유 기반입니다:
-- `component-unmount` 에서는 가능하면 보관(stash),
-- `model-switch` 에서는 적극적으로 파괴,
+- `component-unmount`에서는 가능하면 보관(stash),
+- `model-switch`에서는 적극적으로 파괴,
- 캐시 항목이 밀려나거나 무효해지면 깊은 해제.
마지막 항목이 중요합니다. 캐시는 이름만 점잖게 바꾼 메모리 누수가 아닙니다. 인스턴스를 안전하게 재사용할 수 없다면 반드시 죽어야 합니다.
@@ -125,7 +125,7 @@ if (!isLoadRequestCurrent(requestId))
- 씬을 기다린 뒤,
- 캐시에서 읽은 뒤,
-- VRM 을 불러온 뒤,
+- VRM을 불러온 뒤,
- 대기 애니메이션을 불러온 뒤,
- 인스턴스를 커밋하기 전.
@@ -160,7 +160,7 @@ load -> validate -> commit
- 단계와 트랜잭션 상태에서 파생되는 변형 락,
- 그리고 VRM 모델 준비 상태와 씬 준비 상태의 더 명확한 분리.
-`ThreeScene` 은 이제 다음과 같은 단계를 추적합니다:
+`ThreeScene`은 이제 다음과 같은 단계를 추적합니다:
- `pending`
- `loading`
@@ -171,33 +171,33 @@ load -> validate -> commit
중요한 준비 신호가 최소 두 개 있습니다:
-- `VRMModel` 이 로드되어 부트스트랩 데이터를 만들어 냈다.
-- `OrbitControls` 가 실제 카메라와 렌더러가 뒷받침하는 DOM 요소에 접근할 수 있게 됐다.
+- `VRMModel`이 로드되어 부트스트랩 데이터를 만들어 냈다.
+- `OrbitControls`가 실제 카메라와 렌더러가 뒷받침하는 DOM 요소에 접근할 수 있게 됐다.
-이 두 신호는 서로 다른 순서로 도착할 수 있으므로, `ThreeScene` 이 바인딩 트랜잭션을 통해 이들을 조율합니다.
+이 두 신호는 서로 다른 순서로 도착할 수 있으므로, `ThreeScene`이 바인딩 트랜잭션을 통해 이들을 조율합니다.
흐름은 대략 이렇습니다:
-1. `VRMModel` 이 `loadStart` 를 발생시켜 바인딩 사이클을 시작합니다.
-2. `VRMModel` 이 이후 부트스트랩 데이터와 `loaded` 를 발생시킵니다.
-3. `OrbitControls` 가 독립적으로 `orbitControlsReady` 를 발생시킵니다.
-4. 바인딩이 실제로 완료될 수 있게 되면 `ThreeScene` 이 `binding` 에 들어가 부트스트랩 상태를 적용하고, 다음 틱에 컨트롤을 갱신하고, 트랜잭션을 닫고, 최종 단계를 확정합니다.
+1. `VRMModel`이 `loadStart`를 발생시켜 바인딩 사이클을 시작합니다.
+2. `VRMModel`이 이후 부트스트랩 데이터와 `loaded`를 발생시킵니다.
+3. `OrbitControls`가 독립적으로 `orbitControlsReady`를 발생시킵니다.
+4. 바인딩이 실제로 완료될 수 있게 되면 `ThreeScene`이 `binding`에 들어가 부트스트랩 상태를 적용하고, 다음 틱에 컨트롤을 갱신하고, 트랜잭션을 닫고, 최종 단계를 확정합니다.
-이로써 `ThreeScene`, 카메라 상태, 컨트롤 사이의 상호작용도 훨씬 추론하기 쉬워졌습니다. 카메라는 씬이 실제로 상호작용 가능해지기 전에 존재할 수 있습니다. `OrbitControls` 는 씬이 완전히 마운트되기 전에 만들어질 수 있습니다. 다만 사용자에게 노출되는 변형은 바인딩 구간이 끝날 때까지 차단됩니다.
+이로써 `ThreeScene`, 카메라 상태, 컨트롤 사이의 상호작용도 훨씬 추론하기 쉬워졌습니다. 카메라는 씬이 실제로 상호작용 가능해지기 전에 존재할 수 있습니다. `OrbitControls`는 씬이 완전히 마운트되기 전에 만들어질 수 있습니다. 다만 사용자에게 노출되는 변형은 바인딩 구간이 끝날 때까지 차단됩니다.
-여기서 `sceneMutationLocked` 가 등장합니다. 데이터베이스적 의미의 강한 락이 아니라 런타임 조율 락입니다. 씬이 완전히 마운트되지 않았거나 바인딩 트랜잭션이 아직 열려 있다면, UI 변형이 씬을 안정된 것으로 취급해서는 안 된다는 뜻입니다.
+여기서 `sceneMutationLocked`가 등장합니다. 데이터베이스적 의미의 강한 락이 아니라 런타임 조율 락입니다. 씬이 완전히 마운트되지 않았거나 바인딩 트랜잭션이 아직 열려 있다면, UI 변형이 씬을 안정된 것으로 취급해서는 안 된다는 뜻입니다.
그 락은 설정 패널의 쓰기를 비활성화하거나 지연시키고, 컨트롤이 너무 일찍 활성화되지 않게 하는 데 쓰입니다.
## 모델 선택기도 정리가 필요했다
-`ThreeScene` 을 고치던 중, 모델 선택기와 미리보기 경로에도 자체적인 생애주기 문제가 있다는 걸 발견했습니다.
+`ThreeScene`을 고치던 중, 모델 선택기와 미리보기 경로에도 자체적인 생애주기 문제가 있다는 걸 발견했습니다.
거기에는 별개의 문제가 두 개 있었습니다.
### 미리보기 씬 정리
-미리보기 렌더러 경로는 VRM 미리보기를 위해 오프스크린 `WebGLRenderer` 를 만들고 있었는데, 정리 경로가 충분히 강하지 않았습니다.
+미리보기 렌더러 경로는 VRM 미리보기를 위해 오프스크린 `WebGLRenderer`를 만들고 있었는데, 정리 경로가 충분히 강하지 않았습니다.
미리보기 해체를 명시적으로 만들어 해결했습니다:
@@ -207,38 +207,38 @@ load -> validate -> commit
- 렌더러 해제,
- 컨텍스트 손실 강제,
- object URL 해제,
-- 오프스크린 캔버스 크기를 0 으로.
+- 오프스크린 캔버스 크기를 0으로.
### 모델 URL 수명과 경쟁 보호
스테이지 모델 URL 로직도 필요 이상으로 취약했습니다.
-이전에는 갱신 중 선택된 URL 이 잠깐 `undefined` 가 될 수 있었는데, 그것만으로도 렌더러에서 불필요한 해체·재로드 사이클이 촉발됐습니다.
+이전에는 갱신 중 선택된 URL이 잠깐 `undefined`가 될 수 있었는데, 그것만으로도 렌더러에서 불필요한 해체·재로드 사이클이 촉발됐습니다.
URL 교체와 해제를 더 규율 있게 만들어 해결했습니다:
- 선택된 모델을 안정된 상태로 취급,
-- 다음 URL 이 실제로 준비됐을 때만 URL 교체,
+- 다음 URL이 실제로 준비됐을 때만 URL 교체,
- 요청 시퀀스로 비동기 갱신 보호,
-- 옛 blob URL 을 성급하게가 아니라 신중하게 해제.
+- 옛 blob URL을 성급하게가 아니라 신중하게 해제.
## 죽지 않던 버그: `TresCanvas` 크기 = 0
-이 모든 작업을 마치고 나면 스테이지가 드디어 `loading` 에 갇히지 않을 거라 기대했습니다.
+이 모든 작업을 마치고 나면 스테이지가 드디어 `loading`에 갇히지 않을 거라 기대했습니다.
여전히 갇혔습니다.
-그 시점에 다시 추적으로 돌아가 렌더 경로를 더 과감하게 해부하기 시작했습니다. 증상은 `TresCanvas` 가 결코 정말로 준비 상태가 되지 않는 것이었고, 결국 크기 관련 실패로 드러났습니다. 캔버스 경로가 사실상 `0x0` 렌더 영역을 보고 있었던 것입니다.
+그 시점에 다시 추적으로 돌아가 렌더 경로를 더 과감하게 해부하기 시작했습니다. 증상은 `TresCanvas`가 결코 정말로 준비 상태가 되지 않는 것이었고, 결국 크기 관련 실패로 드러났습니다. 캔버스 경로가 사실상 `0x0` 렌더 영역을 보고 있었던 것입니다.
이걸 분리해 내는 데 시간이 좀 걸렸습니다.
-중요한 단서 하나는, 개발 환경에서 `@tresjs/core` 가 `vite:afterUpdate` 에 반응하는 HMR 경로를 등록한다는 점이었습니다. 이는 `.vue` 나 `.ts` 변경에만 국한되지 않습니다. UnoCSS 가 `__uno.css` 를 재생성하는 것도 서브트리 리마운트를 촉발할 수 있습니다. 특정 버튼을 처음 클릭하는 것만으로도 개발 중 스테이지가 불안정해질 수 있었던 이유가 이것으로 설명됐습니다. 새 클래스가 CSS 갱신을 만들고, 그것이 다시 Three 씬의 일부를 리마운트한 것이죠.
+중요한 단서 하나는, 개발 환경에서 `@tresjs/core`가 `vite:afterUpdate`에 반응하는 HMR 경로를 등록한다는 점이었습니다. 이는 `.vue`나 `.ts` 변경에만 국한되지 않습니다. UnoCSS가 `__uno.css`를 재생성하는 것도 서브트리 리마운트를 촉발할 수 있습니다. 특정 버튼을 처음 클릭하는 것만으로도 개발 중 스테이지가 불안정해질 수 있었던 이유가 이것으로 설명됐습니다. 새 클래스가 CSS 갱신을 만들고, 그것이 다시 Three 씬의 일부를 리마운트한 것이죠.
하지만 그건 아직 진짜 교착이 아니었습니다.
실제 교착은 로딩 UI 자체가 원인이었습니다.
-스테이지 페이지는 `WidgetStage` 를 `v-show="!isLoading"` 으로 감싸고 있었습니다. 즉 스테이지가 로딩을 벗어나기를 기다리는 동안 `TresCanvas` 의 부모가 `display: none` 이 된다는 뜻입니다. 그런데 Tres 는 부모 요소로부터 크기를 측정합니다. 부모가 숨겨져 있으면 측정된 크기는 `0x0` 입니다. 크기가 `0x0` 으로 머물면 `@ready` 는 결코 발생하지 않습니다. `@ready` 가 발생하지 않으면 스테이지는 결코 로딩을 벗어나지 못합니다.
+스테이지 페이지는 `WidgetStage`를 `v-show="!isLoading"`으로 감싸고 있었습니다. 즉 스테이지가 로딩을 벗어나기를 기다리는 동안 `TresCanvas`의 부모가 `display: none`이 된다는 뜻입니다. 그런데 Tres는 부모 요소로부터 크기를 측정합니다. 부모가 숨겨져 있으면 측정된 크기는 `0x0`입니다. 크기가 `0x0`으로 머물면 `@ready`는 결코 발생하지 않습니다. `@ready`가 발생하지 않으면 스테이지는 결코 로딩을 벗어나지 못합니다.
그래서 교착은 이런 모양이었습니다:
@@ -253,9 +253,9 @@ loading 시작
진짜 원인이 분명해지고 나니 수정은 복잡하지 않았습니다:
-- 스테이지를 DOM 에 마운트된 상태로 유지하고,
-- 로딩 UI 를 그 위의 오버레이 레이어로 옮기고,
-- 사라질 수 있는 부모에 의존하게 두지 말고 `Screen` 을 통해 `TresCanvas` 에 명시적인 너비와 높이를 준다.
+- 스테이지를 DOM에 마운트된 상태로 유지하고,
+- 로딩 UI를 그 위의 오버레이 레이어로 옮기고,
+- 사라질 수 있는 부모에 의존하게 두지 말고 `Screen`을 통해 `TresCanvas`에 명시적인 너비와 높이를 준다.
이 변경으로 이번 디버깅 세션 전체에서 가장 짜증스러웠던 "여전히 멈춘다" 버그 하나가 드디어 사라졌습니다.
@@ -263,7 +263,7 @@ loading 시작
데스크톱 쪽 문제 대부분을 고친 뒤 웹 앱으로 돌아갔더니 곧바로 또 다른 회귀를 발견했습니다. 이번 증상은 달랐습니다. VRM 설정 페이지가 잠긴 것처럼 보였고, 쓰기 락이 결코 풀리지 않는 것 같았습니다.
-`sceneMutationLocked` 를 가리키는 증상이었지만, 진짜 근본 원인은 `ThreeScene` 안이 아니었습니다. `apps/stage-web/src/App.vue` 에 있었습니다.
+`sceneMutationLocked`를 가리키는 증상이었지만, 진짜 근본 원인은 `ThreeScene` 안이 아니었습니다. `apps/stage-web/src/App.vue`에 있었습니다.
앱이 여전히 이걸 쓰고 있었습니다:
@@ -284,13 +284,13 @@ loading 시작
## 추적에 Eventa 활용하기
-이 PR 에서 특별히 원했던 부분이 추적(tracing)입니다.
+이 PR에서 특별히 원했던 부분이 추적(tracing)입니다.
-현재 추적 작업은 아직 꽤 기초적이지만, VRM 스테이지를 순전히 직감과 `console.log` 로 디버깅해야 했던 것보다는 이미 훨씬 낫습니다.
+현재 추적 작업은 아직 꽤 기초적이지만, VRM 스테이지를 순전히 직감과 `console.log`로 디버깅해야 했던 것보다는 이미 훨씬 낫습니다.
-추적 레이어는 이제 `@proj-airi/stage-ui-three` 안에 있고, Eventa 를 이벤트 계약으로 씁니다. 성능 쪽으로는 렌더러 정보 스냅샷, 히트 테스트 readback 타이밍, 프레임별 VRM 업데이트 분해 같은 것을 기록합니다. 생애주기 쪽으로는 load 와 dispose, 캐시의 `take` / `stash` / `clear`, 씬 단계 변화, 트랜잭션 begin / end / reset 을 추적합니다. 데스크톱에서는 이 이벤트들이 Eventa 를 통해 간단한 진단 뷰로 전달됩니다.
+추적 레이어는 이제 `@proj-airi/stage-ui-three` 안에 있고, Eventa를 이벤트 계약으로 씁니다. 성능 쪽으로는 렌더러 정보 스냅샷, 히트 테스트 readback 타이밍, 프레임별 VRM 업데이트 분해 같은 것을 기록합니다. 생애주기 쪽으로는 load와 dispose, 캐시의 `take` / `stash` / `clear`, 씬 단계 변화, 트랜잭션 begin / end / reset을 추적합니다. 데스크톱에서는 이 이벤트들이 Eventa를 통해 간단한 진단 뷰로 전달됩니다.
-여기서 앞으로의 TODO 는 `ThreeScene` 을 위한 제대로 된 관측 도구를 만드는 것입니다:
+여기서 앞으로의 TODO는 `ThreeScene`을 위한 제대로 된 관측 도구를 만드는 것입니다:
- 더 나은 생애주기 introspection,
- 더 나은 성능 타임라인,
@@ -299,12 +299,12 @@ loading 시작
## 맺으며
-그래서 `#1194` 는 실제로 무엇을 했을까요?
+그래서 `#1194`는 실제로 무엇을 했을까요?
- 메모리 누수와 해제 경로를 정리했습니다.
- 창 단위 VRM 재사용 캐시를 도입했습니다.
- 비동기 로딩의 경쟁 가능성을 줄였습니다.
-- `ThreeScene` 에 더 명시적인 생애주기 모델을 부여했습니다.
+- `ThreeScene`에 더 명시적인 생애주기 모델을 부여했습니다.
- `TresCanvas size=0` 로딩 교착을 고쳤습니다.
- 웹의 `KeepAlive` 회귀를 드러냈습니다.
- 이 런타임을 위한 첫 쓸 만한 추적 경로를 마련했습니다.
@@ -313,4 +313,4 @@ loading 시작
특히 추적과 앞으로의 `ThreeScene` O11y 도구 쪽으로 개선할 것이 아직 많이 남았지만, 최소한 이제 이 런타임에는 다시 주인이 있는 느낌입니다.
-코드를 직접 읽어 보고 싶으시면 [#1194](https://github.com/moeru-ai/airi/pull/1194) 부터 시작하세요. VRM 관련 이슈는 [#1173](https://github.com/moeru-ai/airi/issues/1173) 에서 계속 추적하고 있습니다.
+코드를 직접 읽어 보고 싶으시면 [#1194](https://github.com/moeru-ai/airi/pull/1194)부터 시작하세요. VRM 관련 이슈는 [#1173](https://github.com/moeru-ai/airi/issues/1173)에서 계속 추적하고 있습니다.
diff --git a/docs/content/ko/blog/DevLog-2026.03.23/index.md b/docs/content/ko/blog/DevLog-2026.03.23/index.md
index 8ccc349de..0176ff5b8 100644
--- a/docs/content/ko/blog/DevLog-2026.03.23/index.md
+++ b/docs/content/ko/blog/DevLog-2026.03.23/index.md
@@ -9,13 +9,13 @@ preview-cover:
dark: "@assets('/en/blog/DevLog-2026.03.23/assets/cover-dark.avif')"
---
-안녕하세요, [@PurCHES5](https://github.com/PurCHES5) 입니다.
+안녕하세요, [@PurCHES5](https://github.com/PurCHES5)입니다.
최근 AIRI 팀에 합류해 모바일 개발을 맡게 됐습니다. 이 프로젝트와 오픈소스 워크플로 전반에 대한 지식이 아직 얕은 상태에서, 첫 과제는 모바일 빌드 성능을 개선하기 위해 게임 엔진이나 다른 기술적 해법을 통합할 수 있는 가능성을 검토하는 것입니다.
-현재 AIRI 모바일 통합의 문제는 주로 성능입니다. 최신 모바일 버전인 [`stage-pocket`](https://github.com/moeru-ai/airi/tree/e952fe779e64494e778e44956eb1caf3338c61a7/apps/stage-pocket) 은 사실상 메인 Vue.js 애플리케이션을 그대로 복사해 Capacitor 로 패키징한 것입니다.
+현재 AIRI 모바일 통합의 문제는 주로 성능입니다. 최신 모바일 버전인 [`stage-pocket`](https://github.com/moeru-ai/airi/tree/e952fe779e64494e778e44956eb1caf3338c61a7/apps/stage-pocket)은 사실상 메인 Vue.js 애플리케이션을 그대로 복사해 Capacitor로 패키징한 것입니다.
-모바일 기기, 특히 iOS 기기와 저사양 하드웨어에서는 Live2D 와 VRM 컴포넌트가 WebView 에 할당된 메모리를 빠르게 소진해 크래시로 이어집니다.
+모바일 기기, 특히 iOS 기기와 저사양 하드웨어에서는 Live2D와 VRM 컴포넌트가 WebView에 할당된 메모리를 빠르게 소진해 크래시로 이어집니다.
---
@@ -24,7 +24,7 @@ preview-cover:
### 관찰된 현상
- Live2D / VRM 모델 렌더링 시 높은 메모리 사용량
-- iOS 와 저사양 Android 기기에서 잦은 크래시
+- iOS와 저사양 Android 기기에서 잦은 크래시
- 장시간 구동 후 성능 저하
### 의심되는 원인
@@ -72,7 +72,7 @@ GPU
### 기기별 제약
- iOS WebView 메모리 상한
-- RAM 이 제한된 저사양 Android 기기
+- RAM이 제한된 저사양 Android 기기
---
@@ -103,8 +103,8 @@ GPU
| 전략 | 설명 |
|---|---|
| 엔진 전면 교체 | WebView 렌더러를 네이티브 엔진으로 완전히 대체 |
-| 하이브리드 WebView | 엔진이 렌더링을, WebView 가 UI 를 담당 |
-| 네이티브 렌더링 모듈 | 엔진이 배경 레이어로 동작하고 그 위에 Vue.js UI 를 겹침 |
+| 하이브리드 WebView | 엔진이 렌더링을, WebView가 UI를 담당 |
+| 네이티브 렌더링 모듈 | 엔진이 배경 레이어로 동작하고 그 위에 Vue.js UI를 겹침 |
### 필요한 기능
@@ -148,7 +148,7 @@ GPU
## 프로토타입 빌드
-Unity 3D 로 프로토타입 3종을 만들었고, 내보내기 용량을 줄이기 위해 압축을 적용했습니다.
+Unity 3D로 프로토타입 3종을 만들었고, 내보내기 용량을 줄이기 위해 압축을 적용했습니다.
### Unity WebGL 내보내기 설정

@@ -164,13 +164,13 @@ Unity 3D 로 프로토타입 3종을 만들었고, 내보내기 용량을 줄이
**Android 렌더러 — VRM:**

-일관성을 위해 모든 프로토타입 빌드에 동일한 Vue.js 프론트엔드를 적용했습니다. Unity WebGL 내보내기의 경우 [`unity-webgl`](https://github.com/Marinerer/unity-webgl) 을 써서 WebView 의 기존 내용을 Unity WebGL 로 바로 대체했습니다. Unity Android 렌더러의 경우 Three.js 와 VRM 모듈이 들어 있던 기존 뷰를 완전히 제거하고, Unity 가 배경 레이어로 렌더링하며 그 위에 Vue.js UI 를 렌더링합니다.
+일관성을 위해 모든 프로토타입 빌드에 동일한 Vue.js 프론트엔드를 적용했습니다. Unity WebGL 내보내기의 경우 [`unity-webgl`](https://github.com/Marinerer/unity-webgl)을 써서 WebView의 기존 내용을 Unity WebGL로 바로 대체했습니다. Unity Android 렌더러의 경우 Three.js와 VRM 모듈이 들어 있던 기존 뷰를 완전히 제거하고, Unity가 배경 레이어로 렌더링하며 그 위에 Vue.js UI를 렌더링합니다.
---
## 벤치마크 결과
-모든 측정은 동일 조건에서 Samsung A34 로 수행했습니다. 성능 차이를 더 뚜렷하게 드러내기 위해 의도적으로 저사양 기기를 골랐습니다.
+모든 측정은 동일 조건에서 Samsung A34로 수행했습니다. 성능 차이를 더 뚜렷하게 드러내기 위해 의도적으로 저사양 기기를 골랐습니다.
### Live2D 렌더링
@@ -212,8 +212,8 @@ Unity 3D 로 프로토타입 3종을 만들었고, 내보내기 용량을 줄이
### 핵심 관찰
-- **VRM 이 결정적인 병목입니다.** 기준이 되는 Three.js VRM 렌더러는 전체 RAM 724 MB, 그래픽 메모리 566 MB 를 쓰는데, 대부분의 모바일 WebView 가 크래시 없이 버틸 수 있는 수준을 훨씬 넘습니다. Unity WebGL 은 이를 402 MB / 247 MB 로, Android 렌더러는 651 MB / 292 MB 로 낮춥니다.
-- **Unity WebGL 은 VRM 에서 가장 좋은 메모리 프로필을 제공**하며 아키텍처 변경도 최소한입니다. 대신 CPU 사용률이 약간 높습니다.
+- **VRM이 결정적인 병목입니다.** 기준이 되는 Three.js VRM 렌더러는 전체 RAM 724 MB, 그래픽 메모리 566 MB를 쓰는데, 대부분의 모바일 WebView가 크래시 없이 버틸 수 있는 수준을 훨씬 넘습니다. Unity WebGL은 이를 402 MB / 247 MB로, Android 렌더러는 651 MB / 292 MB로 낮춥니다.
+- **Unity WebGL은 VRM에서 가장 좋은 메모리 프로필을 제공**하며 아키텍처 변경도 최소한입니다. 대신 CPU 사용률이 약간 높습니다.
- **Unity Android 렌더러는 프레임레이트와 CPU 효율이 가장 좋습니다.** 대신 전체 RAM 사용량이 높은데, Unity 런타임 자체의 오버헤드 때문이라 예상된 결과이며 GPU 작업은 WebView 밖으로 옮겨집니다.
- **Live2D 성능은 세 방식 모두 비슷합니다.** 기준인 Three.js 구현도 대부분의 Android 기기에서 충분하지만, 전환의 주된 이득은 앞으로 늘어날 콘텐츠를 위한 여유와 저사양 기기에서의 안정성입니다.
@@ -225,8 +225,8 @@ Unity 3D 로 프로토타입 3종을 만들었고, 내보내기 용량을 줄이
|---|---|
| 앱/내보내기 용량 증가 | Unity 런타임이 상당한 바이너리 무게를 추가 |
| 기여자 요건 | Unity / C# 과 셰이더 전문성이 필요 |
-| 크로스 플랫폼 유지보수 | Android 와 iOS Unity 빌드를 병행 유지해야 함 |
-| 브리지 복잡도 | Vue 와 Unity 사이 양방향 통신에 안정적인 API 가 필요 |
+| 크로스 플랫폼 유지보수 | Android와 iOS Unity 빌드를 병행 유지해야 함 |
+| 브리지 복잡도 | Vue와 Unity 사이 양방향 통신에 안정적인 API가 필요 |
---
@@ -248,15 +248,15 @@ Unity 3D 로 프로토타입 3종을 만들었고, 내보내기 용량을 줄이
### 1. 브리지 복잡도 평가
-[Unity as a Library 통합](https://github.com/Unity-Technologies/uaal-example) 또는 유사한 플러그인을 조사해 양방향 통신(예: 채팅으로 촉발된 표정을 Vue 에서 Unity 로 전달)을 가능하게 합니다.
+[Unity as a Library 통합](https://github.com/Unity-Technologies/uaal-example) 또는 유사한 플러그인을 조사해 양방향 통신(예: 채팅으로 촉발된 표정을 Vue에서 Unity로 전달)을 가능하게 합니다.
### 2. iOS 전용 프로토타이핑
-iOS 는 WebView 메모리에 관해 가장 제약이 심한 환경이므로, 다음 프로토타입은 Unity 네이티브 레이어가 "Total Safari Memory" 제한을 우회하는지 확인하기 위해 iPhone 에서 검증해야 합니다.
+iOS는 WebView 메모리에 관해 가장 제약이 심한 환경이므로, 다음 프로토타입은 Unity 네이티브 레이어가 "Total Safari Memory" 제한을 우회하는지 확인하기 위해 iPhone에서 검증해야 합니다.
### 3. 빌드 용량 최적화
-Unity 의 에셋 관리 시스템을 탐색해 초기 설치 용량을 최소로 유지합니다.
+Unity의 에셋 관리 시스템을 탐색해 초기 설치 용량을 최소로 유지합니다.
### 4. 커뮤니티 / 기여자 모집
diff --git a/docs/content/ko/blog/DreamLog-0x1/index.md b/docs/content/ko/blog/DreamLog-0x1/index.md
index f9ab20ec4..6afa33471 100644
--- a/docs/content/ko/blog/DreamLog-0x1/index.md
+++ b/docs/content/ko/blog/DreamLog-0x1/index.md
@@ -1,9 +1,9 @@
---
title: 'DreamLog 0x1'
-description: 'Project AIRI 의 뒷이야기!'
+description: 'Project AIRI의 뒷이야기!'
category: DreamLog
date: 2025-06-16
-excerpt: 'Project AIRI 의 뒷이야기! 왜 이 프로젝트를 시작했을까요?'
+excerpt: 'Project AIRI의 뒷이야기! 왜 이 프로젝트를 시작했을까요?'
preview-cover:
light: "@assets('/en/blog/DreamLog-0x1/assets/dreamlog1-light.avif')"
dark: "@assets('/en/blog/DreamLog-0x1/assets/dreamlog1-dark.avif')"
@@ -23,28 +23,28 @@ import projectAIRIBannerDark from '../../../en/blog/DreamLog-0x1/assets/banner-d
import ReLUStickerWow from '../../../en/blog/DreamLog-0x1/assets/relu-sticker-wow.avif'
-안녕하세요, 또 저 Neko 입니다!
+안녕하세요, 또 저 Neko입니다!
우선, 북반구에 계신 분들 즐거운 여름 보내세요!
> 새롭고 다양한 것들을 시도해 볼 수 있는 멋진 여름방학이 되기를 바랍니다!
> 더 구체적으로는, 세상을 바꿔 보세요!
-저 [@nekomeowww](https://github.com/nekomeowww) 는 학교를 떠난 지 벌써 8년이 됐습니다.
+저 [@nekomeowww](https://github.com/nekomeowww)는 학교를 떠난 지 벌써 8년이 됐습니다.
이미 여러 해 일해 왔으니 이제 진짜 여름방학은 없겠죠. 그래도 기억나는 게 있다면 예전 여름방학에
있었던 이야기를 떠올리고 나누는 걸 여전히 좋아합니다.
-아마 제가 무슨 말을, 어떤 이야기를 하려는지 짐작하셨을 겁니다... 그런데 *DreamLog* 는 정확히
+아마 제가 무슨 말을, 어떤 이야기를 하려는지 짐작하셨을 겁니다... 그런데 *DreamLog*는 정확히
뭘까요? 이미 DevLog 글에 익숙한 독자라면, 한 달에 한 번 올리는 지금 주기를 생각할 때
이 글도 "DevLog" 여야 하는 게 아닐까 싶으실 겁니다.
-6월은 Project AIRI 에게 특별한 의미가 있습니다(이야기 속에서 밝히겠습니다). 그리고 GitHub 스타
+6월은 Project AIRI에게 특별한 의미가 있습니다(이야기 속에서 밝히겠습니다). 그리고 GitHub 스타
1000개라는 다음 마일스톤에 다가가고 있는 지금이야말로 여기까지의 여정을 돌아보기 좋은 기회라고
생각했습니다.
-그래서 저와 Project AIRI 의 꿈에 대한 연대기를 나누기 위해 새로운 카테고리의 글을 만들기로 했습니다.
+그래서 저와 Project AIRI의 꿈에 대한 연대기를 나누기 위해 새로운 카테고리의 글을 만들기로 했습니다.
-그래서 이 새 시리즈의 이름을 ***DreamLog*** 라고 부르기로 했습니다.
+그래서 이 새 시리즈의 이름을 ***DreamLog***라고 부르기로 했습니다.
> 네, 자기 전에 읽거나 듣는 또 하나의 이야기책이라고 생각하셔도 좋습니다. 오디오북도 좋겠네요 하하.
@@ -61,10 +61,10 @@ import ReLUStickerWow from '../../../en/blog/DreamLog-0x1/assets/relu-sticker-wo
> 너드 여러분! 무슨 말인지 아시죠. 여러분도 저와 같았나요?
여름은 친구들과 놀려고 Minecraft 서버 여는 법을 배운 시기이기도 합니다 (정말 정말 많이 했습니다.
-1.7.11 과 1.8, 바닐라와 Forge 모드 둘 다요). 그게 리눅스 커맨드 라인을 배우게 만든 동기이자 힘이었습니다.
+1.7.11과 1.8, 바닐라와 Forge 모드 둘 다요). 그게 리눅스 커맨드 라인을 배우게 만든 동기이자 힘이었습니다.
그때 얻은 지식 상당수가 지금도 도움이 되고 있어서, 그 시간에 감사하고 있습니다.
-하지만 Minecraft 와 리눅스가 제 여정의 끝은 아니었습니다.
+하지만 Minecraft와 리눅스가 제 여정의 끝은 아니었습니다.
[Factorio](https://www.factorio.com/),
[Elite Dangerous](https://www.elitedangerous.com/),
[Overwatch](https://overwatch.blizzard.com/en-us/)
@@ -78,7 +78,7 @@ import ReLUStickerWow from '../../../en/blog/DreamLog-0x1/assets/relu-sticker-wo
> `Lay down your pieces`
> `And let's begin object creation`
>
-> -- 제가 사랑하는 노래 [`world.execute(me)`](https://www.youtube.com/watch?v=ESx_hy1n7HA) 의 가사, [DAZBEE](https://www.youtube.com/channel/UCUEvXLdpCtbzzDkcMI96llg) 커버
+> -- 제가 사랑하는 노래 [`world.execute(me)`](https://www.youtube.com/watch?v=ESx_hy1n7HA)의 가사, [DAZBEE](https://www.youtube.com/channel/UCUEvXLdpCtbzzDkcMI96llg) 커버
2017년 여름, 저는 처음으로 함께 놀아 줄 가상의 존재를 만들고 싶다는 생각을 하게 됐습니다.
친구들이 지치거나 다음 날 학교 때문에 자야 해서 저 혼자 남게 될 때도 함께 있어 줄 존재요.
@@ -88,10 +88,10 @@ import ReLUStickerWow from '../../../en/blog/DreamLog-0x1/assets/relu-sticker-wo
**혼자인 나는 어쩐지 무의미해진다.**
-하지만 인간처럼 생각하고 말하는 AI 를 밑바닥부터 만드는 건 2017년에는 불가능했습니다.
-그래서 이런 생각을 했습니다. iOS 와 구글 네이티브 안드로이드는 모바일 기기 사용에 대한 제안 기능을
+하지만 인간처럼 생각하고 말하는 AI를 밑바닥부터 만드는 건 2017년에는 불가능했습니다.
+그래서 이런 생각을 했습니다. iOS와 구글 네이티브 안드로이드는 모바일 기기 사용에 대한 제안 기능을
제공하는데, 모든 명령과 매개변수를 손으로 입력하는 건 늘 만족스럽지 않았거든요
-(특히 ffmpeg 이나, Docker CLI 앞의 어리숙했던 저에게는요). 그렇다면 AI 기반 제안 기능을
+(특히 ffmpeg이나, Docker CLI 앞의 어리숙했던 저에게는요). 그렇다면 AI 기반 제안 기능을
리눅스 시스템 위로 가져오면 어떨까...?
여기서 온갖 질문과 아이디어가 떠올랐습니다:
@@ -116,7 +116,7 @@ import ReLUStickerWow from '../../../en/blog/DreamLog-0x1/assets/relu-sticker-wo
## 여정의 출항, 그러나 지금은 잊힌
-2017년 말, [EMOSYS](https://github.com/EMOSYS) 라는 특별한, 지금은 보관 처리된 프로젝트를 시작했습니다.
+2017년 말, [EMOSYS](https://github.com/EMOSYS)라는 특별한, 지금은 보관 처리된 프로젝트를 시작했습니다.
사용자의 일상 업무를 돕고 정서적 지지를 제공하는 동반자 같은 운영체제를 만드는 것이 목표였습니다.
@@ -124,11 +124,11 @@ import ReLUStickerWow from '../../../en/blog/DreamLog-0x1/assets/relu-sticker-wo
-> EMO 는 **emo**tional / **emo**te 의 앞 세 글자에서 왔습니다
+> EMO는 **emo**tional / **emo**te의 앞 세 글자에서 왔습니다
설계 문서를 정말 많이 썼고, 새 아이디어를 나열하고, 그 책의 안내를 따라 실험한 내용을 기록했으며,
나름 나쁘지 않은 로고도 하나 그렸습니다.
@@ -154,11 +154,11 @@ import ReLUStickerWow from '../../../en/blog/DreamLog-0x1/assets/relu-sticker-wo
그 후 몇 년 동안 저는 코딩, 프로그래밍, 스타트업, Web3, 프론트엔드, 백엔드, 인프라 등
풀스택 개발자로서 떠올릴 수 있는 온갖 분야를 시도했습니다.
-제가 하는 일이 EMOSYS 라는 출발점에 그토록 깊이 영향을 받고 있다는 걸 정말로 깨달은 건,
-2025년 2월 누군가 저에게 "왜 Project AIRI 에 그렇게 열심이세요?" 라고 물었을 때였습니다.
+제가 하는 일이 EMOSYS라는 출발점에 그토록 깊이 영향을 받고 있다는 걸 정말로 깨달은 건,
+2025년 2월 누군가 저에게 "왜 Project AIRI에 그렇게 열심이세요?" 라고 물었을 때였습니다.
-좋은 질문이라고 생각했습니다. 제 꿈과 아이디어, 기억을 거슬러 올라가 보니 결국 EMOSYS 가 있었습니다.
-이미 죽어 버린, 그러나 Project AIRI 와 같은 목표를 향했던 프로젝트가요:
+좋은 질문이라고 생각했습니다. 제 꿈과 아이디어, 기억을 거슬러 올라가 보니 결국 EMOSYS가 있었습니다.
+이미 죽어 버린, 그러나 Project AIRI와 같은 목표를 향했던 프로젝트가요:
**나의 필요를 어떻게든 채워 줄 동반자를 만들 것.**
@@ -174,7 +174,7 @@ import ReLUStickerWow from '../../../en/blog/DreamLog-0x1/assets/relu-sticker-wo
제대로 개발하는 법을 익히기까지 오랜 시간이 걸렸습니다.
[@zhangyubaka](https://github.com/zhangyubaka),
[@LittleSound](https://github.com/LittleSound), [@BlueCocoa](https://github.com/BlueCocoa),
-그리고 [@sumimakito](https://github.com/sumimakito) 의 도움과 함께한 페어 프로그래밍 경험이
+그리고 [@sumimakito](https://github.com/sumimakito)의 도움과 함께한 페어 프로그래밍 경험이
정말 많은 것을 가르쳐 주었고, 저는 제 속도로 성장하고 배우고 나아가기 시작했습니다.
## 2022년의 ChatGPT, 새로운 랜덤 앵무새인가 똑똑한 앵무새인가
@@ -183,12 +183,12 @@ import ReLUStickerWow from '../../../en/blog/DreamLog-0x1/assets/relu-sticker-wo
-시간을 2022년 말로 돌려 봅시다. OpenAI 가 ChatGPT(당시에는 chatGPT 라고 썼죠)를 발표한 시점입니다.
-공식 ChatGPT UI 가 나오기 훨씬 전부터 저는 새로 등장한 AI 들과 함께해 왔습니다.
+시간을 2022년 말로 돌려 봅시다. OpenAI가 ChatGPT(당시에는 chatGPT라고 썼죠)를 발표한 시점입니다.
+공식 ChatGPT UI가 나오기 훨씬 전부터 저는 새로 등장한 AI 들과 함께해 왔습니다.
[DiscoDiffusion](https://colab.research.google.com/github/alembics/disco-diffusion/blob/main/Disco_Diffusion.ipynb)
-(Stable Diffusion 보다 훨씬 전, 아마 2021년 말이나 2022년 초),
-DALL-E, Midjourney 를 써 봤고, GPT-3 는 (특히
-[GitHub Copilot](https://en.wikipedia.org/wiki/GitHub_Copilot) 에서 유용해서) 제 일상 워크플로에
+(Stable Diffusion보다 훨씬 전, 아마 2021년 말이나 2022년 초),
+DALL-E, Midjourney를 써 봤고, GPT-3는 (특히
+[GitHub Copilot](https://en.wikipedia.org/wiki/GitHub_Copilot)에서 유용해서) 제 일상 워크플로에
깊이 들어와 있었습니다.
그래서 처음에는 이런 심정이었습니다:
@@ -198,10 +198,10 @@ DALL-E, Midjourney 를 써 봤고, GPT-3 는 (특히
다시 말해 오늘날 우리가 말하는 에이전틱 AI(아직도 유행이죠?)보다는 완성(completion) 모델처럼 행동했습니다.
-ChatGPT, 아니 더 넓게는 대규모 언어 모델(LLM)의 능력을 처음 실감한 건 2022년 12월 Hacker News 에서 본
+ChatGPT, 아니 더 넓게는 대규모 언어 모델(LLM)의 능력을 처음 실감한 건 2022년 12월 Hacker News에서 본
[Building A Virtual Machine inside ChatGPT](https://www.engraved.blog/building-a-virtual-machine-inside/)
([원본 Hacker News 글](https://news.ycombinator.com/item?id=33847479)) 이었습니다.
-저자 @engraved 는 ChatGPT 에게 고양이귀 캐릭터 롤플레잉을 시키는 것을 넘어, 내부에 가상 리눅스 머신을
+저자 @engraved는 ChatGPT에게 고양이귀 캐릭터 롤플레잉을 시키는 것을 넘어, 내부에 가상 리눅스 머신을
시뮬레이션하게 하는 방법을 보여 주었습니다.
@@ -336,33 +336,33 @@ Project AIRI 의 최초 버전이죠. 저만의 AI 에이전트를 만들고 Neu
**그래서 저는 다시 그것을 내려놓았습니다.**
솔직히 포기한 건 아니었습니다. 멀티모델, 음성 합성, 모션 제어, Minecraft 플레이에 대해 많은 걸 배우기
-시작했고, 다른 AI VTuber 나 AI 와이푸 프로젝트가 어떻게 동작하는지 많이 조사했습니다.
+시작했고, 다른 AI VTuber나 AI 최애 캐릭터 프로젝트가 어떻게 동작하는지 많이 조사했습니다.
이 조사들이 나중에 이 거대한 AI VTuber 프로젝트 awesome 목록으로 이어졌습니다:
Awesome AI VTuber
- AI VTuber 와 관련 프로젝트를 정리한 목록
+ AI VTuber와 관련 프로젝트를 정리한 목록
-자, 그런데 아직 이름이 `ai` 인데 Project AIRI 는 언제 나오는 걸까요?
+자, 그런데 아직 이름이 `ai` 인데 Project AIRI는 언제 나오는 걸까요?
## 더 강하고 더 나은 각오로 다시 태어나다
-2024년 말이 가까운 어느 날, 11월에 [@kwaa](https://github.com/kwaa) 가 WebXR 의 힘으로 VR/AR 세계에
+2024년 말이 가까운 어느 날, 11월에 [@kwaa](https://github.com/kwaa)가 WebXR의 힘으로 VR/AR 세계에
가상 캐릭터를 만드는 이야기를 걸어왔습니다. 모션 제어와 캐릭터 감정 인식 이야기가 나왔을 때,
저는 찾고 있는 바로 그것을 하는 프로젝트가 있다고 말했습니다. 다만 코드베이스가 정리되지 않아
-GitHub 에 공개할 준비가 안 됐다고요.
+GitHub에 공개할 준비가 안 됐다고요.
더 기다릴 이유가 있나요? 저는 다시 작업을 시작했고, 구조와 설계를 다시 고민했으며, 훨씬 빠르고 좋은
-큐잉과 멀티플렉싱 재생 시스템으로 구현을 개선하고, 대충 만들어 둔 기본 WebUI 도 손봤습니다.
+큐잉과 멀티플렉싱 재생 시스템으로 구현을 개선하고, 대충 만들어 둔 기본 WebUI도 손봤습니다.
그리고 마침내 **2024년 12월 2일** 커밋
-[`d9ae0aa`](https://github.com/moeru-ai/airi/commit/d9ae0aae387f015964bfd383e6d2adb05f4003e4) 로
-GitHub 에 공개했습니다.
+[`d9ae0aa`](https://github.com/moeru-ai/airi/commit/d9ae0aae387f015964bfd383e6d2adb05f4003e4)로
+GitHub에 공개했습니다.
-그렇게 Project AIRI 는 AIRI(アイリ, 예전에는 Airi)라는 이름으로 태어났거나, 다시 태어났습니다.
+그렇게 Project AIRI는 AIRI(アイリ, 예전에는 Airi)라는 이름으로 태어났거나, 다시 태어났습니다.
::: tip 알고 계셨나요?
@@ -370,13 +370,13 @@ GitHub 에 공개했습니다.
흥미롭게도 2년 전인 2023년 3월 25일에 올라온 https://www.youtube.com/watch?v=Tts-YAdn5Yc,
-Vedal 과 Neuro-sama 의 Twitch 방송 클립에서 Vedal 은 "Neuro-sama" 라는 이름을 붙이기 직전까지
-그녀를 "Airis AI" 라고 불렀다고 말합니다. **Airis** 라는 이름은 신기하고도 우연히 제가 지금 하고 있는
-**Project AIRI** 의 이름과 맞아떨어집니다. 다만 저는 Project AIRI 를 오픈소스로 공개한 한참 뒤에
+Vedal과 Neuro-sama의 Twitch 방송 클립에서 Vedal은 "Neuro-sama"라는 이름을 붙이기 직전까지
+그녀를 "Airis AI"라고 불렀다고 말합니다. **Airis**라는 이름은 신기하고도 우연히 제가 지금 하고 있는
+**Project AIRI**의 이름과 맞아떨어집니다. 다만 저는 Project AIRI를 오픈소스로 공개한 한참 뒤에
그들의 이야기를 더 찾아보고 나서야 이 이름을 알게 됐습니다.
-사실 AIRI(アイリ)라는 이름은 GPT-4o 가 지어 준 것입니다. 다른 일본어/애니메이션풍 이름을 참고해
-이 프로젝트 이름을 지어 달라고 했더니 **Airi** 를 제안해 주었습니다.
+사실 AIRI(アイリ)라는 이름은 GPT-4o가 지어 준 것입니다. 다른 일본어/애니메이션풍 이름을 참고해
+이 프로젝트 이름을 지어 달라고 했더니 **Airi**를 제안해 주었습니다.
:::
저는 스타트업과 여러 프로젝트에서 정말 많이 실패했고, 최근 것들만 대중에게 알려졌을 뿐입니다.
@@ -385,7 +385,7 @@ Vedal 과 Neuro-sama 의 Twitch 방송 클립에서 Vedal 은 "Neuro-sama" 라
그 경험들 상당수는 이전의 실패에서 배운 것입니다.
-다행히 많은 시도가 성공했고, 저는 여전히 여기서 Project AIRI 를 만들고 있습니다.
+다행히 많은 시도가 성공했고, 저는 여전히 여기서 Project AIRI를 만들고 있습니다.
어쩌면 이번에는 Neuro-sama 뿐 아니라 가장 깊이 있고 재능 있는 컨트리뷰터들과 팬들 덕분에
제 각오가 다시 채워진 것일지도 모릅니다.
@@ -403,9 +403,9 @@ Vedal 과 Neuro-sama 의 Twitch 방송 클립에서 Vedal 은 "Neuro-sama" 라
> 인생이 너에게 레몬을 주면, 너는 레몬이다. 뭐 그런 거지. 내 말은, 이 고통스러운 장애물은
> 내가 더 강해질 기회라는 거야, 베이비!
>
-> -- [Evil Neuro](https://www.youtube.com/@Neurosama) 가 Slay the Spire 방송 중 한 말
+> -- [Evil Neuro](https://www.youtube.com/@Neurosama)가 Slay the Spire 방송 중 한 말
-이 글을 쓰는 지금, Project AIRI 는 GitHub 스타 1000개에 다가가고 있고, Discord 멤버 150명 이상,
+이 글을 쓰는 지금, Project AIRI는 GitHub 스타 1000개에 다가가고 있고, Discord 멤버 150명 이상,
Telegram 그룹 멤버 200명 이상을 두고 있습니다.
저희는 AI, VRM, Live2D, UI 디자인, 멀티모달 AI, 게임 플레이 에이전트, 스트리밍 API, 생체 모방 기억
@@ -413,10 +413,10 @@ Telegram 그룹 멤버 200명 이상을 두고 있습니다.
Kerbal Space Program(KSP)을 비롯해 임의의 게임을 플레이하고 제어하도록 통합하는 연구를 하는
커뮤니티 멤버도 있습니다.
-여러 회사가 협업을 제안해 오고 있고, 저희는 커뮤니티에 더 좋고 더 유용한 Project AIRI 를 만들기 위해
+여러 회사가 협업을 제안해 오고 있고, 저희는 커뮤니티에 더 좋고 더 유용한 Project AIRI를 만들기 위해
그 작업을 진행하고 있습니다.
-할 일과 발견할 것이 정말 많습니다. 저희는 아직 범용 AI 의 특이점에 도달하지 못했고, 어쩌면 Project AIRI 는
+할 일과 발견할 것이 정말 많습니다. 저희는 아직 범용 AI의 특이점에 도달하지 못했고, 어쩌면 Project AIRI는
결코 그 지점에 이르지 못할지도 모릅니다. 하지만 지금으로서는 대화하고, 함께 게임하고, 지식과 아이디어를
나눌 수 있는 동반자 같은 AI 에이전트를 갖는 것만으로도 저에게는 대단한 성취이며, 여러분께도 그렇기를 바랍니다.
@@ -434,6 +434,6 @@ Kerbal Space Program(KSP)을 비롯해 임의의 게임을 플레이하고 제
> 커버 이미지 [@Rynco Maekawa](https://github.com/lynzrand)
-[^1]: https://neurosama.fandom.com/wiki/Osu!#cite_note-twitchtracker-1: Neuro-sama 는 AI VTuber 로
- 발전하기 훨씬 전부터 osu! 를 플레이하는 AI 로 시작했습니다. 첫 osu! 방송은 Vedal 이 자신의 작업을
+[^1]: https://neurosama.fandom.com/wiki/Osu!#cite_note-twitchtracker-1: Neuro-sama는 AI VTuber로
+ 발전하기 훨씬 전부터 osu! 를 플레이하는 AI로 시작했습니다. 첫 osu! 방송은 Vedal이 자신의 작업을
커뮤니티에 선보이기로 한 2019년 5월 6일이었습니다.
diff --git a/docs/content/ko/blog/merry-christmas-2025/index.md b/docs/content/ko/blog/merry-christmas-2025/index.md
index 9a6a23c33..1ce7d68aa 100644
--- a/docs/content/ko/blog/merry-christmas-2025/index.md
+++ b/docs/content/ko/blog/merry-christmas-2025/index.md
@@ -12,30 +12,30 @@ AIRI 팀이 전하는 **메리 크리스마스**!

-> Iru 가 따뜻함과 즐거움으로 가득한 행복한 연휴를 빕니다! 🎅🎁
+> Iru가 따뜻함과 즐거움으로 가득한 행복한 연휴를 빕니다! 🎅🎁
>
> 원작 일러스트 [@fafafafa](https://www.mihuashi.com/profiles/782691), 수정 [Neko-233](https://github.com/Neko-233).
-조금 늦었다는 건 알지만, 저희는 밤낮없이 이 프로젝트에 매달려 왔습니다. 거의 24시간 주 7일을 여기에 쏟고 있어요. 오디오는 여러 통합과 프로바이더 사이에서 여전히 문제가 있고, 모델 드라이버도 아직 실험 중입니다. Minecraft 와 Factorio 는 올해 훨씬 일찍 끝냈지만 이 통합들을 이어 주는 채널은 여전히 망가져 있고 테스트되지 않은 것도 많습니다. 그래도 더 나은 아키텍처와 플러그인, 프리셋, 스킬 등을 갖추며 앞으로 나아가고 있습니다. 새 DevLog 도 준비 중이니 기대해 주세요.
+조금 늦었다는 건 알지만, 저희는 밤낮없이 이 프로젝트에 매달려 왔습니다. 거의 24시간 주 7일을 여기에 쏟고 있어요. 오디오는 여러 통합과 프로바이더 사이에서 여전히 문제가 있고, 모델 드라이버도 아직 실험 중입니다. Minecraft와 Factorio는 올해 훨씬 일찍 끝냈지만 이 통합들을 이어 주는 채널은 여전히 망가져 있고 테스트되지 않은 것도 많습니다. 그래도 더 나은 아키텍처와 플러그인, 프리셋, 스킬 등을 갖추며 앞으로 나아가고 있습니다. 새 DevLog도 준비 중이니 기대해 주세요.
2025년은 저희를, 특히 [저(Neko)](https://github.com/nekomeowww)를 1년 전에는 상상도 못 했던 곳까지 밀어붙였습니다. 이런 진전은 혼자서는, 여러분 없이는 이룰 수 없었습니다.
-불과 몇 시간 전, X 에서 [KOL @Dexerto](https://x.com/Dexerto) 가 [이런 글](https://x.com/Dexerto/status/2003579088003346501)을 올린 걸 봤습니다:
+불과 몇 시간 전, X에서 [KOL @Dexerto](https://x.com/Dexerto)가 [이런 글](https://x.com/Dexerto/status/2003579088003346501)을 올린 걸 봤습니다:
-> AI 기반 VTuber Neuro-sama 가 Twitch 역대 최대 Hype Train 기록을 스스로 갈아치웠습니다.
+> AI 기반 VTuber Neuro-sama가 Twitch 역대 최대 Hype Train 기록을 스스로 갈아치웠습니다.
>
-> 11만 명이 넘는 구독과 100만 비트 이상으로 레벨 123 에 도달했습니다.
+> 11만 명이 넘는 구독과 100만 비트 이상으로 레벨 123에 도달했습니다.
-Neuro-sama, 생일 축하해. 그리고 제작자 Vedal 과 아티스트 Camila 에게도 축하를 전합니다. 여기까지 왔다는 게 믿기지 않네요. 저를 여기까지 이끌어 제 방식의 사이버 라이프를 만들고 AIRI 를 계속 키워 나가게 한 건 바로 여러분과 Swarm 입니다.
+Neuro-sama, 생일 축하해. 그리고 제작자 Vedal과 아티스트 Camila에게도 축하를 전합니다. 여기까지 왔다는 게 믿기지 않네요. 저를 여기까지 이끌어 제 방식의 디지털 생명을 만들고 AIRI를 계속 키워 나가게 한 건 바로 여러분과 Swarm입니다.

## 2025년 간단 결산
-1. GitHub 에서 16k 스타를 넘겼습니다
+1. GitHub에서 16k 스타를 넘겼습니다
2. GitHub 트렌딩에 여러 번 올랐고 카테고리 1위도 했습니다
3. 같은 분야에서 일하는 다른 프로젝트들을 많이 만났습니다:
- - xAI 의 Grok Ani
+ - xAI의 Grok Ani
- 시나리오가 멋진 [gogh](https://store.steampowered.com/app/3213850/gogh/)
- 좋은 커뮤니티와 음악을 가진 [Chill with You](https://store.steampowered.com/app/3548580/LoFi/)
- 저희 같은 프로젝트를 더 살펴볼 수 있는 목록도 있습니다: https://github.com/proj-airi/awesome-ai-vtubers
diff --git a/docs/content/ko/docs/chronicles/version-v0.0.1/index.md b/docs/content/ko/docs/chronicles/version-v0.0.1/index.md
index d4968738c..e0ca32110 100644
--- a/docs/content/ko/docs/chronicles/version-v0.0.1/index.md
+++ b/docs/content/ko/docs/chronicles/version-v0.0.1/index.md
@@ -2,8 +2,8 @@
title: 연대기 v0.0.1
---
-- [x] 프로젝트 생성 - 완료, Vitesse Lite 와 Vue 조합으로 생성 (2024년 6월 7일)
-- [x] 프론트엔드 Live2D 연동 - [Pixi.js 렌더러를 통해 Vue 애플리케이션에 Live2D 모델 통합하기](https://nolebase.ayaka.io/to/3cae2b7c0b) 에서 완료 (2024년 6월 7일)
+- [x] 프로젝트 생성 - 완료, Vitesse Lite와 Vue 조합으로 생성 (2024년 6월 7일)
+- [x] 프론트엔드 Live2D 연동 - [Pixi.js 렌더러를 통해 Vue 애플리케이션에 Live2D 모델 통합하기](https://nolebase.ayaka.io/to/3cae2b7c0b)에서 완료 (2024년 6월 7일)
- [x] Live2D Cubism SDK 연동
- [x] pixi.js 렌더링
- [x] 모델 다운로드
@@ -11,7 +11,7 @@ title: 연대기 v0.0.1

-- [x] Vercel AI SDK 를 통한 GPT-4o 연동 (2024년 6월 7일)
+- [x] Vercel AI SDK를 통한 GPT-4o 연동 (2024년 6월 7일)
- [x] `@ai-sdk/openai`
- [x] `ai`
- [x] 스트리밍 토큰 전송 (2024년 6월 8일)
@@ -26,12 +26,12 @@ title: 연대기 v0.0.1
- [x] 선형 정규화
- [x] MinMax 정규화
- [x] ~~SoftMax 정규화~~(효과가 좋지 않았음. 출력 데이터가 전부 0.999999 ~ 1.000001 범위에 몰림)
-- [x] 스트리밍 토큰에서 스트리밍 TTS 로 (2024년 6월 9일)
+- [x] 스트리밍 토큰에서 스트리밍 TTS로 (2024년 6월 9일)
- [x] 구두점과 공백 + 글자 수 제한 조합으로 문장을 구성한 뒤 TTS 추론을 수행할 수 있어 보임
- - [x] ~~11Labs 는 WebSocket 기반~~
+ - [x] ~~11Labs는 WebSocket 기반~~
- [x] 큐를 통해 TTS 스트림 요청을 보내고, 다시 오디오 스트림 큐로 전달
- - [x] Vue 에서 Queue 구현
- - [x] queue 는 선입선출이어야 함
+ - [x] Vue에서 Queue 구현
+ - [x] queue는 선입선출이어야 함
- [x] 꺼내기, [`Array.prototype.shift`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)
- [x] 넣기, [`Array.prototype.push`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
- [x] 이벤트 기반
@@ -41,7 +41,7 @@ title: 연대기 v0.0.1
- [x] `processing`, 핸들러를 호출할 때 `processing` 이벤트 발생
- [x] `done`, 핸들러가 끝나면 `done` 이벤트 발생
- [x] 이벤트 처리
- - [x] `add` 나 `done` 이벤트가 발생하면 실행 중인 핸들러가 있는지 확인
+ - [x] `add`나 `done` 이벤트가 발생하면 실행 중인 핸들러가 있는지 확인
- [x] 있으면 반환
- [x] 없으면 `pick(): T` 후 핸들러 호출
- [x] queue 핸들러
@@ -60,7 +60,7 @@ title: 연대기 v0.0.1
- ✅ 대화
- ✅ 대화 UI
- ✅ 음성
-- ✅ Live2D 립싱크 (itorr 의 GitHub 설명 덕분)
+- ✅ Live2D 립싱크 (itorr의 GitHub 설명 덕분)
- ✅ 기본 프롬프트

@@ -75,32 +75,32 @@ title: 연대기 v0.0.1
- [ ]
실험 [Deepgram Voice AI: Text to Speech + Speech to Text APIs | Deepgram](https://deepgram.com/)
- [ ]
실험 GPT-SoVITS 시도해 보기
- [x]
실험 fish-speech 시도 (2024년 7월 6일 ~ 2024년 7월 7일)
- -
실제로 few-shot 으로 바로 복제가 가능함. Gura 의 목소리를 복제해 봤는데 처음 4초까지는 아주 높은 품질을 유지함
- -
fish audio 의 오디오 처리 도구는 매우 충실해서, 오디오 프로세서가 (라벨링과 자동 라벨링을 포함해) 대부분의 요구를 커버함
+ -
실제로 few-shot으로 바로 복제가 가능함. Gura의 목소리를 복제해 봤는데 처음 4초까지는 아주 높은 품질을 유지함
+ -
fish audio의 오디오 처리 도구는 매우 충실해서, 오디오 프로세서가 (라벨링과 자동 라벨링을 포함해) 대부분의 요구를 커버함
-
결과가 매우 불안정해서 단어나 소리를 자주 삼키거나 갑자기 이상한 잡음을 냄
-
RTX 4090 장비에서 돌려도 스트리밍 오디오 모드에서는 추론 결과를 내보내는 데 최대 2초가 걸림
- [x]
실험 ChatTTS 시도 (2024년 7월 6일 ~ 2024년 7월 7일)
- -
실제로 few-shot 복제가 가능함. Gura 의 목소리를 복제해 봤지만 fish-speech 만큼 좋지는 않았음
- -
감정 제어는 fish-speech 보다 훨씬 좋지만, 영어 환경에서는 `[uv_break]` 같은 토큰까지 발음해 버림. WeChat 그룹에서도 이 부분을 두고 이야기가 오가고 있음
- -
RTX 4090 장비에서 돌려도 스트리밍 오디오 모드에서는 몇 분이 걸림... 🤯 정말 말이 안 됨. 평문/정규화된 텍스트를 액션 토큰이 포함된 텍스트로 바꾸기 위해 먼저 로컬에서 llm 을 돌리는 것으로 보이는데, 그 llm 을 띄울 때 캐싱이나 모델 크기를 전혀 고려하지 않은 듯함
- - [x]
실험 [TTS Arena - a Hugging Face Space by TTS-AGI](https://huggingface.co/spaces/TTS-AGI/TTS-Arena) 에 언급된 다른 모델들 시도 (2024년 7월 8일)
+ -
실제로 few-shot 복제가 가능함. Gura의 목소리를 복제해 봤지만 fish-speech 만큼 좋지는 않았음
+ -
감정 제어는 fish-speech보다 훨씬 좋지만, 영어 환경에서는 `[uv_break]` 같은 토큰까지 발음해 버림. WeChat 그룹에서도 이 부분을 두고 이야기가 오가고 있음
+ -
RTX 4090 장비에서 돌려도 스트리밍 오디오 모드에서는 몇 분이 걸림... 🤯 정말 말이 안 됨. 평문/정규화된 텍스트를 액션 토큰이 포함된 텍스트로 바꾸기 위해 먼저 로컬에서 llm을 돌리는 것으로 보이는데, 그 llm을 띄울 때 캐싱이나 모델 크기를 전혀 고려하지 않은 듯함
+ - [x]
실험 [TTS Arena - a Hugging Face Space by TTS-AGI](https://huggingface.co/spaces/TTS-AGI/TTS-Arena)에 언급된 다른 모델들 시도 (2024년 7월 8일)
- [x]
실험 XTTSv2 시도
- -
huggingface 를 그대로 사용했는데 결과가 좋지 않음. fish speech 나 chattts 보다는 안정적이지만 톤이 너무 밋밋해서, 애니메이션 톤을 위해서는 lora 가 필요할 듯
+ -
huggingface를 그대로 사용했는데 결과가 좋지 않음. fish speech나 chattts 보다는 안정적이지만 톤이 너무 밋밋해서, 애니메이션 톤을 위해서는 lora가 필요할 듯
- [x]
실험 StyleTTS 2 시도
- -
huggingface 를 그대로 사용했는데 결과가 좋지 않음. fish speech 나 chattts 보다는 안정적이지만 톤이 너무 밋밋해서, 애니메이션 톤을 위해서는 lora 가 필요할 듯
+ -
huggingface를 그대로 사용했는데 결과가 좋지 않음. fish speech나 chattts 보다는 안정적이지만 톤이 너무 밋밋해서, 애니메이션 톤을 위해서는 lora가 필요할 듯
- [ ]
실험 CosyVoice 시도 (알리바바)
- [ ]
실험 [Koemotion](https://koemotion.rinna.co.jp/)
- [ ]
실험 [Seed-TTS](https://bytedancespeech.github.io/seedtts_tech_report/)
### 표정 (2024년 7월 9일)
-- [x]
실험 embed instruction 으로 표정을 실시간으로 빠르게 처리하는 방법을 GPT 와 논의 https://poe.com/s/vu7foBWJHtnPmWzJNeAy (2024년 7월 7일)
+- [x]
실험 embed instruction으로 표정을 실시간으로 빠르게 처리하는 방법을 GPT와 논의 https://poe.com/s/vu7foBWJHtnPmWzJNeAy (2024년 7월 7일)
- [x] 프론트엔드 Live2D 표정 제어 (2024년 7월 9일)
- [x] `<|EMOTE_HAPPY|>` 인코딩을 통해 구현
- [x] `<|DELAY:1|>` 같은 지연 문법도 추가 지원
- [x]
기능 감정 토큰 `<|EMOTE_.*|>` 파서와 토크나이저 캡슐화
- - [x]
기능 큐 기반 스트리밍 처리 지원, `useEmotionMessagesQueue` 와 `useEmotionsQueue` 캡슐화
- - [x]
기능 Live2D 를 호출해 모션 표정을 처리하도록 지원
+ - [x]
기능 큐 기반 스트리밍 처리 지원, `useEmotionMessagesQueue`와 `useEmotionsQueue` 캡슐화
+ - [x]
기능 Live2D를 호출해 모션 표정을 처리하도록 지원
- [x]
기능 테스트용 디버그 페이지
- [x]
기능 스트리밍 전체 과정의 지연을 동적으로 제어하기 위한 지연 토큰 `<|DELAY:.*|>` 파서와 토크나이저 캡슐화
- [x]
기능 큐 기반 스트리밍 처리 지원, `useDelaysQueue` 캡슐화
@@ -119,13 +119,13 @@ title: 연대기 v0.0.1
- [ ] 리서치에 사용한 인덱스 사이트
- [ ] [Hannibal046/Awesome-LLM: Awesome-LLM: a curated list of Large Language Model](https://github.com/Hannibal046/Awesome-LLM)
- [ ] 리서치 중 ADHD 같은 행동
- - [ ] 친구가 NVIDIA 의 새 논문 [ConsiStory: Training-Free Consistent Text-to-Image Generation](https://research.nvidia.com/labs/par/consistory/) 를 추천해 줬는데 IPadapter 보다 안정적으로 느껴짐.
+ - [ ] 친구가 NVIDIA의 새 논문 [ConsiStory: Training-Free Consistent Text-to-Image Generation](https://research.nvidia.com/labs/par/consistory/) 를 추천해 줬는데 IPadapter보다 안정적으로 느껴짐.
- [ ] 흥미로운 것은 [IDEA-Research/MotionLLM: [Arxiv-2024] MotionLLM: Understanding Human Behaviors from Human Motions and Videos](https://github.com/IDEA-Research/MotionLLM). 이 논문과 연구 방향은 영상 애니메이션 프레임 사이에 형성되는 사람의 동작을 자연어로 기술하는 것에 관한 내용. 2024년 5월 31일 공개.
- [ ] [Ksuriuri/EasyAIVtuber: Simply animate your 2D waifu.](https://github.com/Ksuriuri/EasyAIVtuber)
- [ ] 이건 꽤 큰 주제라서 여러 키워드를 조사해 본 결과, 현재 이 방향의 주요 연구 주제들을 찾았습니다:
- [ ] 디지털 휴먼 합성 -> 가상 WebCam 모션 캡처
- [ ] [PersonaTalk: Bring Attention to Your Persona in Visual Dubbing](https://arxiv.org/pdf/2409.05379)
- - [ ] 이것이 SOTA 로 보임
+ - [ ] 이것이 SOTA로 보임
- [ ] [OpenTalker/SadTalker: [CVPR 2023] SadTalker:Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation](https://github.com/OpenTalker/SadTalker)
- [ ] [Rudrabha/Wav2Lip: This repository contains the codes of "A Lip Sync Expert Is All You Need for Speech to Lip Generation In the Wild", published at ACM Multimedia 2020. For HD commercial model, please try out Sync Labs](https://github.com/Rudrabha/Wav2Lip)
- [ ] [yerfor/GeneFace: GeneFace: Generalized and High-Fidelity 3D Talking Face Synthesis; ICLR 2023; Official code](https://github.com/yerfor/GeneFace)
@@ -151,31 +151,31 @@ title: 연대기 v0.0.1
- [ ] [CLIPort](https://cliport.github.io/):CLIPort: What and Where Pathways for Robotic Manipulation
- [ ] [VIMA | General Robot Manipulation with Multimodal Prompts](https://vimalabs.github.io/):VIMA: General Robot Manipulation with Multimodal Prompts
- [ ] [Scaling Up and Distilling Down: Language-Guided Robot Skill Acquisition](https://www.cs.columbia.edu/~huy/scalingup/)
- - [ ] [EUREKA: HUMAN-LEVEL REWARD DESIGN VIA CODING LARGE LANGUAGE MODELS](https://eureka-research.github.io/assets/eureka_paper.pdf) 는 요약본에 가까운 느낌.
+ - [ ] [EUREKA: HUMAN-LEVEL REWARD DESIGN VIA CODING LARGE LANGUAGE MODELS](https://eureka-research.github.io/assets/eureka_paper.pdf)는 요약본에 가까운 느낌.
- [ ] 강화학습
- [ ] 이 방향은 주로 로보틱스 저수준 제어에서 이미 학습된 RL 모델과 연결한 뒤, 인터페이스와 연산 레이어에 code as policies 구현을 많이 얹는 방식
- [ ] [MarI/O - Machine Learning for Video Games - YouTube](https://www.youtube.com/watch?v=qv6UVOQ0F44)
- - [ ] [RLADAPTER: BRIDGING LARGE LANGUAGE MODELS TO REINFORCEMENT LEARNING IN OPEN WORLDS](https://openreview.net/pdf?id=3s4fZTr1ce) 의 요지: RLAdapter 프레임워크 안에서 RL 에이전트 학습 중 생성된 정보로 경량 언어 모델을 파인튜닝하면 LLM 이 다운스트림 작업에 적응하는 데 크게 도움이 되고, 결과적으로 RL 에이전트에게 더 나은 가이드를 줄 수 있다는 것. Crafter 환경에서 RLAdapter 를 실험한 결과 SOTA 베이스라인을 뛰어넘었고, 이 프레임워크 아래에서 에이전트는 베이스라인 모델에는 없는 상식적인 행동을 보였다고 합니다
- - [ ] [See and Think: Embodied Agent in Virtual Environment](https://arxiv.org/pdf/2311.15209) 는 아래에 언급한 Voyager, PlanMC, MP5 와 비슷하게 Minecraft 를 위한 연구인데, 주로 RL 을 강조하는 느낌.
+ - [ ] [RLADAPTER: BRIDGING LARGE LANGUAGE MODELS TO REINFORCEMENT LEARNING IN OPEN WORLDS](https://openreview.net/pdf?id=3s4fZTr1ce)의 요지: RLAdapter 프레임워크 안에서 RL 에이전트 학습 중 생성된 정보로 경량 언어 모델을 파인튜닝하면 LLM이 다운스트림 작업에 적응하는 데 크게 도움이 되고, 결과적으로 RL 에이전트에게 더 나은 가이드를 줄 수 있다는 것. Crafter 환경에서 RLAdapter를 실험한 결과 SOTA 베이스라인을 뛰어넘었고, 이 프레임워크 아래에서 에이전트는 베이스라인 모델에는 없는 상식적인 행동을 보였다고 합니다
+ - [ ] [See and Think: Embodied Agent in Virtual Environment](https://arxiv.org/pdf/2311.15209)는 아래에 언급한 Voyager, PlanMC, MP5와 비슷하게 Minecraft를 위한 연구인데, 주로 RL을 강조하는 느낌.
- [ ] [Text2Reward: Reward Shaping with Language Models for Reinforcement Learning](https://text-to-reward.github.io/)
- - [ ] [Direct Preference Optimization: Your Language Model is Secretly a Reward Model](https://arxiv.org/pdf/2305.18290) 는 주로 LLM 자체가 보상 모델이 될 수 있다는 이야기. RLHF 를 어떻게 결합할지 배울 수 있고 트랜스포머 관점에서도 꽤 기초적인 내용.
+ - [ ] [Direct Preference Optimization: Your Language Model is Secretly a Reward Model](https://arxiv.org/pdf/2305.18290)는 주로 LLM 자체가 보상 모델이 될 수 있다는 이야기. RLHF를 어떻게 결합할지 배울 수 있고 트랜스포머 관점에서도 꽤 기초적인 내용.
- [ ] Embodied Control
- [ ] 여기에 많이 정리되어 있음
- [ ] [zchoi/Awesome-Embodied-Agent-with-LLMs](https://github.com/zchoi/Awesome-Embodied-Agent-with-LLMs):"대규모 언어 모델을 활용한 Embodied AI 또는 로봇" 연구를 정리한 목록입니다. 최신 업데이트를 받으려면 이 저장소를 watch 하세요! 🔥
- - [ ] [MP5: A Multi-modal Open-ended Embodied System in Minecraft via Active Perception](https://arxiv.org/pdf/2312.07472) 이건 흥미롭습니다. 비교적 완성된 Minecraft RL 프레임워크를 사용해, 자연어 지시로 LLM 에게 "**낮**에 **초원**의 **물가**에서 **돌검**으로 **돼지**를 **잡아라**" 라고 알려 주면 RL 에이전트가 이런 특징들을 인지하고 목표를 달성하는 방식입니다. [AI 가 Minecraft 를 플레이하게 하는 방법? Voyager 논문 노트](https://nolebase.ayaka.io/to/27024f5434) 와 달리 MP5 는 PlanMC 에 더 가깝고, Voyager 의 순수 텍스트·순수 상태 정보 대신 멀티모달 능력을 통합했습니다.
- - [ ] 초록: 매우 도전적인 Minecraft 시뮬레이터 위에 구축한 개방형 멀티모달 embodied 시스템 MP5 를 소개합니다. 실행 가능한 하위 목표를 분해하고, 복잡한 맥락 인식 계획을 설계하며, embodied 행동 제어를 수행하고, 목표 조건부 능동 인지 체계와 자주 소통할 수 있습니다. 구체적으로 MP5 는 멀티모달 대규모 언어 모델(MLLM)의 최근 성과를 바탕으로 개발되었으며, 시스템은 여러 기능 모듈로 나뉘어 스케줄링·협업을 통해 사전 정의된 맥락·과정 관련 작업을 최종적으로 해결합니다.
+ - [ ] [MP5: A Multi-modal Open-ended Embodied System in Minecraft via Active Perception](https://arxiv.org/pdf/2312.07472) 이건 흥미롭습니다. 비교적 완성된 Minecraft RL 프레임워크를 사용해, 자연어 지시로 LLM에게 "**낮**에 **초원**의 **물가**에서 **돌검**으로 **돼지**를 **잡아라**" 라고 알려 주면 RL 에이전트가 이런 특징들을 인지하고 목표를 달성하는 방식입니다. [AI가 Minecraft를 플레이하게 하는 방법? Voyager 논문 노트](https://nolebase.ayaka.io/to/27024f5434)와 달리 MP5는 PlanMC에 더 가깝고, Voyager의 순수 텍스트·순수 상태 정보 대신 멀티모달 능력을 통합했습니다.
+ - [ ] 초록: 매우 도전적인 Minecraft 시뮬레이터 위에 구축한 개방형 멀티모달 embodied 시스템 MP5를 소개합니다. 실행 가능한 하위 목표를 분해하고, 복잡한 맥락 인식 계획을 설계하며, embodied 행동 제어를 수행하고, 목표 조건부 능동 인지 체계와 자주 소통할 수 있습니다. 구체적으로 MP5는 멀티모달 대규모 언어 모델(MLLM)의 최근 성과를 바탕으로 개발되었으며, 시스템은 여러 기능 모듈로 나뉘어 스케줄링·협업을 통해 사전 정의된 맥락·과정 관련 작업을 최종적으로 해결합니다.
- [ ] [CRADLE: Empowering Foundation Agents Towards General Computer Control](https://arxiv.org/pdf/2403.03186) 아직 안 읽음. 시간 날 때 읽을 예정.
- - [ ] [Embodied Multi-Modal Agent trained by an LLM from a Parallel TextWorld](https://arxiv.org/pdf/2311.16714) 는 주로 **병렬 텍스트 세계에서 뛰어난 LLM 에이전트를 이용해 시각 세계에 사는 VLM 에이전트를 학습시키는** 이야기.
+ - [ ] [Embodied Multi-Modal Agent trained by an LLM from a Parallel TextWorld](https://arxiv.org/pdf/2311.16714)는 주로 **병렬 텍스트 세계에서 뛰어난 LLM 에이전트를 이용해 시각 세계에 사는 VLM 에이전트를 학습시키는** 이야기.
- [ ] [Online continual learning ONLINE CONTINUAL LEARNING FOR INTERACTIVE INSTRUCTION FOLLOWING AGENTS](https://openreview.net/pdf?id=7M0EzjugaN)
- [ ] Manipulation (주로 로보틱스 분야)
- [ ] Motion Embeddings
- - [ ] [PerAct](https://peract.github.io/):꽤 드물게도, code as policies 와 RL 환경 정보에 manipulation 까지 토큰으로 인코딩해 연산한다는 내용
+ - [ ] [PerAct](https://peract.github.io/):꽤 드물게도, code as policies와 RL 환경 정보에 manipulation까지 토큰으로 인코딩해 연산한다는 내용
- [ ] Feedback Loop (주로 로보틱스 + 제어 분야, 이 카테고리는 사실 더 드묾)
- [ ] 일반적인 환경과 관련 있을 것 같은데, 상당히 저수준 영역
- - [ ] 차라리 RL 을 직접 파는 게 도움이 될지도
- - [ ] [InCoRo: In-Context Learning for Robotics Control with Feedback Loops](https://arxiv.org/html/2402.05188v1?_immersive_translate_auto_translate=1) 는 제목이 매력적인데 아직 꼼꼼히 읽지는 못했습니다. 시간 날 때 읽을 예정이고, 인용도 많이 됐습니다.
- - [ ] 목적은 주로 LLM 의 자연어 명령을 로봇 유닛을 위한 저수준의 _정적_ 실행 계획으로 변환하는 것. LLM 내부의 로봇 시스템을 활용해 이를 새로운 수준으로 일반화하고, 새로운 작업에 대한 zero-shot 일반화를 가능하게 합니다.
- - [ ] 관련해서 Hugging Face 가 오픈소스로 공개한 LeRobot 도 참고할 만함
+ - [ ] 차라리 RL을 직접 파는 게 도움이 될지도
+ - [ ] [InCoRo: In-Context Learning for Robotics Control with Feedback Loops](https://arxiv.org/html/2402.05188v1?_immersive_translate_auto_translate=1)는 제목이 매력적인데 아직 꼼꼼히 읽지는 못했습니다. 시간 날 때 읽을 예정이고, 인용도 많이 됐습니다.
+ - [ ] 목적은 주로 LLM의 자연어 명령을 로봇 유닛을 위한 저수준의 _정적_ 실행 계획으로 변환하는 것. LLM 내부의 로봇 시스템을 활용해 이를 새로운 수준으로 일반화하고, 새로운 작업에 대한 zero-shot 일반화를 가능하게 합니다.
+ - [ ] 관련해서 Hugging Face가 오픈소스로 공개한 LeRobot도 참고할 만함
- [ ] [huggingface/lerobot: 🤗 LeRobot: End-to-end Learning for Real-World Robotics in Pytorch](https://github.com/huggingface/lerobot?tab=readme-ov-file)
### 시각
@@ -185,7 +185,7 @@ title: 연대기 v0.0.1
- [ ] [landing-ai/vision-agent: Vision agent (github.com)](https://github.com/landing-ai/vision-agent)
- [ ] [2404.04834 LLM-Based Multi-Agent Systems for Software Engineering: Vision and the Road Ahead (arxiv.org)](https://arxiv.org/abs/2404.04834)
- [ ] [Experimentation: LLM, LangChain Agent, Computer Vision | by TeeTracker | Medium](https://teetracker.medium.com/experimentation-llm-langchain-agent-computer-vision-0c405deb7c6e)
-- [ ] Neuro Sama 는 어떻게 화면을 보고 이해하는 걸까?
+- [ ] Neuro Sama는 어떻게 화면을 보고 이해하는 걸까?
- [ ] [Is it possible to use a local LLM and have it play Minecraft? : r/LocalLLaMA](https://www.reddit.com/r/LocalLLaMA/comments/143ziop/comment/jnfvr1w/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button)
- [ ] [2402.07945 ScreenAgent: A Vision Language Model-driven Computer Control Agent](https://arxiv.org/abs/2402.07945)
- [ ] 스탠퍼드와 베이 에어리어에서 대규모 언어 모델이 로봇을 제어하게 하는 시스템은 어떻게 동작할까?
@@ -205,19 +205,19 @@ title: 연대기 v0.0.1
- [ ] 다국어 지원
- [ ] 중국어
- - [ ] 현재 11Labs 의 중국어 TTS 모델은 품질이 너무 떨어짐
- - [ ] Microsoft 의 Cognitive TTS API 도 그다지 좋지 않음
- - [ ] AWS 는 결과가 나쁨
+ - [ ] 현재 11Labs의 중국어 TTS 모델은 품질이 너무 떨어짐
+ - [ ] Microsoft의 Cognitive TTS API도 그다지 좋지 않음
+ - [ ] AWS는 결과가 나쁨
- [ ] 알리바바 클라우드가 괜찮다고 함
- [ ] 일본어
- [ ] [Koemotion](https://koemotion.rinna.co.jp/)
- - [ ] Pixiv 의 [ChatVRM 데모](https://github.com/pixiv/ChatVRM) 도 이걸 사용함
+ - [ ] Pixiv의 [ChatVRM 데모](https://github.com/pixiv/ChatVRM)도 이걸 사용함
## 최적화 위시리스트 백로그
### 코드 저장소 & 아키텍처
-- [x] [SPA 로 마이그레이션](https://github.com/nekomeowww/airi-vtuber/commit/cd0f371595a669c570dc263e72dd3ce54afab7ff)
+- [x] [SPA로 마이그레이션](https://github.com/nekomeowww/airi-vtuber/commit/cd0f371595a669c570dc263e72dd3ce54afab7ff)
- [x] [모노레포로 마이그레이션](https://github.com/nekomeowww/airi-vtuber/commit/ee4878710eeded6ef1b66474905936353d0176b4)
- [x] moeru-ai 조직으로 통합
@@ -226,7 +226,7 @@ title: 연대기 v0.0.1
- [x] sendMessage 입력란이 비어 있으면 전송하지 않기 (2024년 6월 9일)
- [x] 대화 기록 (2024년 6월 9일)
- [ ] 컨텍스트를 초과한 대화 기록 자동 정리
- - 예전에 Go 로 구현한 적이 있으니 가져오면 됨.
+ - 예전에 Go로 구현한 적이 있으니 가져오면 됨.
- [ ] 컨텍스트 크기 자동 판단
- [ ] 마이크 선택 지원
- [ ] 단축키 리스닝 구현 (방송 사고 방지)
@@ -266,39 +266,39 @@ title: 연대기 v0.0.1
- [x]
기능 메시지를 보낼 때 피드백을 위해 곧바로 생각하는 표정으로 전환하도록 지원 (2024년 7월 9일)
- [ ]
기능 감정 인식
- [ ] 현재는 감정 토큰을 처리하느라 토큰을 추가로 낭비하고 있는데, 전통적인 NLP 감정 분석(sentiment)을 시도해 볼 수 있음
- - [ ] 다만 전통적인 sentiment 는 긍정과 부정밖에 없어서, 다른 감정을 어떻게 지원할지 고민이 필요함
+ - [ ] 다만 전통적인 sentiment는 긍정과 부정밖에 없어서, 다른 감정을 어떻게 지원할지 고민이 필요함
- [ ]
기능 감정 토큰 임베딩
- [ ]
기능 현재 `<|EMOTE_.*|>` 패턴 토큰은 토크나이저가 관리하지 않아서, 추론 중에 스트리밍 호환 토크나이저를 여러 개 따로 작성해야 함
- [ ]
기능 현재 `<|EMOTE_.*|>` 패턴 토큰은 토크나이저가 관리하지 않아서, 추론 중에 스트리밍 호환 토크나이저를 여러 개 따로 작성해야 함
-- [x]
버그 `useQueue` 가 처리 중 `isProcessing` 락으로 분리된 큐 항목을 고려하지 않음 (2024년 7월 9일)
-- [x]
버그 Local Storage 에 저장된 모델이 필요한 데이터와 맞지 않아 `computed` 무한 루프가 발생해 인터페이스가 멈춤 (2024년 7월 9일)
+- [x]
버그 `useQueue`가 처리 중 `isProcessing` 락으로 분리된 큐 항목을 고려하지 않음 (2024년 7월 9일)
+- [x]
버그 Local Storage에 저장된 모델이 필요한 데이터와 맞지 않아 `computed` 무한 루프가 발생해 인터페이스가 멈춤 (2024년 7월 9일)
- [x]
버그 Live2DViewer 프레임의 자동 크기 감지 기능에 문제가 있음 (2024년 7월 9일)
- [x]
버그 streamSpeech 중 무한 루프를 피하려고 빈 텍스트를 격리하면서 생긴 문제 (2024년 7월 9일)
-- [x]
기능 `useQueue` 가 `handler` 안에서 커스텀 이벤트를 지원 (2024년 7월 9일)
+- [x]
기능 `useQueue`가 `handler` 안에서 커스텀 이벤트를 지원 (2024년 7월 9일)
- [ ]
기능 텍스트 출력과 음성 출력 타이밍 동기화
- - [ ]
기능 `ttsQueue` 와 `audioPlaybackQueue` 가 대응하는 타임스탬프를 저장할 수 있게
+ - [ ]
기능 `ttsQueue`와 `audioPlaybackQueue`가 대응하는 타임스탬프를 저장할 수 있게
- [ ]
기능 `audioPlaybackQueue` 처리와 재생을 마칠 때 오디오 길이 계산
- [ ]
기능 공백으로 텍스트를 나눠 `['hello ', 'this ', 'is ', 'neuro ']` 얻기
- [ ]
기능 오디오 길이 ÷ 텍스트 글자 수 = 토큰 그룹 출력마다의 지연
- [ ]
기능 지연 지시에 따라 텍스트 출력 (지연 큐를 써도 됨)
-- [ ] Neuro Sama 의 추론 속도는 정말 빠릅니다. 벡터 DB 회상 + 재추론 + 작업 배분까지 감안해도 이렇게 빠를 수는 없을 것 같은데
-- [x] Neuro Sama 의 TTS 도 매우 빠릅니다. 제가 아는 어떤 TTS 보다도 빠릅니다
- - [x] MicVAD 와 Whisper 를 연동하고 나니 아주 빠르게 느껴짐. 생각보다 훨씬 간단했음
+- [ ] Neuro Sama의 추론 속도는 정말 빠릅니다. 벡터 DB 회상 + 재추론 + 작업 배분까지 감안해도 이렇게 빠를 수는 없을 것 같은데
+- [x] Neuro Sama의 TTS도 매우 빠릅니다. 제가 아는 어떤 TTS 보다도 빠릅니다
+ - [x] MicVAD와 Whisper를 연동하고 나니 아주 빠르게 느껴짐. 생각보다 훨씬 간단했음
- [ ] 로컬 Whisper
- [ ] 로컬 TTS
-- [ ] Vedal 은 Neuro Sama 의 음성 인식을 파인튜닝할 때 데이터를 얼마나 썼을까?
- - [ ] `Evil` 과 `Evil Neuro` 같은 단어는 의미상 합쳐질 수 없어야 하는데, RAG 로 강제하려면 꽤 강력한 벡터 DB 노드 지원이 필요할 것
+- [ ] Vedal은 Neuro Sama의 음성 인식을 파인튜닝할 때 데이터를 얼마나 썼을까?
+ - [ ] `Evil`과 `Evil Neuro` 같은 단어는 의미상 합쳐질 수 없어야 하는데, RAG로 강제하려면 꽤 강력한 벡터 DB 노드 지원이 필요할 것
### 기억
- [ ] keep alive 방안
- - [ ] 유휴 상태라면 30분마다 Neuro 에게 연속 추론 프롬프트를 주기
- - [ ] Neuro 에게 지금 뭘 하고 있는지 묻고, 그것을 기록하도록 돕기
- - [ ] Neuro 에게 다음에 뭘 하고 싶은지 물어 지루해지지 않게 하기
- - [ ] 24시간을 1로 환산. 그러지 않으면 GPT 가 숫자 감각을 쉽게 잃음
+ - [ ] 유휴 상태라면 30분마다 Neuro에게 연속 추론 프롬프트를 주기
+ - [ ] Neuro에게 지금 뭘 하고 있는지 묻고, 그것을 기록하도록 돕기
+ - [ ] Neuro에게 다음에 뭘 하고 싶은지 물어 지루해지지 않게 하기
+ - [ ] 24시간을 1로 환산. 그러지 않으면 GPT가 숫자 감각을 쉽게 잃음
- [ ] 연속 추론
- - [x]
실험 Perplexity 와의 논의 https://www.perplexity.ai/search/I-want-to-jKXpnx6hT6uvhm0qbu6ofA#0 (2024년 6월 8일)
- - [x]
실험 Poe 에서 실험 [https://poe.com/s/PqQfwNd2V2wFpmR0YUke](https://poe.com/s/PqQfwNd2V2wFpmR0YUke) (2024년 7월 8일)
+ - [x]
실험 Perplexity와의 논의 https://www.perplexity.ai/search/I-want-to-jKXpnx6hT6uvhm0qbu6ofA#0 (2024년 6월 8일)
+ - [x]
실험 Poe에서 실험 [https://poe.com/s/PqQfwNd2V2wFpmR0YUke](https://poe.com/s/PqQfwNd2V2wFpmR0YUke) (2024년 7월 8일)
- [ ] 루프 만들기
- [ ] 무엇을 하고 싶은가
- [ ] 액션 맵을 생성할 수 있음
@@ -317,15 +317,15 @@ title: 연대기 v0.0.1
- [ ] 무엇을 하고 싶은가
- [ ] ...
- [ ] 단방향 핑 방안 (저비용)
- - [ ] 유휴 상태라면 매시간 Neuro 에게 지난 1시간의 상태 업데이트를 보내기
+ - [ ] 유휴 상태라면 매시간 Neuro에게 지난 1시간의 상태 업데이트를 보내기
- [ ] 24시간이 지나면 상태 업데이트를 컨텍스트에 넣지 않고 가동 시간만 요약하기
- - [ ] 매 상호작용 전에 Neuro 에게 가동 시간 프롬프트를 보내 시간의 흐름을 느끼게 하기
+ - [ ] 매 상호작용 전에 Neuro에게 가동 시간 프롬프트를 보내 시간의 흐름을 느끼게 하기
## 동작
-- [ ] Minecraft 플레이 [AI 가 Minecraft 를 플레이하게 하는 방법? Voyager 논문 노트](https://nolebase.ayaka.io/to/27024f5434)
+- [ ] Minecraft 플레이 [AI가 Minecraft를 플레이하게 하는 방법? Voyager 논문 노트](https://nolebase.ayaka.io/to/27024f5434)
- [ ] 검색
-- [ ] VSCode 로 코드 작성
+- [ ] VSCode로 코드 작성
- [ ] 지식 베이스 작성 돕기
- [ ] Factorio 플레이
- [ ] 다른 GPT 들에게 지시하기
@@ -347,7 +347,7 @@ title: 연대기 v0.0.1
- [【무료 모델】이렇게 귀여운 강아지를 무료로!_bilibili](https://www.bilibili.com/video/BV1LM41137vK/)
- [【무료 live2d 모델】작은 악마를 무료로 데려가세요(∠・ω< )⌒☆_bilibili](https://www.bilibili.com/video/BV1fP411e7fA/)
- [【무료 L2D 모델】달콤 짭짤한 기계 소녀! 무료 모델 공개~클릭해서 받아가세요_bilibili](https://www.bilibili.com/video/BV1S8411H7zf/)
- - [【Frieren 무료 live2d 모델】그때 Himmel 에게 이 기술을 썼더니 위력이 너무 세서 기절했다=w=_bilibili](https://www.bilibili.com/video/BV1te411b7Xp)
+ - [【Frieren 무료 live2d 모델】그때 Himmel에게 이 기술을 썼더니 위력이 너무 세서 기절했다=w=_bilibili](https://www.bilibili.com/video/BV1te411b7Xp)
- [【무료 live2D 모델】1만 위안짜리 초고정밀 모델을 그냥 무료로?_bilibili](https://www.bilibili.com/video/BV1hB4y1Q7vn/)
- [Bilibili Workshop](https://gf.bilibili.com/item/detail/1105759077)
- [【무료 live2d 모델 쇼케이스】지뢰계 소녀 받아가기_bilibili](https://www.bilibili.com/video/BV1eu4y187zw)
@@ -464,7 +464,7 @@ The available actions:
And the last, do what ever you want!
```
-- 대규모 언어 모델이 Delay 를 스스로 다루게 하면 결과가 매우 나빴습니다. live2d 모션 애니메이션 길이가 제각각이라 여러 표정이 겹칠 때 문제가 자주 생겼습니다
+- 대규모 언어 모델이 Delay를 스스로 다루게 하면 결과가 매우 나빴습니다. live2d 모션 애니메이션 길이가 제각각이라 여러 표정이 겹칠 때 문제가 자주 생겼습니다
- 지금의 프론트엔드 표시 레이어 토크나이저 구현에도 문제가 좀 있어서, 겹침 처리가 잘 안 됩니다
- 수정 완료. 이제 전용 llmmarker 파서 캡슐화가 있습니다
diff --git a/docs/content/ko/docs/chronicles/version-v0.1.0/index.md b/docs/content/ko/docs/chronicles/version-v0.1.0/index.md
index 775b1b5e1..806b36995 100644
--- a/docs/content/ko/docs/chronicles/version-v0.1.0/index.md
+++ b/docs/content/ko/docs/chronicles/version-v0.1.0/index.md
@@ -17,28 +17,28 @@ title: 연대기 v0.1.0
- [x] ~~오디오 전사~~
- [x] ~~프론트엔드에서 백엔드로 오디오 스트리밍~~
- [x] WebSocket 기반 양방향 통신을 위해 socket.io 사용 [Socket.IO](https://socket.io/) (6월 10일)
- - [x] Socket.io 는 사실 WebSocket 기반이 아니다
+ - [x] Socket.io는 사실 WebSocket 기반이 아니다
- [node.js - What is the major scenario to use Socket.IO - Stack Overflow](https://stackoverflow.com/questions/18587104/what-is-the-major-scenario-to-use-socket-io)
- [node.js - Differences between socket.io and websockets - Stack Overflow](https://stackoverflow.com/questions/10112178/differences-between-socket-io-and-websockets)
- [x] 프론트엔드는 `socket.io-client` 패키지 사용, `pnpm i socket.io-client`
- - [x] WebSocket 은 지원이 좋고 Nuxt 의 Nitro 도 지원한다. [How to use with Nuxt | Socket.IO](https://socket.io/how-to/use-with-nuxt)
+ - [x] WebSocket은 지원이 좋고 Nuxt의 Nitro도 지원한다. [How to use with Nuxt | Socket.IO](https://socket.io/how-to/use-with-nuxt)
- [x] 백엔드는 `socket.io` 패키지 사용, `pnpm i socket.io`
- - Nuxt 3 와 socket.io
+ - Nuxt 3와 socket.io
- [richardeschloss/nuxt-socket-io: Nuxt Socket IO - socket.io client and server module for Nuxt](https://github.com/richardeschloss/nuxt-socket-io)
- [javascript - Socket.io websocket not working in Nuxt 3 when in production - Stack Overflow](https://stackoverflow.com/questions/73592619/socket-io-websocket-not-working-in-nuxt-3-when-in-production)
- [adityar15/nuxt3socket (github.com)](https://github.com/adityar15/nuxt3socket)
- - [x] ~~오디오 스트리밍에 WebRTC 사용, VueUse 도 이를 지원함~~
- - [x] Nuxt 와 Nitro 가 아직 지원하지 않아 일단 보류. 그룹 채팅이나 Discord 용으로 검토해 볼 수 있음.
+ - [x] ~~오디오 스트리밍에 WebRTC 사용, VueUse도 이를 지원함~~
+ - [x] Nuxt와 Nitro가 아직 지원하지 않아 일단 보류. 그룹 채팅이나 Discord 용으로 검토해 볼 수 있음.
- 튜토리얼:
- [Getting started with media devices | WebRTC](https://webrtc.org/getting-started/media-devices?hl=en)
- [WebRTC | JavaScript Standard Reference Tutorial](https://wohugb.gitbooks.io/javascript/content/htmlapi/webrtc.html)
- - ~~Transformers.js + Whisper 로 충분함~~
- - [x] Chrome / Edge 가 이제 WebGPU 를 지원함
+ - ~~Transformers.js + Whisper로 충분함~~
+ - [x] Chrome / Edge가 이제 WebGPU를 지원함
- [x] 데모가 있음: [Real-time Whisper WebGPU - a Hugging Face Space by Xenova](https://huggingface.co/spaces/Xenova/realtime-whisper-webgpu) (현재는 오픈소스가 아님)
- [x] ~~Whisper 추론을 브라우저에서 바로 수행할 수 있음~~
- - [x] ~~WebGPU 가 아직 지원되지 않음~~ (이제 지원됨)
+ - [x] ~~WebGPU가 아직 지원되지 않음~~ (이제 지원됨)
- [x] [🤗 Transformers.js + ONNX Runtime WebGPU in Chrome extension | by Wei Lu | Medium](https://medium.com/@GenerationAI/transformers-js-onnx-runtime-webgpu-in-chrome-extension-13b563933ca9)
- - ~~Node.js CPP Addon 을 통해 Whisper.cpp 를 임베딩하는 방안 검토~~
+ - ~~Node.js CPP Addon을 통해 Whisper.cpp를 임베딩하는 방안 검토~~
- [whisper.cpp](https://github.com/ggerganov/whisper.cpp)
- 튜토리얼:
- [Realtime video transcription and translation with Whisper and NLLB on MacBook Air | by Wei Lu | Medium](https://medium.com/@GenerationAI/realtime-video-transcription-and-translation-with-whisper-and-nllb-on-macbook-air-31db4c62c074)
@@ -64,7 +64,7 @@ title: 연대기 v0.1.0
## **모델**
- **VRM**
- - [`@pixiv/three-vrm`](https://github.com/pixiv/three-vrm/) 을 알려 준 [kwaa](https://github.com/kwaa) 에게 감사드립니다
+ - [`@pixiv/three-vrm`](https://github.com/pixiv/three-vrm/) 을 알려 준 [kwaa](https://github.com/kwaa)에게 감사드립니다
- 관련 도구와 플러그인:
- [VRM Add-on for Blender](https://vrm-addon-for-blender.info/en/)
- [VRM format — Blender Extensions](https://extensions.blender.org/add-ons/vrm/)
diff --git a/docs/content/ko/docs/contributing/design-guidelines/index.md b/docs/content/ko/docs/contributing/design-guidelines/index.md
index ce8fc3bcc..d34a143d3 100644
--- a/docs/content/ko/docs/contributing/design-guidelines/index.md
+++ b/docs/content/ko/docs/contributing/design-guidelines/index.md
@@ -1,5 +1,5 @@
---
title: 디자인 가이드라인
-description: Project AIRI 에 디자인으로 기여하는 방법
+description: Project AIRI에 디자인으로 기여하는 방법
---
diff --git a/docs/content/ko/docs/contributing/design-guidelines/resources.md b/docs/content/ko/docs/contributing/design-guidelines/resources.md
index 5c6b1f958..5c708c105 100644
--- a/docs/content/ko/docs/contributing/design-guidelines/resources.md
+++ b/docs/content/ko/docs/contributing/design-guidelines/resources.md
@@ -5,13 +5,13 @@ description: 참고하고 영감을 얻을 수 있는 자료들
### yui540
-제가 아는 최고의 CSS 화면 전환 제작자 중 한 명은 **[yui540](https://yui540.com/)** 입니다. 눈부신 ACG 웹사이트를 정말 많이 디자인했고, 그중 가장 유명한 작품은 [臆病な魔女](https://cowardly-witch.netlify.app/) 입니다 (소스 코드는 [yui540](https://github.com/yui540?tab=repositories) 에서 찾아볼 수 있습니다).
+제가 아는 최고의 CSS 화면 전환 제작자 중 한 명은 **[yui540](https://yui540.com/)** 입니다. 눈부신 ACG 웹사이트를 정말 많이 디자인했고, 그중 가장 유명한 작품은 [臆病な魔女](https://cowardly-witch.netlify.app/) 입니다 (소스 코드는 [yui540](https://github.com/yui540?tab=repositories)에서 찾아볼 수 있습니다).
위와 비슷한 전환 효과를 구현하고 싶다면 [yui540/css-animations: 俺流CSSアニメーション](https://github.com/yui540/css-animations) 저장소를 참고하세요.
### [Nihe Works](https://nihe.work/)
-[YouTube](https://www.youtube.com/@nihe8683) 에도 작업 영상을 올리고 있으니 함께 살펴보세요.
+[YouTube](https://www.youtube.com/@nihe8683)에도 작업 영상을 올리고 있으니 함께 살펴보세요.
## 모음 사이트
diff --git a/docs/content/ko/docs/contributing/design-guidelines/tools.md b/docs/content/ko/docs/contributing/design-guidelines/tools.md
index c2d042a23..1e50dfa6e 100644
--- a/docs/content/ko/docs/contributing/design-guidelines/tools.md
+++ b/docs/content/ko/docs/contributing/design-guidelines/tools.md
@@ -1,21 +1,21 @@
---
title: 도구
-description: Project AIRI 의 UI, UX 를 디자인하기 위한 도구들
+description: Project AIRI의 UI, UX를 디자인하기 위한 도구들
---
## 색상
-개발 과정에서는 기본적으로 [UnoCSS](https://unocss.dev) 라는 도구로 스타일시트에 관한 모든 것을 생성합니다. [Tailwind](https://tailwindcss.com) 와 똑같이 동작하는 훌륭한 도구입니다.
+개발 과정에서는 기본적으로 [UnoCSS](https://unocss.dev)라는 도구로 스타일시트에 관한 모든 것을 생성합니다. [Tailwind](https://tailwindcss.com)와 똑같이 동작하는 훌륭한 도구입니다.
-따라서 기본 색상 팔레트는 [Colors - Core concepts - Tailwind CSS](https://tailwindcss.com/docs/colors) 에 정리되어 있습니다.
+따라서 기본 색상 팔레트는 [Colors - Core concepts - Tailwind CSS](https://tailwindcss.com/docs/colors)에 정리되어 있습니다.
-일반적으로 기본 테마에는 `neutral`, `pink`, `violet`, `cyan` 을 사용합니다. [UnoCSS](https://unocss.dev) 와 [Tailwind](https://tailwindcss.com) 모두 색상에 투명도를 조절하는 기능을 지원하지만, [Refactoring UI](https://refactoringui.com/) 에 따르면:
+일반적으로 기본 테마에는 `neutral`, `pink`, `violet`, `cyan`을 사용합니다. [UnoCSS](https://unocss.dev)와 [Tailwind](https://tailwindcss.com) 모두 색상에 투명도를 조절하는 기능을 지원하지만, [Refactoring UI](https://refactoringui.com/) 에 따르면:
> 색의 채도를 바꾸고 싶을 때는 투명도를 쓰기보다, 대비가 가장 좋은 불투명한(알파 채널이 없는) 색을 직접 골라야 합니다.
그러니 투명도가 타이포그래피 디자인의 일부가 아닌 이상, 가독성을 위해 가장 알맞은 불투명 색상을 골라 주세요.
-또 하나 즐겨 쓰는 훌륭한 도구는 [Radix Colors](https://www.radix-ui.com/colors) 입니다. 탄탄한 색채 이론을 바탕으로 좋은 팔레트를 만들어 두었기에, 우리 인터랙티브 UI 요소의 기본 재료 같은 역할을 합니다. 여기서도 알맞은 색을 고를 수 있습니다.
+또 하나 즐겨 쓰는 훌륭한 도구는 [Radix Colors](https://www.radix-ui.com/colors)입니다. 탄탄한 색채 이론을 바탕으로 좋은 팔레트를 만들어 두었기에, 우리 인터랙티브 UI 요소의 기본 재료 같은 역할을 합니다. 여기서도 알맞은 색을 고를 수 있습니다.
_보색_ 이 무엇인지는 이미 알고 계실 텐데, 색상 대비를 잡는 데 유용합니다. 보색을 빠르고 인터랙티브하게 고를 수 있는 좋은 도구를 몇 가지 소개합니다:
diff --git a/docs/content/ko/docs/contributing/docs.md b/docs/content/ko/docs/contributing/docs.md
index 18efaea43..7adb05dfb 100644
--- a/docs/content/ko/docs/contributing/docs.md
+++ b/docs/content/ko/docs/contributing/docs.md
@@ -1,6 +1,6 @@
---
title: 문서 사이트
-description: Project AIRI 에 기여하기
+description: Project AIRI에 기여하기
---
### 문서 사이트
diff --git a/docs/content/ko/docs/contributing/index.md b/docs/content/ko/docs/contributing/index.md
index 655f38447..b5e8a455e 100644
--- a/docs/content/ko/docs/contributing/index.md
+++ b/docs/content/ko/docs/contributing/index.md
@@ -1,6 +1,6 @@
---
title: 기여하기
-description: Project AIRI 에 기여하기
+description: Project AIRI에 기여하기
---
안녕하세요! 이 프로젝트에 기여하는 데 관심을 가져 주셔서 감사합니다. 이 가이드가 첫걸음을 도와드릴 거예요.
@@ -17,9 +17,9 @@ description: Project AIRI 에 기여하기
0. [Visual Studio](https://visualstudio.microsoft.com/downloads/) 를 내려받고 다음 안내를 따르세요: https://rust-lang.github.io/rustup/installation/windows-msvc.html#walkthrough-installing-visual-studio-2022
- > Visual Studio 를 설치할 때 Windows SDK 와 C++ 빌드 도구를 반드시 함께 설치하세요.
+ > Visual Studio를 설치할 때 Windows SDK와 C++ 빌드 도구를 반드시 함께 설치하세요.
-1. PowerShell 을 엽니다
+1. PowerShell을 엽니다
2. [`scoop`](https://scoop.sh/) 을 설치합니다
```powershell
@@ -27,20 +27,20 @@ description: Project AIRI 에 기여하기
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
```
-3. `scoop` 으로 `git`, Node.js, `rustup`, `msvc` 를 설치합니다
+3. `scoop`으로 `git`, Node.js, `rustup`, `msvc`를 설치합니다
```powershell
scoop install git nodejs rustup
# Rust 의존성용
- # crates 나 apps/tamagotchi 를 개발하지 않는다면 필요 없습니다
+ # crates나 apps/tamagotchi를 개발하지 않는다면 필요 없습니다
scoop install main/rust-msvc
# Rust & Windows 전용
rustup toolchain install stable-x86_64-pc-windows-msvc
rustup default stable-x86_64-pc-windows-msvc
```
-4. `corepack` 으로 `pnpm` 을 설치합니다
+4. `corepack`으로 `pnpm`을 설치합니다
```powershell
corepack enable
@@ -53,13 +53,13 @@ description: Project AIRI 에 기여하기
macOS 설정
0. 터미널(또는 iTerm2, Ghostty, Kitty 등)을 엽니다
-1. `brew` 로 `git` 과 `node` 를 설치합니다
+1. `brew`로 `git`과 `node`를 설치합니다
```shell
brew install git node
```
-2. `corepack` 으로 `pnpm` 을 설치합니다
+2. `corepack`으로 `pnpm`을 설치합니다
```shell
corepack enable
@@ -72,9 +72,9 @@ description: Project AIRI 에 기여하기
Linux 설정
0. 터미널을 엽니다
-1. [nodesource/distributions: NodeSource Node.js Binary Distributions](https://github.com/nodesource/distributions?tab=readme-ov-file#table-of-contents) 를 따라 `node` 를 설치합니다
-2. [Git](https://git-scm.com/downloads/linux) 안내를 따라 `git` 을 설치합니다
-3. `corepack` 으로 `pnpm` 을 설치합니다
+1. [nodesource/distributions: NodeSource Node.js Binary Distributions](https://github.com/nodesource/distributions?tab=readme-ov-file#table-of-contents)를 따라 `node`를 설치합니다
+2. [Git](https://git-scm.com/downloads/linux) 안내를 따라 `git`을 설치합니다
+3. `corepack`으로 `pnpm`을 설치합니다
```shell
corepack enable
@@ -154,10 +154,10 @@ npm i -g @antfu/ni
설치하고 나면
-- `pnpm install`, `npm install`, `yarn install` 대신 `ni` 를 쓸 수 있습니다.
-- `pnpm run`, `npm run`, `yarn run` 대신 `nr` 을 쓸 수 있습니다.
+- `pnpm install`, `npm install`, `yarn install` 대신 `ni`를 쓸 수 있습니다.
+- `pnpm run`, `npm run`, `yarn run` 대신 `nr`을 쓸 수 있습니다.
-패키지 매니저가 무엇인지 신경 쓸 필요가 없습니다. `ni` 가 알맞은 것을 골라 줍니다.
+패키지 매니저가 무엇인지 신경 쓸 필요가 없습니다. `ni`가 알맞은 것을 골라 줍니다.
:::
## 개발하고 싶은 애플리케이션 고르기
@@ -178,7 +178,7 @@ pnpm lint && pnpm typecheck
::: tip
-[@antfu/ni](https://github.com/antfu-collective/ni) 를 설치했다면 `nr` 로 명령을 실행할 수 있습니다:
+[@antfu/ni](https://github.com/antfu-collective/ni)를 설치했다면 `nr`로 명령을 실행할 수 있습니다:
```shell
nr lint && nr typecheck
@@ -219,4 +219,4 @@ git remote add upstream https://github.com/moeru-ai/airi.git
## 우와! 해내셨네요!
-축하합니다! 이 프로젝트에 첫 기여를 하셨습니다. 이제 메인테이너가 여러분의 Pull Request 를 리뷰할 때까지 기다리시면 됩니다.
+축하합니다! 이 프로젝트에 첫 기여를 하셨습니다. 이제 메인테이너가 여러분의 Pull Request를 리뷰할 때까지 기다리시면 됩니다.
diff --git a/docs/content/ko/docs/contributing/services/discord.md b/docs/content/ko/docs/contributing/services/discord.md
index c108e629d..022958995 100644
--- a/docs/content/ko/docs/contributing/services/discord.md
+++ b/docs/content/ko/docs/contributing/services/discord.md
@@ -1,6 +1,6 @@
---
title: Discord 봇
-description: Project AIRI 에 기여하기
+description: Project AIRI에 기여하기
---
### Discord 봇 연동
@@ -15,7 +15,7 @@ cd integrations/discord-bot
cp .env .env.local
```
-`.env.local` 에서 인증 정보를 수정하세요.
+`.env.local`에서 인증 정보를 수정하세요.
봇 실행하기
diff --git a/docs/content/ko/docs/contributing/services/minecraft.md b/docs/content/ko/docs/contributing/services/minecraft.md
index 3f5df2152..578fa8c4b 100644
--- a/docs/content/ko/docs/contributing/services/minecraft.md
+++ b/docs/content/ko/docs/contributing/services/minecraft.md
@@ -1,6 +1,6 @@
---
title: Minecraft
-description: Project AIRI 에 기여하기
+description: Project AIRI에 기여하기
---
### Minecraft 에이전트
@@ -9,7 +9,7 @@ description: Project AIRI 에 기여하기
cd integrations/minecraft
```
-Minecraft 클라이언트를 실행하고 원하는 포트로 월드를 개방한 뒤, 그 포트 번호를 `.env.local` 에 입력하세요.
+Minecraft 클라이언트를 실행하고 원하는 포트로 월드를 개방한 뒤, 그 포트 번호를 `.env.local`에 입력하세요.
`.env` 설정하기
@@ -17,7 +17,7 @@ Minecraft 클라이언트를 실행하고 원하는 포트로 월드를 개방
cp .env .env.local
```
-`.env.local` 에서 인증 정보를 수정하세요.
+`.env.local`에서 인증 정보를 수정하세요.
봇 실행하기
diff --git a/docs/content/ko/docs/contributing/services/satori.md b/docs/content/ko/docs/contributing/services/satori.md
index 4ee6ca213..6032dcefd 100644
--- a/docs/content/ko/docs/contributing/services/satori.md
+++ b/docs/content/ko/docs/contributing/services/satori.md
@@ -1,6 +1,6 @@
---
title: Satori 봇
-description: Project AIRI 에 기여하기
+description: Project AIRI에 기여하기
---
### Satori 봇
@@ -15,7 +15,7 @@ cd integrations/satori-bot
cp .env .env.local
```
-`.env.local` 에서 각종 키와 설정 정보를 수정하세요.
+`.env.local`에서 각종 키와 설정 정보를 수정하세요.
봇 시작하기:
@@ -25,7 +25,7 @@ pnpm -F @proj-airi/satori-bot dev
::: tip
-[@antfu/ni](https://github.com/antfu-collective/ni) 를 쓰신다면 이렇게 할 수 있습니다:
+[@antfu/ni](https://github.com/antfu-collective/ni)를 쓰신다면 이렇게 할 수 있습니다:
```shell
nr -F @proj-airi/satori-bot dev
diff --git a/docs/content/ko/docs/contributing/services/telegram.md b/docs/content/ko/docs/contributing/services/telegram.md
index ba832a0ad..03a87ea6c 100644
--- a/docs/content/ko/docs/contributing/services/telegram.md
+++ b/docs/content/ko/docs/contributing/services/telegram.md
@@ -1,6 +1,6 @@
---
title: Telegram 봇
-description: Project AIRI 에 기여하기
+description: Project AIRI에 기여하기
---
### Telegram 봇 연동
@@ -18,7 +18,7 @@ docker compose up -d
cp .env .env.local
```
-`.env.local` 에서 인증 정보를 수정하세요.
+`.env.local`에서 인증 정보를 수정하세요.
데이터베이스 마이그레이션
diff --git a/docs/content/ko/docs/contributing/tamagotchi.md b/docs/content/ko/docs/contributing/tamagotchi.md
index fb86308ac..4c4788c4e 100644
--- a/docs/content/ko/docs/contributing/tamagotchi.md
+++ b/docs/content/ko/docs/contributing/tamagotchi.md
@@ -1,6 +1,6 @@
---
title: 데스크톱
-description: Project AIRI 에 기여하기
+description: Project AIRI에 기여하기
---
### Stage Tamagotchi (데스크톱 버전)
diff --git a/docs/content/ko/docs/contributing/webui.md b/docs/content/ko/docs/contributing/webui.md
index c30d16990..98fa70596 100644
--- a/docs/content/ko/docs/contributing/webui.md
+++ b/docs/content/ko/docs/contributing/webui.md
@@ -1,6 +1,6 @@
---
title: 웹 UI
-description: Project AIRI 에 기여하기
+description: Project AIRI에 기여하기
---
### Stage Web ([airi.moeru.ai](https://airi.moeru.ai) 브라우저 버전)
diff --git a/docs/content/ko/docs/manual/config/index.md b/docs/content/ko/docs/manual/config/index.md
index 021cb2a99..87515357a 100644
--- a/docs/content/ko/docs/manual/config/index.md
+++ b/docs/content/ko/docs/manual/config/index.md
@@ -6,7 +6,7 @@ description: Project AIRI 사용법
## 설정
시스템 트레이에서 설정을 열어 더 자세히 커스터마이즈할 수 있습니다. 예를 들어
-AIRI 의 테마 색상을 바꾸거나, Live2D(2D) 또는 VRM(3D, Grok Companion 과 비슷한 형태)
+AIRI의 테마 색상을 바꾸거나, Live2D(2D) 또는 VRM(3D, Grok Companion과 비슷한 형태)
같은 다른 모델로 전환할 수 있습니다.
웹 버전은 모바일 기기를 포함해 어디서나 손쉽게 접근할 수 있습니다.
-데스크톱은 VTuber 스트리밍, 컴퓨터 조작, 그리고 AIRI 를 돌리기 위해 막대한 양의 토큰 비용을
+데스크톱은 VTuber 스트리밍, 컴퓨터 조작, 그리고 AIRI를 돌리기 위해 막대한 양의 토큰 비용을
지불할 필요가 없는 로컬 LLM 접근 등 더 고급 용도에 적합합니다.
@@ -91,4 +91,4 @@ description: Project AIRI 의 UI 를 알아보세요
이 프로젝트에 기여하는 방법을 이해하는 데 도움이 되는 가이드는 [기여하기](../contributing/) 페이지를 참고해 주세요.
-Project AIRI 의 UI 를 디자인하고 개선하는 데 도움이 되는 자료는 [디자인 가이드라인](../contributing/design-guidelines/resources) 페이지를 참고해 주세요.
+Project AIRI의 UI를 디자인하고 개선하는 데 도움이 되는 자료는 [디자인 가이드라인](../contributing/design-guidelines/resources) 페이지를 참고해 주세요.
diff --git a/docs/content/ko/docs/overview/other-similar-projects.md b/docs/content/ko/docs/overview/other-similar-projects.md
index d241501d1..177f67020 100644
--- a/docs/content/ko/docs/overview/other-similar-projects.md
+++ b/docs/content/ko/docs/overview/other-similar-projects.md
@@ -1,5 +1,5 @@
---
title: 비슷한 다른 프로젝트들
-description: Project AIRI 와 비슷한 다른 프로젝트들을 알아보세요
+description: Project AIRI와 비슷한 다른 프로젝트들을 알아보세요
---
diff --git a/docs/content/ko/docs/overview/versions.md b/docs/content/ko/docs/overview/versions.md
index f005f2426..eb23f6ccc 100644
--- a/docs/content/ko/docs/overview/versions.md
+++ b/docs/content/ko/docs/overview/versions.md
@@ -1,6 +1,6 @@
---
title: 버전
-description: AIRI 의 여러 버전과 받는 방법
+description: AIRI의 여러 버전과 받는 방법
---