Skip to content

Instantly share code, notes, and snippets.

@grapswiz
Created July 2, 2025 08:15
Show Gist options
  • Save grapswiz/0b82911470bebdfbbfde8b7e2c87f239 to your computer and use it in GitHub Desktop.
Save grapswiz/0b82911470bebdfbbfde8b7e2c87f239 to your computer and use it in GitHub Desktop.
音声入力時に他のマイク入力をミュート

1. 構成イメージ

状態 システム既定入力 Aqua Voice Discord等
通常 物理マイク 物理マイク 物理マイク
Fnキー長押し中 (録音) SilentMic(無音 Loopback デバイス) 物理マイク 無音

2. 事前セットアップ

2-1 Loopback で「SilentMic」を作成

Loopback ▸ New Virtual Device

Sources を空のままにする → 完全な無音入力デバイスになる

名前を SilentMic に変更(任意)

2-2 アプリの入力デバイス設定

アプリ Input device
Aqua Voice 物理マイクを直接指定
Discord Default

2-3 CLI と自動化ツールを導入

brew install switchaudio-osx   # 既定 I/O 切替 CLI:contentReference[oaicite:1]{index=1}
brew install --cask hammerspoon

3. Hammerspoon スクリプト(Fn 押下監視)

----------------------------------------------------------------
-- ② Fn 長押しで無音化 (Loopback "SilentMic")
----------------------------------------------------------------
-- ※ここを環境に合わせて変更
local SILENT = "SilentMic" -- Loopback で作った無音デバイス名
-- 内部状態
local prevInput -- 直前の既定マイク名
local fnDown = false -- Fn キー押下中フラグ
-- 既定入力を安全に切り替える関数
local function setDefaultInput(name)
local dev = hs.audiodevice.findInputByName(name)
if dev then dev:setDefaultInputDevice() end
end
-- Fn キー押下/離脱を監視
hs.eventtap.new({hs.eventtap.event.types.flagsChanged}, function(e)
local nowFn = e:getFlags().fn
if nowFn and not fnDown then -- ① Fn 押下開始
prevInput = hs.audiodevice.defaultInputDevice():name()
setDefaultInput(SILENT) -- Discord等無音
fnDown = true
elseif not nowFn and fnDown then -- ② Fn 解除
if prevInput then setDefaultInput(prevInput) end
fnDown = false
end
return false -- イベント伝播
end):start()
-- ③ Hammerspoon 再読み込み時に念のためマイクを復旧
hs.shutdownCallback = function()
if fnDown and prevInput then
setDefaultInput(prevInput)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment