自作音声入力アプリを半年ぶりにメンテしたら、いろいろ壊れてた話
Claude Codeが普及してから 「SaaSの死 →自前アプリ」みたいな話をよく聞くようになった。
ある程度使いこなせる人なら、必要なものを自分で作れてしまう世界になった。 自分も去年、そのテンションに乗っかって音声入力アプリをバイブコーディングで作った。Google Speech APIとPythonを使って、Pauseキーで録音して、しゃべった内容をそのままカーソル位置に流し込む、というやつだ。
作ったらちゃんと動いた。実用的だった。
そのまま使ったり使わなかったりしながら半年が過ぎて、今日「そろそろメンテするか」と向き合った。
思ったより壊れてた
使っていて気になっていたことを洗い出すと、こんな感じだった。
- スリープ復帰後にアプリが死んでいて、空振りしてから気づく
- 録音中をビープ音で知らせる設計にしたが、スピーカーを常時オフにしているので使えない
- タスクバーのアイコンが色変わりする設計だが、タスクバーを自動非表示にしているので見えない
- テキスト変換後、カーソル位置に入力されるはずが……空白一文字だけが出てくる
最後のやつが致命的だった。
デバッグ:原因はIMEだった
ログを仕込んで調べると、音声認識自体は正常に動いていた。
Text typed: '音声入力 開始。'
ちゃんと認識している。でも画面には空白一文字。
原因は入力方式にあった。SendInput(WindowsのAPI)でUnicodeを直接送ると、日本語IMEが横からインターセプトして変換処理に突っ込んでしまう。結果として空白が出てくる。
解決策はシンプルだった。クリップボードに文字列を入れてからCtrl+Vで貼り付ける。IMEを完全にスキップできる。pyperclip.copy() と pyautogui.hotkey('ctrl', 'v') の2行で済んだ。体感のレスポンスも上がった。
追加:フローティングオーバーレイ
音もタスクバーも使えない中で「録音中かどうか」をどう知るか、という問題は、画面右上に小さいドットを常駐させることで解決した。
- 待機中:グレーの小さいドット(ほぼ見えない)
- 録音中:赤
- API処理中:黄
- テキスト入力中:緑
実際使ってみると「録音できてるかな?」という不安が消えて、心理的にかなり安定する。地味に大きい改善だった。
ついでに:リポジトリ整理とCLaunch
コードは別リポジトリの奥深くに混在していたので、asi という新しいリポジトリに切り出してゴミファイルを断捨離しながら移行した。
あわせて、20年ぶりに CLaunch を導入した。
当時、職場の先輩たちがマウスのホイールでCLaunchを召喚しながら作業していた。真似して自分も使っていた。設定画面を開いたら、UIが20年前から一切変わっていなくてちょっと泣きそうになった。
今はF1キーで呼び出して、音声入力アプリをそこから起動している。スタートアップにも登録したので、PC起動後は放置で両方立ち上がる。
自作の道具は壊れるが、壊れた場所がわかる
半年に一回のメンテというペースは、自作ツールとしてわりと合理的だと思っている。
今回は「全部壊れてた」わけではなく、「核心(音声認識)は動いてたけど出口(テキスト入力)が詰まってた」という状態だった。配管を通したら普通に動くようになった。
自作の道具は壊れる。でも、壊れた場所がわかる。それが既製品との違いだし、自分で作る理由のひとつだと思っている。

20年前と変わらずある、、懐古厨にはたまらない(泣)

忘備録的に。HHKBの設定をのせておく。
Anywhere Speech Input: Google Speech API + Python + PyInstaller