🎤 一瞬のアイデアを逃さない「音声メモボタン」を作った話

最近、音声入力を使う機会がぐっと増えました。
執筆中や移動中、ふと浮かんだフレーズやアイデアを、すぐメモしたいと思うことが多い。
でも、Windowsの標準機能「Win + H」で音声入力すると、入力フォーカスが外れていたり、タイミングがズレると音声内容がどこにも残らず消えてしまうという問題がありました。

「一瞬のひらめきを、パッと話して、パッと残したい」
そんなシンプルな目的で、デスクトップの片隅に常駐する小さな音声メモボタンアプリを自作しました。

実際には思考の流れをそのままメモに変換してくれる頼もしい相棒になりました。

シンプルなGUIと少しのスレッド処理で、思考スピードを邪魔しない
自分専用の音声メモ環境が作れました。


■ どういうアプリか

画面の端に小さなマイクボタンが常に表示されていて、
クリックするか Shift + Z を押すだけで録音が開始されます。

録音が終わると、音声認識で日本語テキストに変換し、
自動的にクリップボードへコピー。
そのままメモアプリやチャットに貼り付けられるという流れです。

入力ボックスを選択していなくても動作するので、
「何かを話したい瞬間」にすぐ反応してくれます。


■ 開発の動機

・音声入力する機会が増えた
・アイデアは一瞬で出て、一瞬で消える
・Windowsの音声入力は入力欄がないと結果が消えてしまう

この三つが組み合わさって、「自分専用の音声キャプチャボタン」を作ろうと決めました。


■ 開発中に苦労したこと

● 空白時間で録音が止まってしまう問題

speech_recognition のGoogle APIを使うと、無音時間が続くと自動的に終了してしまう仕様があります。
「えーっと…」と考えている間に録音が切れ、途中までしか認識されないことが多発しました。
これを避けるために、PyAudioで自前で音声データを取り続けるスレッドを作り、
「自分で止めるまで録音を続ける」仕組みに変えました。

● テキストがクリップボードに入らない問題

音声認識の結果を取得しても、コピー処理がうまく働かないことがありました。
原因はスレッドの競合で、GUIスレッドと録音スレッドの処理タイミングがずれていたこと。
これを解消するため、pyperclip でのコピー処理をメインスレッドではなく
音声認識が完了したタイミングで実行するようにしました。

● GUIがフリーズする問題

録音や認識をメインスレッドで実行すると、ボタンが固まってしまう。
Tkinterではメインループが止まると操作不能になるため、
録音・音声変換はすべて別スレッドで並行処理するように設計しました。


■ 技術的な工夫ポイント

Tkinterで最小サイズの常駐ウィンドウを作成
 → overrideredirect(True)で枠を消し、-topmostで常に前面に固定

PyAudioでリアルタイム録音
 → stream.read()をループで呼び続け、音声データをフレーム単位で蓄積

SpeechRecognition + Google音声APIで高精度な日本語変換
 → 認識精度が高く、手軽に利用できるが、無音検知が強いので独自録音に置き換え

Pyperclipで結果をクリップボードにコピー
 → テキスト入力欄がなくても「話した内容をすぐ使える」

Keyboardモジュールでグローバルショートカット
 → マウスを触らずに「Shift + Z」で録音をトグル

これらを組み合わせることで、
「録音 → テキスト化 → コピー」という一連の流れを
ワンボタンで完結できる仕組みができました。


■ 使ってみた感想

・アイデアメモが爆速でできるようになった
・作業の途中で思いついたフレーズを忘れなくなった
・録音中のステータスが明確なので安心

いまでは常駐アプリとして日常的に使っています。
ほんの数行のつぶやきも、あとで見返すと大事なヒントになっていることがあります。

Don`t copy text!