「ChatGPTで音声入力できる」という勘違いから、自作ツールに行き着いた話

AI活用法

※さらに調べたら(2026/06/24)、やっぱりChatGPTで音声入力できるみたいですが、せっかくアプリ作ったので不満が出るまで自作の音声入力アプリを使うことにします。

前に「音声入力ジプシーが、結局ChatGPTに出戻る?」という記事を書きました。あれ、半分くらい勘違いやったんです。お恥ずかしい話なんですけど、せっかくなので顛末ごと供養しときます。

結論からいうと、勘違いをこじらせた結果、Mac専用の音声入力ツールを自分で作ってしまいました。完全ローカルで動いて、利用料はゼロ。名前は「VoiceTypist」。今日はその開発記です。

「ChatGPTって、PCでも音声入力で使えるやろ」という思い込み

ことの始まりは、わりとしょうもない思い込みでした。「OpenAIのChatGPTって、キーボードのショートカット一発でPC全体の音声入力として使えるんやなかったっけ?」と。

僕のイメージでは、 Mac のあらゆる場所、メモ帳やったり、LINEやったり、その他検索など、どこででも使えるっていうイメージだったんですが、実際よく調べてみたら、チャットGPT内でしか使えないと。違うとよ、これじゃない。盛大な勘違い。

普通はここで「あ、無理なんや」と諦めます。私は諦めが悪い。「ないなら、自分で作ってしまえばよいいやん」。これがスタート地点でした。

できあがった相棒「VoiceTypist」の挙動

先に完成形を見せます。動きはシンプルで、わりと強力です。

  1. 起動:どのアプリを開いてても、Control キーを「3連打」するだけ。(この3連打は鬱陶しいので、将来的には別のキーを2回連打で反応させようかなと思っている。今は他のキーアサインと共合しないようにctrlを3連打にしています。)
  2. 録音:「ピーン」と開始音が鳴って、外部マイクから自動で録音開始。
  3. 終了:喋り終わったら、もう一度 Control を3連打(「ポッ」と終了音)。
  4. 文字起こし:ローカルで動く OpenAI Whisper が、Macのチップの力(MPS)を使ってテキスト化。
  5. 入力:起こした文章が、いまカーソルがある入力欄に自動でペーストされる。

全部ローカルで完結するので、API利用料は永年タダ。喋った内容が外のサーバーに送られることもないけん、プライバシー的にも安心、と。理屈の上では完璧な相棒です。そしてローカルで動いているので、レスポンスが結構早い。

中身は Python × Whisper × ffmpeg

仕組みを支えているのは、わりと枯れた技術の寄せ集めです。難しい話っぽく聞こえるかもしれませんが、要は「監視して、録って、起こして、貼る」の4工程をそれぞれ別の道具にやらせとるだけです。

  • キーの監視:Pythonの pynput で、Control キーの連打をOS全体で見張る。
  • 録音ffmpeg をバックグラウンドで回して、マイクの音を一時ファイル(WAV)に保存。
  • 文字起こしopenai-whisper。Appleシリコン(M1/M2/M3)のMPSで、ローカル処理。
  • 貼り付け:クリップボード(pbcopy)とキー操作のシミュレートで、どんなエディタにも瞬間ペースト。

Whisperというのは、OpenAIが公開している音声認識モデルです。クラウドのAPIを叩くんやなくて、モデル本体を自分のMacにダウンロードして手元で動かせる。だから通信もいらんし、課金もされん。なんともありがたい話です。

ちなみに, ffmpeg でノイズ除去や音の粒を揃えるという処理をしています。それをwhisperの一番軽いやつで文字起こしをしています。ここまでやれば、whisperの一番軽いやつでも結構使えます。もっと精度を上げたければ、上位モデルを使うのもありです。そしたら誤変換ストレスも減ると思います。

今回はベータ版ということもあり、軽量版でお茶濁す感じ。

ここまでは、正直すんなりでした。コードはわりとサクッと書けた。問題は、このあとに待っとったわけです。

最大の敵は、macOSのセキュリティ(TCC)でした

常時動かしときたいので、バックグラウンドの常駐プロセス(launchd でデーモン化)として仕込もうとした。その瞬間、「起動音は鳴るのに、文字が一切入らん」という壁にぶち当たりました。

犯人は、macOSのプライバシー保護機能 「TCC(Transparency, Consent, and Control)」。ユーザーの知らんところでマイクやキー入力を盗み見されんように、バックグラウンドのプロセスからのデバイスアクセスを、めちゃくちゃ厳しく制限しているんです。Appleの言い分はド正論。正論なんやけど、こっちは困る。

さらに状況をこじらせたのが「親プロセスの消失」でした。最初はAppleScriptでアプリ(.app)にして、そこからPythonをバックグラウンド実行(&付き)で起動した。そしたら起動した瞬間に、親であるアプリ自体が終了してしまう。

親を失ったPythonは、システム直下(launchd)の所属になる。するとOSから「誰やお前。お前とか知らんし。」と判断されて、マイク権限を剥奪される。システム設定でいくら許可を出しても、起動音が鳴るだけで黙り込む——あの無限ループの正体は、この「孤立化」だったんです。気づくまで、まあまあ消耗しました。

解決策は「ターミナルに化ける」でした

この権限の壁を、正面から殴っても勝てん。そこで選んだのが「ターミナル(Terminal.app)の隠し起動」という、ちょっとずるい手です。

macOSでは、標準の「ターミナル」アプリは、たいていすでにアクセシビリティやマイクの権限をもらえています。普段から使われている、信用済みのアプリやけんですね。なら、その信用に乗っからせてもらおう、と。

ログイン時に自動で走るシェルスクリプト(VoiceTypist.command)を用意して、中身はざっくりこんな感じ。

#!/bin/bash
# 1. 起動したターミナルの窓を、瞬時に「非表示」にする
osascript -e 'tell application "System Events" to set visible of process "Terminal" to false'
# 2. ターミナルのプロセス配下で音声入力デーモンを実行
/Users/your_username/voice_memo_env/bin/python /Users/your_username/voice_typist.py

これの何がよかったかというと、3つあります。

  • 権限エラーを丸ごと回避:スクリプトが Terminal.app のセッション内で動くけん、TCCにブロックされん。マイクもキー監視も100%機能する。
  • ほぼステルス:起動時に一瞬だけターミナルが開くけど、コンマ数秒で窓が消える。デスクトップの作業の邪魔をせん。
  • 二重起動の防止:ファイルロック(lockf)を仕込んだので、間違って何度も立ち上げてMacが重くなる、みたいな事故も防げる。

あとはこれを「システム設定 > 一般 > ログイン項目」に登録するだけ。Macを起動した瞬間から、いつでも Control 3連打で音声入力が使える環境ができあがりました。

作ってみて、結局なにが残ったか

「OpenAIの音声入力ってPCでどうやるんやろ?」という、しょうもない疑問と勘違いから始まった話です。それが、気づいたら有料の音声入力サービスをまるごとリストラできるレベルの相棒に化けました。人生、何が転んで何になるか、ほんとわからんとですね。

使ってみて感じとるのは、このあたり。ローカルでWhisperを回しとるけん、どれだけ喋ってもタダ。反応速度も、Mシリーズのチップなら実用上ぜんぜん十分に速い。それと「えーっと」「あのー」みたいなフィラーを自動で消す処理も自分で書いて足したので、喋ったわりにそこそこ綺麗な文章が出てくる。

もちろん、ここまでやる必要があったかと言われると、微妙です。素直に有料サービスを使えば、TCCと格闘した半日は丸ごと浮いとった。それは認めます。でも、自分の手で「これじゃない」を「これでいい」に変えられたのは、思った以上に気分がいいんですよ。道具に合わせるんやなくて、道具をこっちに合わせる。たまにはこういう不経済も、悪くない。

「PCの音声入力を、もっと手軽に、しかもローカルでやりたい」という人は、PythonとWhisper、それから少しのmacOSハックで、自分だけの入力環境を作ってみるのもアリやと思います。勘違いから始めても、案外ちゃんと着地できるもんです。

タイトルとURLをコピーしました