このプロジェクトについて

## プロジェクト概要 AirPods Voice 入力法はネイティブ macOS メニューバー App で、AirPods のシングルタップ ジェスチャーで音声入力を制御します。1 回タップすると録音を開始し、もう一度タップすると停止して文字を確定し自動送信します。一連の操作でキーボードに触れる必要はありません。現在の正式バージョンは 1.0 です。 ## 主な機能 - AirPods を 1 回タップで音声入力を開始し、再度タップで停止して自動送信します。 - 連続した複数ラウンドの使用に対応し、各ラウンド終了後は再起動可能なアイドル状態に戻ります。 - 内蔵マイクと AirPods マイクの両方に対応し、App 設定の変更は不要です。 - デフォルトでは `Fn` の長押しをシミュレートし、Control、Option、Command、Shift または F1〜F12 にも設定できます。 - メニューバーとコントロール ウィンドウで、実行状態、開始、停止、使用説明、終了を提供します。 - App を開くたびにコントロール ウィンドウを表示し、閉じた後もメニューバーで動作を継続します。 - 物理キーボード入力があると、未終了の音声キーを自動的に中止し、修飾キーがターミナルや ToDo ソフトに影響するのを防ぎます。 - Dock を占有せず、BetterTouchTool などのサードパーティ自動化ソフトにも依存しません。 - Apple Silicon と Intel Mac に対応し、最低要件は macOS 13 です。 ## 使用前提 自身の音声入力法で、音声入力ショートカットを「Fn 長押し」に設定する必要があります。README では、1.0 は豆包入力法で実機 AirPods の複数ラウンド検収を完了したと説明されています。他の入力法は「ショートカットを押している間録音し、離すと終了する」動作に対応している必要があります。 App の実行中は AirPods の再生/一時停止のシングルタップを引き継ぐため、その間はシングルタップで音楽を制御できません。App を停止または終了すると、メディア制御は復元されます。 ## インストールと権限 GitHub Releases から PKG インストール パッケージをダウンロードし、`/Applications/AirPods Voice 输入法.app` にインストールします。インストーラーは古いテスト版を自動的に停止および削除し、2 つのバージョンが同時に AirPods を引き継ぐのを防ぎます。現在のインストール パッケージは ad-hoc 署名を使用しているため、macOS にブロックされた場合は Finder で右クリックして「開く」を選択できます。 App は音声キーの長押しをシミュレートして Enter を送信するために、macOS の「アクセシビリティ」権限を必ず取得する必要があります。認可対象は App 自体であり、ターミナルや開発ツールに認可を与える必要はなく、完全ディスク アクセスも不要です。App 自体はマイクを収集せず、マイク権限はユーザーが選択した音声入力法によって管理されます。 ## 動作原理(README の説明) App は `MPRemoteCommandCenter` を通じて Now Playing セッションを保持し AirPods のシングルタップを受信します。ソースが `com.apple.bluetoothd` または `com.apple.cloudpaird` のメディア イベントのみを受け付け、キーボードの再生キーなど他のソースでは音声を開始しません。AirPods マイクが通話オーディオ モードに入ると、2 回目のタップは `bluetoothd` によって Software Mute として報告され、App は自身が開始した音声セッション内でのみ、これを停止および送信の信号として扱います。IOHID 監視は予備チャネルとして機能し、同一の物理操作は 350ms のウィンドウで重複排除されます。 1 回目のタップでは `IOHIDPostEvent` を通じて Fn を 1 回送信してアクティブ化します。2 回目のタップでは録音セッションを終了し、続けて Enter を 2 回送信します。1 回目は入力法の変換文字列を確定し、2 回目はメッセージを送信します。 グローバル修飾キーがショートカットに敏感なアプリに影響するのを避けるため、1.0 では 3 層の保護を追加しました。起動時に過去の残留 Fn をクリアし、音声中に物理キーボード入力を検出すると先に音声修飾キーを除去して直ちに音声を終了し、App が異常終了した場合は独立したデーモン プロセスが Fn を解放します。正常な停止、フォアグラウンド アプリの切り替え、5 分の安全タイムアウト、または App 終了時にはキーのみを解放し、誤送信は行いません。 ## 設定とログ デフォルトの設定ファイルは `config/voice-key` で、内容は `fn` です。control、option、command、shift または f1〜f12 に変更でき、変更後はスクリプトを再起動する必要があります。ソース実行時には環境変数で一時的に指定することもできます。 ログは `/tmp/airpods-voice-input-method/` 配下の app.log、app.stdout.log、app.stderr.log にあり、`pgrep -fl airpods-voice-input-method` でプロセスを確認し、`./scripts/stop.sh` で安全に停止して音声キーを解放できます。 ## ビルドとテスト `scripts/build.sh` でユニバーサル App をビルドし、`scripts/package-release.sh` で PKG を生成できます。Developer ID 証明書の指定にも対応しています。テスト スクリプトは 4 ラウンドの音声対話、Fn 消費、キーボード安全、クラッシュ復旧などの回帰シナリオをカバーし、別途 `tests/hitl-two-cycle.sh` が実機 AirPods の手動検収に使用されます。 ## ライセンス ソース コードは PolyForm Noncommercial 1.0.0 ライセンスを使用し、OSI 定義のオープン ソース ライセンスではなく source-available に該当します。個人の学習、研究、非商業利用は許可され、商業利用には別途許諾の取得が必要です。