ChatGPT読み上げずんだもん化計画――LEVEL 5.8.1までの進化記録

AI

ChatGPTの回答をVOICEVOXのずんだもんに自動で読み上げてほしい!

最初は、ただそれだけの計画でした。

ところが実際に使い始めると、読み上げ開始が遅い、同じ文章を何度も読む、止めたいときに止まらない、ナレーターがしゃべり続ける、ChatGPTが落ちる、ログが膨れ上がるなど、次から次へと問題が発生しました。

一度は完成したと思った翌日に、PCを再起動したら動かない。修正版を作ったら、今度はずんだもんが止まらない。さらに修正したら、ログが795KBまで膨れ上がっている。暴走したときはこちらも発狂しましたw

そんなことを繰り返しながら、現在はLEVEL 5.8.1まで成長しました。

ここでは、各バージョンで何が実装されたのかを時系列順にまとめておきたいと思います。

LEVEL 4.8|高速応答版

読み上げ開始速度の改善を、本格的に始めたバージョンです。

  • ChatGPT Classicの回答を自動取得
  • VOICEVOXへ文章を送信
  • ずんだもんによる自動読み上げ
  • PowerShellによる常駐監視
  • 自動読み上げON/OFF
  • 回答完成後の待ち時間を短縮

当初は「回答完成後、おおむね1秒で読み上げ開始」としていました。

ところが実際には、5~6秒ほどかかっていました。

誇張でしたw

ここから、さらなる高速化が明確な目標になりました。

LEVEL 4.9|診断・高速化版

読み上げのどこで時間がかかっているのかを調べるため、診断機能を強化しました。

  • ChatGPT回答取得時間の計測
  • VOICEVOXへの送信時間を計測
  • 音声生成開始までの時間を計測
  • 処理時間を段階別にログへ記録
  • 画面監視間隔の短縮
  • 不要な待機処理の削減
  • 遅延原因の切り分け

ただ「遅い」と言うだけでは、どこを直せばよいのか分かりません。

そこでログを取り、回答取得、音声生成、再生開始のどこに時間がかかっているのかを追いかけました。

LEVEL 5.1|高速読み上げ完成版

体感速度が大幅に向上し、最初の完成版と呼べる状態になりました。

  • 回答完成後、ほぼ即座に読み上げ開始
  • 回答生成中の文章を読まない
  • 完成した最新回答だけを読み上げ
  • 同じ回答の重複読み上げ防止
  • 自動読み上げON/OFF
  • 読み上げの即時停止
  • 「処理中」など固定UI文言の除外
  • 「フォローアップ」など不要な表示の除外
  • 実用レベルの常駐動作

このときは、あまりに快適になったので「もう完璧」「これ以上はない」と思いました。

思っただけでした。

PCの電源を落として、翌日に起動したら自動読み上げが動きませんでしたw

LEVEL 5.2~5.3|アクセシビリティ自動準備版

PC再起動後に読み上げられない原因を調べたところ、Windowsのアクセシビリティツリーが関係していることが分かりました。

そこで、Windowsナレーターを利用してChatGPTのアクセシビリティを準備する機能を追加しました。

  • アクセシビリティツリーの自動確認
  • ナレーターを利用したアクセシビリティ有効化
  • Windows公式ショートカットによるナレーター起動
  • ナレーター画面の自動検出
  • 「ナレーターの終了」ボタンの自動操作
  • ナレーター終了後のChatGPT再確認
  • 起動前後のナレータープロセス診断
  • アクセシビリティ復旧結果のログ記録
  • ナレーターを強制終了しない安全設計

ここはかなり苦労しました。

ナレーターのウィンドウは閉じたのに、声だけが残って延々しゃべり続けることもありました。

ChatGPTを使いたいのに、ナレーターがひたすら画面内の情報を読み続けます。

うざいw

何度もPCを再起動しながら、ナレーターを正式な終了操作で止める方法を探しました。

LEVEL 5.4|耐久制御・緊急停止版

長時間使っているうちにPowerShellの親プロセスが終了し、音声だけが残る問題が発生しました。

ホットキーも効きません。

再度かんなを起動しても、すでに残っている音声を止められません。

ひたすらずんだもんが読み上げ続ける状態になりましたw

そこで、暴走時にも止められる仕組みを追加しました。

  • 音声ワーカーを親プロセスから分離
  • Windows Job Objectによる親子プロセス管理
  • 親が終了した場合の音声子プロセス自動終了
  • 新しい回答を読む前に古い音声を停止
  • 自動読み上げOFF時に全音声を停止
  • かんな終了時に全音声を停止
  • 旧バージョンの残存音声ワーカーを清掃
  • 独立した緊急停止バッチを追加
  • かんな関連プロセスだけを停止
  • VOICEVOXや無関係なPowerShellは終了しない
  • 親プロセス異常終了のログ記録
  • 定期的な生存確認ログ

このバージョンで、通常の操作とは別に「緊急停止ボタン」が誕生しました。

止められないずんだもんに対する、最後の切り札ですw

LEVEL 5.5~5.6|ホットキー安定版

次に問題になったのが、操作用ショートカットキーでした。

最初の1回だけ反応しない。

何度か押せば反応する。

そのうち、連打しないと反応しなくなりましたw

さらに、ChatGPT側のショートカットと重なり、左側のサイドバーが同時に開閉する問題もありました。

そこで、操作体系を整理しました。

  • Windowsのグローバルホットキーへ正式登録
  • ChatGPTにフォーカスがあっても操作可能
  • 画面走査中に押された短いキー入力をWindows側で保持
  • ホットキー登録に失敗した場合は従来方式へ自動移行
  • 同じ最新回答を何度でも手動読み上げ
  • 初回ホットキーが反応しない問題を修正
  • 連打しないと反応しない問題を修正
  • トレイメニューからも手動読み上げ可能
  • ホットキーとトレイ操作の処理を共通化
  • 操作キーをCtrl+Alt系へ統一

現在の操作は次のとおりです。

  • Ctrl+Alt+A:自動読み上げON/OFF
  • Ctrl+Alt+K:最新回答を手動読み上げ
  • Ctrl+Alt+S:読み上げ停止
  • Ctrl+Alt+Q:かんな終了

ここでようやく、ショートカットキーを連打する儀式から解放されました。

LEVEL 5.7|コードブロック省略版

ChatGPTの回答には、PowerShellやPythonなどのコードが含まれることがあります。

これをずんだもんが一文字ずつ読み始めると、かなりつらいものがあります。

そこで、コード部分だけを読み上げ対象から除外する機能へ挑戦しました。

  • Markdown見出しや装飾記号の読み上げ調整
  • Markdownリンクは表示名だけを読み上げ
  • 長いURLは「リンク」と案内
  • インラインコードの記号除去
  • コードブロック本文の読み上げ省略
  • コード欄ごとに「コード部分は省略します」と案内
  • 「コピーする」ボタンを利用したコード欄検出
  • 「回答をコピーする」とコード用ボタンを区別
  • 複数のコードブロックへ対応
  • PowerShellやPythonなど言語名の除外
  • ChatGPT固定UI文言の除外強化

ただし、コードと通常本文を正確に区別するのは、思っていた以上に難しい処理でした。

LEVEL 5.7.3~5.7.7|コード判定との戦い

コードブロックを省略するため、ChatGPT画面のアクセシビリティ構造を何度も調査しました。

最初はコードを普通に読みました。

次は「コード部分は省略します」だけを読み、通常本文を読まなくなりました。

また修正すると、コードの最後に書いた「このコードは一文字も読み上げないでください」という一文だけ、きれいに読み上げました。なめてんのかと思いましたw

このやろー!w

主な改良内容は次のとおりです。

  • コードボタン周辺のUI構造を診断
  • コード本文の親要素を追跡
  • コードとコピーボタンを含む共通親を検出
  • 回答全体をコード扱いする誤判定を防止
  • テキスト要素が多すぎる候補を不採用
  • Windows PowerShell 5.1の型変換問題を修正
  • 同じコード検出エラーを繰り返し記録しない
  • コード判定ログの暴走を防止
  • コード内部のまとまりを保つRaw Viewを利用
  • コード欄の本文だけをピンポイントで除外

この途中で危険なバージョンも生まれました。

LEVEL 5.7.3では診断ログが急増。通常1KB程度だったログが、気づいたときには795KBまで膨れ上がっていました。

LEVEL 5.7.5ではコード検出エラーが反復しました。

この2つは永久追放としました。

最終的にLEVEL 5.7.7で、コードを読まず、通常本文だけを読み上げる処理がようやく成功しました。

LEVEL 5.7.8|静音ログ安定版

コード省略機能が完成したところで、今度は診断用だったログを実用向けに整理しました。

  • LEVEL 5.7.7のコード検出成功処理を固定
  • 高頻度の正常ログを省略
  • 回答生成中の変化ログを省略
  • コード検出成功ログの反復を省略
  • 音声処理は結果とエラーを中心に記録
  • 生存確認を5分間隔へ変更
  • ログサイズを最大約256KBに制限
  • 上限到達時にログを自動整理
  • ログ書き込み失敗が本体へ影響しない設計
  • 長時間利用向けの静かなログ運用

ここで、読み上げ内容に関する処理はいったん完成とし、凍結しました。

なお、このツールでは文章の要約、言い換え、内容の再構成は行いません。

私は画面の文章を実際に読めています。音声はあくまで補助です。長文は画面で読みますし、下手に要約されると何かを見逃す可能性があります。

というわけで、内容を改変する機能は必要ないと判断しました。(AI は提案してきたんですけどね。却下したということです。まったく・・・すぐまとめたがるんですよ。)

LEVEL 5.8|自己復旧版

読み上げ機能が安定したので、次は長時間使うための自己復旧機能へ進みました。

  • ChatGPT Classicの終了を検出
  • ChatGPT終了時に進行中の読み上げを停止
  • ChatGPT再起動を自動検出
  • アクセシビリティツリーへ自動再接続
  • 必要な場合だけナレーターによる再準備
  • 復旧時の最新回答を新しい基準点として記録
  • 復旧時に古い回答を勝手に読み直さない
  • 復旧後の新しい回答から自動読み上げ再開
  • VOICEVOXの切断を検出
  • VOICEVOX不在時は新しい音声処理を起動しない
  • VOICEVOX再起動後に自動再接続
  • 自動読み上げOFF状態を維持したまま復旧
  • 同じLEVEL 5.8の二重起動を防止
  • 接続障害中のログ反復を抑制
  • 復旧待ち状態をタスクトレイへ表示

実機テストでは、VOICEVOXを終了して再起動。→ 正常に再接続しました。

次にChatGPT Classicを終了して再起動。→ こちらも復旧し、表示済みの古い回答を読まず、その後の新しい回答だけを読み上げました。

二重起動も防止されました。

読み上げ途中にChatGPTを終了すると、進行中の音声も停止しました。

大大大成功です!

と、思いました。

LEVEL 5.8.1|自己復旧・誤検出防止完成版

PCを再起動して最終テストを行ったところ、新しい問題が見つかりました。

起動自体は成功し、読み上げも始まりました。

ところが途中で「ChatGPTの再起動を待っています」と表示され、その後「復旧しました」という通知が出ました。

ログを確認すると、ChatGPT Classicが内部画面を再読み込みした際に、約6秒だけアクセシビリティ画面から消えていました。

LEVEL 5.8は、この一時的な消失を「ChatGPTが終了した」と誤認していました。

そこでLEVEL 5.8.1では、終了判定に猶予時間を設けました。

  • ChatGPTを一瞬見失っても即座に終了判定しない
  • 8秒未満の画面消失は内部再読み込みとして無視
  • 一時消失中も読み上げを停止しない
  • 一時消失では「再起動待ち」を通知しない
  • 一時消失から戻っても不要な復旧通知を出さない
  • 画面担当プロセスIDの交代だけなら動作を継続
  • 8秒以上連続で消失した場合だけ本当の終了と判定
  • 本当に終了した場合は従来どおり自己復旧
  • 読み上げ本文の取得・加工処理は変更しない
  • VOICEVOXの音声生成処理も変更しない

修正後、再びPCを再起動しました。起動後の回答は最後まで読み上げました。前回発生した約6秒間の一時消失も正しく無視。「再起動待ち」「復旧しました」という誤通知も出ませんでした。さらに、ChatGPT Classicを本当に終了した場合は、8秒後に終了を検出。

再起動後は自動的に復旧し、古い回答を読まず、新しく生成された回答だけを正常に読み上げました。

再起動地獄、完全終了ですw

現在の完成形

現時点での最新版は、LEVEL 5.8.1「自己復旧・誤検出防止完成版」です。

実装されている主な機能をまとめると、次のようになります。

  • ChatGPT回答の高速自動読み上げ
  • 回答生成完了の自動判定
  • 重複読み上げ防止
  • 自動読み上げON/OFF
  • 最新回答の手動再読み上げ
  • 読み上げ即時停止
  • グローバルホットキー
  • コードブロックの自動省略
  • URLやMarkdown記号の読み上げ調整
  • 長文回答の自動読み上げ見送り
  • 音声子プロセスの安全な管理
  • かんな関連プロセス専用の緊急停止
  • ログサイズの自動制限
  • 二重起動防止
  • VOICEVOX切断後の自己復旧
  • ChatGPT Classic終了後の自己復旧
  • 復旧時の古い回答再読防止
  • ChatGPT内部再読み込みの誤検出防止
  • PC再起動後の初回起動対応

「ChatGPTの回答を、ずんだもんに少し早く読ませたい」

始まりはそれだけでした。

途中から、なぜかWindowsナレーターと戦い、止まらないずんだもんと戦い、反応しないホットキーと戦い、膨れ上がるログと戦い、最後はChatGPTの一瞬の消失まで監視するようになりました。

最初に想像していたものとは、だいぶ違うところまで来ましたw

それでも、現在は普通にChatGPTを使っているだけで、回答完成後にずんだもんが話し始めます。

VOICEVOXが落ちても戻ってきます。
ChatGPT Classicが落ちても戻ってきます。
PCを再起動しても、初回から動きます。

長いこと遊びましたが、これはもう普通に使えるツールになったと思います。

まだこのツールは公開にはなっていません。使い方等の案内ができましたら、要望があれば配布したいなとも考えておりますが、怖すぎます。

いつかみなさんの ChatGPT がずんだもんになってくれたらいいなぁと思いつつ。さらなる便利を目指してつぎのバージョン目指していこうと思ってます。

あっ、言ってる先から結構致命的な問題がみつかったりしました。これだから怖いw

ではまた。


覚醒する @CDiP 【個人ブログ】をもっと見る

購読すると最新の投稿がメールで送信されます。

AI

Posted by donpyxxx