Claudeサブスクを有効活用するためにWindows機で音声入力から使えるようにしてみた
はじめに
※2025/07/12:昨日だかにClaude CodeがWindowsにネイティブに対応したので、本記事のWSL経由で使う方法は古くなりました。
本記事はソリューションの提案というよりは日曜大工の事例紹介兼備忘録だと思ってください。自分のPCだから気軽にやってるだけで、正直他人に勧められるかは……な方法なので。
やったこと
5月からClaudeのMax 5x Pro(月額$100)プランを契約したは良いものの、サボった日や疲れて動けない日はUsage Limitに到達せずなんだか損している気分に。
そこで、少しでも使う機会を増やすために、テキスト入力以外のチャネルとしてClaudeへの音声入力とレスポンスの読み上げ機能を作ってみることにしました。
前々から筋トレ中とかに音声入力できればいいな~とは思っていたので、今回は機会と需要がかみ合った感じです。スマホ版も音声入力はできるものの、MCPサーバーとか使えないですしね。
実装上はAnthropic APIを叩くのが自然ですが、あくまで今回はサブスクの有効活用が目的なため、WSL上のClaude Codeに入力音声をプロンプトとして投げる方法で実装しました。正直Claude Codeの使い方としてイマイチなので、Claude Desktopと他ツールの組み合わせとかでうまくできるやり方あったら教えてください。
開発過程
2025/07/05~2025/07/06の土日にClaude Code使いつつ実装。
- 設計
- プロト
- 実装
1. 設計
自分は新しいプロジェクトを始める時、/dev(メモ系置く)/designとかのファイルを切ってClaude Codeと話しながらドキュメントを作っていきます。
特に今回のような場合は、音声入出力周りでほぼ知見の無いOSレベルの機能を使うため、最初からガンガン質問しまくります。
私「これこれこういうアプリ作りたいんだけど、どういうアーキテクチャが考えられる?」
🤖「案1、案2、案3...」
私「総合すると、こういう機能を持ったこういうコンポーネントをこんな感じに用意して組み合わせるんだね。これって今の世間的に見てスタンダードなやり方?」
🤖「実はそのやり方はレガシーで~、他にもこんなアーキテクチャがあって~、メリデリは~」
私(それぞれに対して1時間ほど深堀り)
🤖「てな感じです」
私「ありがとう、今回のユースケースではこれが良さそうだね。次に使用するライブラリだけど~」
これをしばらく行って、要件定義、基本設計、開発環境、コーディング規約、テスト仕様あたりをドキュメントに落とし込んでいきます。まあ日曜大工レベルならそんなかっちりとは書きませんが、Vibe Codingするときは意識的に時間をかけて内容を詰めるようにはしています。ガードレールをきっちり整備してあげるのが大切だと思っています。
また、余談ですが、自分の場合は「この手法はスタンダードか」といった系統の深堀りをよくします。開発上の理由というよりは、自分がまだジュニアなので王道を学びたいという理由からです。ある分野におけるスタンダードの把握は思ったより経験値が必要なので、その点割と大域最適な回答を返してくれる生成AIは自分としてはかなり助かっています。
この段階では、アーキテクチャとしては以下のようになりました。

2. プロト
ドキュメントは整備したので、いったんTODOにまとめてからClaude Codeに走ってもらいます。
ソースコードをバーッと書いてビルドまで。この段階ではソースは軽く流し読みする程度です。

起動するとシステムトレイにアプリが。

デフォではホットキーにctrl+spaceが設定されているので、試しに押すと、以下のようなメッセージが出ます。

実際に音声入力すると、しばらくたった後にclaude codeの出力が読み上げられました。
私「今日の東京の天気は?」
🤖「本日の東京の天気についてお伝えします。最高気温は摂氏35度で猛暑日になると予想されています。~」
まあちゃんと動いていそう。
とりあえずプロトの段階まで持っていくのが早くなったのはAIコーディングの良いところだと思います。動かせるものがあると説得力が違いますし、趣味的な日曜大工ではモチベの面でもグッド。
3. 実装
方向性は分かったので、次はコードを詳しく見つつ実装を洗練させていきます。
これもモチベとしては勉強が半分。やろうと思えばプロトを触りながら利用上の不具合や必要な追加機能を洗い出してTODOにし、Claude Codeに丸投げすることも可能だと思いますが、まあ面白くないので。
コードを読むといくつか修正点があったので書き足しました。
- アプリの通知がやたらうるさいのですっきりさせた
- Claude Code側に投げるプロンプトをサニタイズし、プロンプトテンプレートも用意した
- 問い合わせのタイムアウトをユーザ設定値とした
- subprocess.run()時に現れるコンソール画面を非表示にした
- その他ハードコーディングされたまずい情報を消したり要らないインポートを削除したりなど
とはいえ、基本的にはある程度の品質のものが出力されていました。この品質をこのスピードで、ケツを叩けば24時間いつでも出してくれるんですから、いい時代になったものです。
一点だけ、アプリが長時間バックグラウンドで動作している場合にホットキー入力を検出しなくなるバグがあったのですが、そちらはホットキーを扱うライブラリを変更して再実装することで解消されました(解決はしていない。keyboardがやたら古いライブラリなのもあって別にいいかという気持ち)。
- Hotkey Handler: keyboard->pynput

感想
音声入力、全然思った通りの文章が入らないのでイライラします(ちゃんと認識されるような発音を心がけても、結局それコストでは?という気分になる)。普段使いする気は起きません。あくまで手を離せない時にも気軽に使えるチャネルとして使おうと思います。
Discussion