From 0cef4f2a51b5555c0bd64291b67ef3af6e7e03cb Mon Sep 17 00:00:00 2001
From: syui <syui@syui.ai>
Date: Sat, 22 Mar 2025 19:08:19 +0900
Subject: [PATCH] fix

---
 book/SUMMARY.md         |  3 +++
 book/gasp/13_chatgpt.md | 55 +++++++++++++++++++++++++++++++++++++++++
 book/gasp/README.md     |  2 --
 book/project/06_ep.md   | 53 +++++++++++++++++++++++++++++++++++++++
 book/pwsh/05_aibot.md   | 14 +++++++++++
 book/pwsh/README.md     |  3 +++
 6 files changed, 128 insertions(+), 2 deletions(-)
 create mode 100644 book/gasp/13_chatgpt.md
 create mode 100644 book/project/06_ep.md
 create mode 100644 book/pwsh/05_aibot.md

diff --git a/book/SUMMARY.md b/book/SUMMARY.md
index 5a2109a..7edd6e1 100644
--- a/book/SUMMARY.md
+++ b/book/SUMMARY.md
@@ -11,6 +11,7 @@
  * [ssh](pwsh/02_ssh.md)
  * [ttyd](pwsh/03_ttyd.md)
  * [slidev](pwsh/04_slidev.md)
+ * [aibot](pwsh/05_aibot.md)
 * [game animation sample](gasp/README.md)
  * [キャラクターを追加する](gasp/01_character.md)
  * [飛びつける高さを増やす](gasp/02_jump.md)
@@ -24,6 +25,7 @@
  * [椅子に座る](gasp/09_chair.md)
  * [階段に登る](gasp/10_stairs.md)
  * [武器を装備する](gasp/12_weapon.md)
+ * [NPCとの会話をAIにする](gasp/13_chatgpt.md)
 * [control rig sample](crs/README.md)
  * [CRでキャラクターを動かす](crs/01_character.md)
  * [ボスを作る](crs/02_boss.md)
@@ -93,5 +95,6 @@
  * [毎日プレイ](project/03_ep.md)
  * [自由と不自由](project/04_ep.md)
  * [ロードマップ](project/05_ep.md)
+ * [個人開発の真髄](project/06_ep.md)
  * [youtube](project/01_youtube.md)
 * [end](end/README.md)
diff --git a/book/gasp/13_chatgpt.md b/book/gasp/13_chatgpt.md
new file mode 100644
index 0000000..ae0fb91
--- /dev/null
+++ b/book/gasp/13_chatgpt.md
@@ -0,0 +1,55 @@
+# NPCとの会話をAIにする
+
+NPCなどの会話や操作を音声とAIで実行します。
+
+- [RuntimeSpeechRecognizer](https://github.com/gtreshchev/RuntimeSpeechRecognizer)
+- [RuntimeAudioImporter](https://github.com/gtreshchev/RuntimeAudioImporter)
+- [ChatGPT](https://platform.openai.com/docs/api-reference/introduction)
+- [elevenlabs](https://elevenlabs.io/docs/api-reference/text-to-speech)
+
+具体的な仕組みとしては、まずEnterを押すと、音声を読み取ります。読み取った音声を文字に変換し、それをchatgptに渡します。回答を再び音声に変換し、NPCと会話できるというシステムです。
+
+<iframe src="https://blueprintue.com/render/i95n84w5/" scrolling="no" allowfullscreen style="width:100%;height:400px"></iframe>
+
+```sh
+$ curl https://api.openai.com/v1/chat/completions \
+  -H "Content-Type: application/json" \
+  -H "Authorization: Bearer YOUR_API_KEY" \
+  -d '{
+    "model": "gpt-4o-mini",
+    "messages": [{"role": "user", "content": "Your question here"}],
+    "temperature": 0.7
+  }'
+```
+
+```sh
+$ curl -X POST "https://api.elevenlabs.io/v1/text-to-speech/VOICE_ID" \
+     -H "xi-api-key: YOUR_API_KEY" \
+     -H "Content-Type: application/json" \
+     -d '{
+           "text": "Hello world!",
+           "model_id": "eleven_monolingual_v1",
+           "voice_settings": {
+             "stability": 0.5,
+             "similarity_boost": 0.5
+           }
+         }' \
+     --output output.mp3
+```
+
+## 問題点
+
+chatgptやelevenlabsは使用制限、あるいは課金が必要になります。
+
+プレイヤーがNPCと会話する回数は初回のみのケースが多いと予想され、回数を制限することで、人気ゲームでこのような仕組みを実装しても、初月以降の負担はほぼ発生しないと予測されます。
+
+しかし、hackされ、NPCとの会話でスパムを送信されることで負荷が増大する危険性があります。
+
+したがって、このような仕組みは本番のゲームに実装すべきか難しいところです。
+
+メリットとしては会話がプレイヤーごとに変わってくること。開発者がテキストを用意しなくても良いところが挙げられます。デメリットは制御できないところです。
+
+これをlocalで動かすllmを使用することで多少の危険は避けられます。
+
+今後、ゲームはどのような方向に進んでいくのでしょうか。NPCはAIが担当することになっていくのかもしれません。
+
diff --git a/book/gasp/README.md b/book/gasp/README.md
index b1a4775..6d69654 100644
--- a/book/gasp/README.md
+++ b/book/gasp/README.md
@@ -29,8 +29,6 @@
 
 特にボタンが重要です。tipsを確認しましょう。
 
-- https://www.youtube.com/watch?v=IqHrhcA7Rsk
-
 `/Content/Levels/DefaultLevel`を右クリックして`参照ビューア`を選択してみます。どのファイルを参照しているかわかります。
 
 ## BP
diff --git a/book/project/06_ep.md b/book/project/06_ep.md
new file mode 100644
index 0000000..e7129fe
--- /dev/null
+++ b/book/project/06_ep.md
@@ -0,0 +1,53 @@
+# 個人開発の真髄
+
+個人で開発するゲームの要所、真髄はどこにあるのだろう。
+
+その答えが見えた気がしたので、今回はそのことについて。
+
+それはアイテムボックスだと思う。
+
+といっても、普通のアイテムボックスではない。現実の個人と結びついたアイテムボックスだ。通常のゲームでは、特にソシャゲなんかはこれが普通にできている。
+
+でも、個人開発のゲームでそれをやっている人は見たことがない。そもそもアイテムボックスまで実装している人はおそらく非常に少ない。
+
+「アクションゲームならアクションゲーム。アクションができるだけ」と振り切っているものが多いように思う。
+
+それはそれで個人開発としては正しい。シンプルかつやることが明白で完成させやすいからだ。
+
+個人開発で最も重要なのはゲームを完成させること。それだけだ。個人開発において、色々なものを詰め込むべきではない。
+
+ただし、アイテムボックスはとても重要だ。ゲームをアイテムボックスそのものにしてもいいくらい重要だ。
+
+それ故、これだけはしっかりと簡易なものでもいいので実装すべきだと思う。
+
+例えば、マインクラフトの真髄もアイテムボックスにあるのではないか。アイテムボックスとアカウントシステムがマインクラフトだと思う。
+
+実は前にアイテムボックスを実装したことがある。カードボックスをそのまま表示するだけのものだったが、とても面倒だった。今はもうない。プロジェクトは何度か壊れ、作り直しているうちに、いつの間にか、アイテムボックスを再び実装する気力が消えていて、アイテムボックスの存在を忘れていた。
+
+アイテムボックスがあって、ゲームで獲得したものやsnsで獲得したものがそこにあるだけで、それはプレイヤーにとってかけがえのないものだと思う。
+
+もちろん、私自身も「アイテムボックスがあるぞ、感動だ」なんて普段全く思わない。そんなことは気にしたこともない。他のプレイヤーもそうだろう。
+
+でも、気づいていないだけで、それはとても大きいものだった。プレイヤーも、開発者さえも、普段あまり意識していない部分だと思う。
+
+だからそこ個人開発でアイテムボックスまで実装している人は少ない。そして、実装してでさえ「ほんとにこんなもんいるのかね。このゲームの真髄はアクションであり冒険だ。キャラの動きを見てほしい」とそんな事を考えてしまう。私もどちらかというとそうだった。
+
+開発者はプレイヤーが本当に望んでいるものを実装せず、いらないものばかり実装しがちで、プレイヤーも自分が本当に望んでいることに気づかない。要望に送るのはゲームを面白くする案ではなく、現ゲームへの不満になってしまう。それを解消したとしても大してゲームは変わらない。そういうものだ。
+
+だけど、本当に大切なのは、そんな難しいことではなく、もっと根本的で基本的なことに隠れているのではないのかな。そう思う。
+
+とりあえず、ゲームの方向性が見えてきた気がする。
+
+アイテムボックスだ。
+
+しかし、ただのアイテムボックスではない。アイテムボックスは確かにただのアイテムボックスなのだが...。しかし、アイテムボックスを実装することで、演出が可能になる。
+
+そして、この演出こそ、本作ゲームの真髄だ。
+
+例えば、自分が獲得したアイテムが部屋に飾られていたら、嬉しいと思う。snsで獲得したアイテムが自身が装備する剣に反映され、マテリアルとステータスが変化したら面白い。そういった部分、そういったことをアイテムボックスのシステムを作ると実装できる。
+
+そして、これは、誰がやっても同じではなく、プレイヤーの固有性、唯一性が現れなければならない。
+
+このことも難しく考えていたが、実は簡単な方法で実装できる。数字を使うのだ。例えば、どこかにいってカードを獲得したとしよう。そのカードにはランダムの数字がついている。部屋のテーブルに置かれるとき、その数字も描写される。
+
+同じカードを獲得した人は多いかもしれない。しかし、同じ数字まで獲得した人は少ないはずだ。それが一致する時、これは自分の部屋だと認識できる。こういった演出こそ、本作ゲームの真髄にしていこう。そう思った。
diff --git a/book/pwsh/05_aibot.md b/book/pwsh/05_aibot.md
new file mode 100644
index 0000000..722b3f8
--- /dev/null
+++ b/book/pwsh/05_aibot.md
@@ -0,0 +1,14 @@
+# aibot
+
+`aibot`の構成です。
+
+- https://git.syui.ai/ai/bot
+
+|title|body|
+|---|---|
+|bot|ai/bot|
+|server|archlinux|
+|os|ai/os|
+|ai|ai/ai|
+
+
diff --git a/book/pwsh/README.md b/book/pwsh/README.md
index 5007acb..db48337 100644
--- a/book/pwsh/README.md
+++ b/book/pwsh/README.md
@@ -29,6 +29,8 @@ $ winget install git.git
 |lazygit|https://github.com/jesseduffield/lazygit|jesseduffield.lazygit|
 |node|https://github.com/nodejs/node|openjs.nodejs|
 |nvm|https://github.com/nvm-sh/nvm|coreybutler.nvmforwindows|
+|python|https://github.com/python|python.python.3.12|
+|conda|https://github.com/anaconda|anaconda.miniconda3|
 
 ## その他
 
@@ -42,6 +44,7 @@ $ winget install git.git
 |unity hub|unity.unityhub|
 |godot|godot.godot|
 |obs|obsproject.obsstudio|
+|ollama|ollama.ollama|
 
 ## update