はじめに
Claude Codeで長めのタスクを回していると
作業が終わったのか、まだ止まらずに動いているのかが画面を見るまでわからない
という状態がよくあります。
他のウィンドウで別作業をしていると尚更で、結局こまめに画面を覗きに行く癖がついていました。
「それなら音で教えてもらえばいい」と思い立ち、VOICEVOXのずんだもんに喋らせる仕組みを作りました。
あわせて、画面の隅にずんだもん自身も表示されるようにしています。
作ったもの
Claude Codeにはフックという仕組みがあり
・ターンが終わったとき(Stop)
・サブエージェントが終わったとき(SubagentStop)
・CLIがこちらの入力を待っている状態が続いたとき(Notification)
にそれぞれイベントが飛んできます。
ここにPythonスクリプトを挟み、メニューバーに常駐しているデーモンへ短いテキストを送ります。
デーモンはVOICEVOX Engineに音声合成を頼み、再生と同時に、枠なしの小さなウィンドウにずんだもんと吹き出しを表示します。
表示のしかたは4パターンから選べるようにしました。
・常に画面に出しておく
・喋るときだけ出す
・姿は消して声だけ残す
・完全に無効化する
の4つです。
選んだ状態は設定ファイルに保存されるので、再起動しても引き継がれます。
通信はすべて127.0.0.1宛てで完結していて、外には出ていきません。
つまずいたところ
パイプラインを組むこと自体は半日もかかりませんでした。
時間がかかったのは
「ちゃんと動いているように聞こえる/見える」
ところで、しかもそのほとんどは、実際に音を聞くか画面をよく見るまで気づけない類のバグでした。
1回目:英単語をそのまま読ませたら崩壊した
最初はClaudeの返答テキストをそのままVOICEVOXに渡していました。
VOICEVOXは日本語専用のエンジンなので、英単語はローマ字読みのような形で強引に発音され、SubagentStopは「サバジェントストップ」のような、原形をとどめない音になっていました。
対策として、Markdown記法を外し、メッセージの最初の一文だけを対象にし(Claudeの返答は冒頭に要点をまとめる書き方をしているので)、残った英単語は自作の対応表でカタカナ読みに変換、対応表にない単語は読み上げずに削る、という形にしました。
知らない英単語は思い切って捨てる、という判断です。崩れた音を聞かせるよりましだと思っています。
2回目:数字まで消えた
上記の対策で使った「英字を除去する」正規表現が、[A-Za-z0-9]という書き方のせいで数字まで巻き込んでいました。
タスクの件数やポート番号が、読み上げから静かに消えていたわけです。
英字で始まる単語だけを対象にするよう条件を絞ったら、数字はそのまま残るようになりました。
3回目:「角」だけ発音がおかしい
「角」は単独では「かど」なのか「かく」なのか文脈がないと決めづらい漢字で、VOICEVOXの標準解析ではこちらの意図と違う方で読まれていました。
VOICEVOXにはこの手の読み矯正のための辞書登録API(/user_dict_word)があるので、正しい読みを登録しました。
ところが反映されません。原因は、デフォルトの品詞が「固有名詞」になっていたことでした。この文脈では、標準辞書側の「普通名詞」としての角のほうが優先されてしまうようです。
品詞を普通名詞に変え、優先度も上げて登録し直したらすぐに直りました。
4回目:エラーが出ないまま無音になった
検証中にVOICEVOXがいつの間にか落ちていたことがありました。
フックは正常に発火し、吹き出しも正しいテキストで表示されるのに、音だけが鳴らない。
原因を辿ると、合成に失敗した例外を握りつぶしていただけでした。
ログを出すようにした上で、合成に失敗したらVOICEVOXを再起動して復帰を待ち、もう一度だけ試すようにしました。
エンジンが落ちても、数秒の沈黙で自動的に立て直るようになっています。
5回目:ウィンドウは角に来ているのに、キャラクターは来ていない
画面右下の角(0, 0)にウィンドウを固定したのに、足元が角まで届かず、明らかな余白が残っていました。
ウィンドウの座標は何度確認しても正しく、疑うところがありません。
実際の原因は素材側で、足元より下に透明な余白がそのままキャンバスに残っていたことでした。
ウィンドウはぴったり角にあったのに、そこに描かれている絵の方が角まで届いていなかった、というオチです。
素材を実際に描かれている範囲までトリミングしてからリサイズしたら解決しました。
なお、ウィンドウ側のコードは一切触っていません。
おわりに
出来上がったのは、
・メニューバー常駐のデーモン
・4段階の表示モード
・VOICEVOXが落ちても自動で立ち直る仕組み
・少しずつ育てている英単語の対応表
・「角」という一文字のための辞書登録
の5つです。
ひとつひとつはそこまで難しい処理ではありませんでした。
難しかったのは、どの不具合も何も言わずに静かに起きることで、気づく手段が「実際に聞く」か「画面を拡大して見る」しかなかった点です。
パイプラインを組む時間より、実際に耳と目で確認する時間のほうを多めに見積もっておくといいと思います。
最後まで読んでいただきありがとうございました。


