ずんだもんは、見張らない(ChatGPTxずんだもん化ツール完成)

ようやく ChatGPT ずんだもん化計画の開発が終焉を迎えようとしています。いやー、長かった。
開発なんてえらそうなことを言えるような仕事はまったくしてなくて、 ChatGPT がこうしましょうと言われたらOKと答えていただけなんですけども。
ただ、VerUPについては AI とも相談しながらだったので「開発の方向性」というのは共有しながら進めることができたのは非常によい経験をしたと思ってます。
いまできあがっている読み上げツールはバッチ処理など、ツールと言ってもものすごく原始的なものなので、ここから Windows アプリ化をしてみたいなと(勉強として)思っています。
では、最終的にどんなツールになったのかを物語風に語ってみようと思います。
ChatGPT読み上げ開発記――LEVEL 5.x、最後の反転
その計画は、ひどく単純な願いから始まった。
ChatGPTの返答を、ずんだもんの声で聞きたい。
画面に文字が現れる。少し遅れて、あの声が部屋に流れる。ただそれだけでよかった。文章を目で追わなくても、別の作業をしながら返答を受け取れる。AIとの会話が、画面の中だけに閉じ込められず、こちら側の空気へ出てくる。
一度それを味わうと、もう無音のChatGPTには戻れなかった。
だが、声を与えるには、目が必要だった。
返答が始まったことを見つける目。文章が伸びている途中なのか、完成したのかを見分ける目。チャットを切り替えたとき、そこに表示された過去の回答を「新しい返答だ」と勘違いしない目。
私たちは、その目を作り始めた。
見張る者
LEVEL 5.1は速かった。
ChatGPTの回答を見つけ、VOICEVOXへ渡し、ずんだもんがしゃべる。計画は成功したように見えた。目標だった「返答を自動で読む」は、たしかに実現した。
しかし、目は見すぎた。
チャットを切り替えると、過去の回答を突然読み始める。回答の途中を完成品だと思い込む。画面構造が一瞬変わると、見失った対象を探して何度も走査する。やがてChatGPTは重くなり、キー入力さえ指にまとわりつくようになった。
LEVEL 5.4では暴走した。
止めるための緊急停止が必要になった。声を与えるために作ったものが、今度は会話そのものを邪魔し始めた。
それでも、原因は一つずつ潰せると思っていた。
二重起動を防いだ。長文を見送った。画面操作中の走査を抑えた。UI Automationが失敗したときは、未読の権限を捨てて安全側へ倒した。新しいChatGPTアプリが現れると、Classicだけを見分けるようにした。チャット切替には保護時間を設け、入力と送信を区別し、メモリを測り、ログを静かにした。
LEVEL 5.8、5.9.18、5.9.19、5.9.20。
番号が進むたび、監視は賢くなった。
そして同時に、監視するための仕組みは複雑になっていった。
共犯者たち
ある日は、返答を読み始めるまで異様に時間がかかった。
ある日は、ファイルをアップロードすると失敗した。
ある日は、長時間放置したあとにチャットを切り替えると、そこにあった回答を突然読み始めた。
ある日は、ずんだもんのバッチを止めただけで、ChatGPTが嘘のように軽くなった。
ログには、いくつもの容疑者が並んだ。
遅い全文走査。消える回答マーカー。増え続けるメモリ。切替直後のEnter。ファイル添付中に変化する画面構造。背後で動く新しいChatGPTアプリ。Pet。VOICEVOX。Windowsアプリのストリーミング。
誰もが少しずつ怪しく、誰も決定的な主犯には見えなかった。
だから防御を重ねた。
待機中は軽い目印だけを見る。重いチャットでは走査間隔を延ばす。送信を確認してから回答を待つ。切替中の権限は持ち越さない。空のチャットも正しい基準として登録する。
LEVEL 5.9.25は、かなり軽くなった。
それでも、ときどき誤読した。
LEVEL 5.9.26では、ついに普通のEnterさえ信用しないことにした。読み上げたい質問は、専用のキーで送る。さらに、自動読み上げをOFFにすれば、画面確認そのものを完全に止められるようにした。
それは安全装置として作った機能だった。
まだ誰も、それが物語の結末だとは知らなかった。
完全休止
5.9.26を動かしたまま、ChatGPTはまた重くなった。
キー入力が遅い。画面がついてこない。ずんだもんは何もしゃべっていない。それなのに、ChatGPTだけが重い。
ログを開くと、待機中の監視は生きていた。
五秒ごと。
回答が来ていない時間も、チャットを操作していない時間も、裏にあるClassicを五秒ごとに確認していた。一回はわずか二百五十ミリ秒ほどだった。だが、それは一日中、終わることなく繰り返される。UI Automationが確保したものは少しずつ残り、メモリも静かに増えていた。
そこで、Ctrl+Alt+Aを押した。
完全休止。
画面走査も、目印確認も、復旧確認も止まった。
次の瞬間、ChatGPTは軽くなった。
あまりにも明快だった。
犯人は、遅い走査ではなかった。
チャット切替でも、ファイル添付でも、Petでもなかった。
犯人は、私たちが当然だと思い続けていた「常時監視」そのものだった。
反転
ここで、すべての前提がひっくり返った。
私たちはずっと、回答を見逃さない方法を考えていた。
どうすれば軽く見張れるか。
どうすれば安全に見張れるか。
どうすれば長時間、壊れずに見張り続けられるか。
だが、そもそも質問を送ったのは誰なのか。
私だ。
質問が送られた瞬間を、私は知っている。なぜなら、自分の指で送信しているからだ。
ならば、ずんだもんが一日中ChatGPTを見張る必要はない。
質問を送る瞬間にだけ起こせばいい。
送信前の回答を一度だけ基準として覚える。質問を送る。新しい回答が完成するまでの短い時間だけ目を開ける。読み上げを始めたら、また目を閉じる。
LEVEL 5.9.27。
呼出待機オンデマンド版。
平常時の監視は、ゼロになった。
Ctrl+Alt+Enterを押した瞬間だけ起きる。現在の回答を確認し、質問を送り、その返答だけを待つ。読み上げが始まれば、監視を自ら終了する。
起床。確認。送信。待機。発声。休眠。
複雑になり続けたシステムは、最後に「見張らない」という一つの判断へ収束した。
目を閉じた完成形
開発というものは、機能を増やす作業だと思っていた。
もっと速く。もっと正確に。もっと多くの状況へ対応できるように。
だが、本当に必要な改善は、ときどき逆の姿で現れる。
最適化するのではなく、処理そのものを消す。
賢く見張るのではなく、見張る必要のある時間をなくす。
問題を倒すのではなく、問題が生まれる戦場から撤退する。
LEVEL 5.xで私たちが作っていたのは、ずんだもんの声ではなかったのかもしれない。
いつ見るべきかを知り、それ以外の時間は見ないという節度だった。
高性能な眼球を作り続けた物語の最後に、たどり着いた答え。
それは、あまりにも静かだった。
ずんだもんは、見張らない。
呼ばれるまで、目を閉じている。
そして私がキーを押したときだけ、何事もなかったように起き上がり、ChatGPTの返答をこちら側の世界へ連れてくる。
その声が止むと、また眠る。
今度こそ、ChatGPTは軽いままだ。
長かったLEVEL 5.xの最後に残ったのは、新しい機能ではなかった。
何もしない時間だった。








