はじめに
- macOSの「通知音」の正体は Alert volume(警告音量) で、メインの出力音量とは独立に
osascript -e 'set volume alert volume N'(N=0〜100)で操作できる。 - これを Karabiner-Elements で
⌃(Control)+F11/⌃+F12に割り当てれば、音楽・動画などのメイン音量はそのままで 通知音だけ を増減できる。素のF11/F12は従来どおりメイン音量。 -
落とし穴①:
fromのmodifiersはmandatoryにする。optional:["any"]だけだと 修飾なしの素の F11/F12 まで横取りして、通常の音量調整が壊れる。 -
落とし穴②:
F11/F12が何を出すかはキーボード次第。EventViewer で確認し、consumer_key_code(メディアキー)しか出ないキーボードでは Karabiner で remap できない(Hammerspoon が要る)。
環境
- MacBook Pro(Apple Silicon / M2 Max)
- macOS 26.5(Tahoe)
- Karabiner-Elements 16.0.0
やりたかったこと
通知音が大きすぎ/小さすぎるとき、メインの音量(音楽・動画)はそのままで、通知音だけをキーボードでサッと上げ下げしたい。標準の F11/F12(音量キー)はメイン音量を動かすので、Control を併用したときだけ通知音を変えたい。
Karabiner-Elements とは
Karabiner-Elements は macOS 用のキーボードカスタマイズツール(無料・オープンソース)。単純なキー入れ替え(Simple Modifications)に加え、「特定アプリのときだけ」「修飾キーとの組み合わせのときだけ」といった条件付きの高度な変換(Complex Modifications)を JSON で定義できる。OSの低レイヤ(仮想HIDキーボードドライバ)で動くため、ほぼ全てのキーを横取り・再割り当てできるのが特徴。本記事の「⌃+F11/F12 で通知音量を変える」も、この Complex Modifications の shell_command(キー入力をトリガにシェルコマンドを実行する機能)で実現している。
インストール
brew install --cask karabiner-elements
または公式サイトからダウンロード。初回起動時に システム機能拡張(ドライバ)の許可 と 「入力監視(Input Monitoring)」権限 の付与を求められるので、System Settings で許可する(これをしないとキー入力を検知できない)。
設定の実体は ~/.config/karabiner/karabiner.json。GUIから編集できるほか、~/.config/karabiner/assets/complex_modifications/*.json に置いたルールを GUI の「Complex Modifications」タブで有効化できる。本記事はこの仕組みを使う。
前提: 「通知音」の正体は Alert volume
macOSのサウンドには、出力音量(output volume)とは別に Alert volume(警告音量) があり、通知音・効果音はこちらに従う(出力音量に対して相対的に鳴る)。AppleScriptから独立して操作できる。
# 現在の音量設定(output / input / alert / mute)
osascript -e 'get volume settings'
# => output volume:31, input volume:44, alert volume:29, output muted:false
# 通知音量だけを 0〜100 で設定
osascript -e 'set volume alert volume 30'
つまり「set volume alert volume N を Control+F11/F12 に割り当てる」だけで目的は達成できる。ただしここに2つの落とし穴があった。
完成版の設定
📦 JSON一式・Claude Code 用プロンプトは GitHub でも公開しています → https://github.com/amu815/karabiner-notification-volume
~/.config/karabiner/assets/complex_modifications/alert-volume.json を作成する。
{
"title": "通知音(アラート音量)を ⌃+F11/F12 で増減",
"rules": [
{
"description": "⌃(Left Control)+F11/F12 で alert volume(通知音)を増減。素の F11/F12 は通常のメイン音量のまま。",
"manipulators": [
{
"from": { "key_code": "f11", "modifiers": { "mandatory": ["left_control"], "optional": ["any"] } },
"to": [{ "shell_command": "/usr/bin/osascript -e 'set v to (alert volume of (get volume settings)) - 10' -e 'if v < 0 then set v to 0' -e 'set volume alert volume v' -e 'beep'" }],
"type": "basic"
},
{
"from": { "key_code": "f12", "modifiers": { "mandatory": ["left_control"], "optional": ["any"] } },
"to": [{ "shell_command": "/usr/bin/osascript -e 'set v to (alert volume of (get volume settings)) + 10' -e 'if v > 100 then set v to 100' -e 'set volume alert volume v' -e 'beep'" }],
"type": "basic"
}
]
}
]
}
落とし穴①: 修飾キーは mandatory にする
最初、key_code: f12 を optional:["any"](=修飾キー何でも可)で捕まえていた。すると 修飾なしの素の F12 まで一致してしまい、通常のメイン音量調整が効かなくなった。
// NG: 素の F12 まで横取りしてメイン音量が壊れる
"from": { "key_code": "f12", "modifiers": { "optional": ["any"] } }
// OK: Control を必須にする。素の F12 はスルーされ macOS の音量調整に流れる
"from": { "key_code": "f12", "modifiers": { "mandatory": ["left_control"], "optional": ["any"] } }
mandatory を付ければ、Control を押していないときは Karabiner が一致せず、F12 はそのまま macOS のメイン音量調整に流れる。
落とし穴②: F11/F12 が出すコードはキーボード次第
この設定が成立するのは、お使いのキーボードの F 行が “本物の key_code: f11/f12” を出している場合。Karabiner 付属の EventViewer で F12 を押して確認できる。
-
key_code: f12が出る → 本記事の通り⌃+F11/F12(key_code+mandatory修飾)でOK。 -
consumer_key_code: volume_incrementが出る → これはメディアキー。Karabiner は音量/メディアキーをfrom(変換元)にできない既知の制約がある。to(出力)には使えるがfromには使えない、という非対称。この場合 Karabiner では実現できず、Hammerspoon(systemDefinedの eventtap でメディアキー+修飾を捕捉)が必要。
同じ Mac でも内蔵キーボードと外付けで挙動が違うことがある(Keychron 等は Mac/Win トグルや fn-lock で F 行の挙動が変わる)。まず EventViewer で自分の環境を確認するのが確実。
切り分けに使ったコマンド(耳に頼らず数値で確認)
osascript -e 'set volume output volume 30' # メインの基準
osascript -e 'set volume alert volume 20' # 通知音の基準
# (ここでキーを押す)
osascript -e 'get volume settings'
-
素の F12 →
output volumeが上がる(メイン音量は従来どおり) -
⌃ + F12 →
alert volumeが上がる(通知音だけ独立して変わる)
両方が期待どおり動けば完成。
有効化
# JSON妥当性チェック
python3 -m json.tool ~/.config/karabiner/assets/complex_modifications/alert-volume.json
Karabiner-Elements を開く → Complex Modifications → Add rule → 「通知音(アラート音量)を ⌃+F11/F12 で増減」を Enable。
CLI派は、
karabiner.jsonのselected: trueのプロファイルのcomplex_modifications.rules先頭に上記 rule をマージ(既存ルールは保持)して保存し、以下でリロードしてもよい。CLI="/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli" "$CLI" --select-profile "$("$CLI" --show-current-profile-name)"
付録: Claude Code に設定させるプロンプト
手で設定する代わりに、以下を Claude Code にそのまま貼れば、別のMacでも一発で再現できる。上記の落とし穴(mandatory修飾/キーボード差)を最初から織り込んである。
macOSで「通知音(alert volume)」だけを ⌃(左Control)+F11 / ⌃+F12 で下げ/上げできるように、
Karabiner-Elements を設定してください。メインの出力音量とは独立に効くようにします。
素の F11/F12 は従来どおりメイン音量のまま残すこと。
## 前提と落とし穴(先に押さえること)
- 通知音の実体は macOS の Alert volume で、出力音量とは独立。
操作は osascript -e 'set volume alert volume N'(N=0〜100)。
- まず Karabiner の EventViewer で「F12 を押すと何が出るか」を確認:
- key_code: f12 が出る → このプロンプトの方式(key_code + mandatory修飾)でOK。
- consumer_key_code: volume_increment が出る → Karabiner はメディアキーを from に
できない既知制約(issue #1059 / #1951、Tahoe は #4371)。Karabiner では不可なので、
その旨を伝えて Hammerspoon 方式(systemDefined eventtap)を提案して中止する。
- 【重要】from の modifiers は必ず mandatory:["left_control"] にする。
optional:["any"] だけにすると、修飾なしの素の F11/F12 まで横取りしてしまい、
通常のメイン音量調整が壊れる。
- shell_command の osascript は フルパス /usr/bin/osascript で書くこと。
## やること
1. 次のファイルを作成(既存ルールには一切触れない・追加するだけ):
~/.config/karabiner/assets/complex_modifications/alert-volume.json
{
"title": "通知音(アラート音量)を ⌃+F11/F12 で増減",
"rules": [
{
"description": "⌃(Left Control)+F11/F12 で alert volume(通知音)を増減。素の F11/F12 は通常のメイン音量のまま。",
"manipulators": [
{
"from": { "key_code": "f11", "modifiers": { "mandatory": ["left_control"], "optional": ["any"] } },
"to": [{ "shell_command": "/usr/bin/osascript -e 'set v to (alert volume of (get volume settings)) - 10' -e 'if v < 0 then set v to 0' -e 'set volume alert volume v' -e 'beep'" }],
"type": "basic"
},
{
"from": { "key_code": "f12", "modifiers": { "mandatory": ["left_control"], "optional": ["any"] } },
"to": [{ "shell_command": "/usr/bin/osascript -e 'set v to (alert volume of (get volume settings)) + 10' -e 'if v > 100 then set v to 100' -e 'set volume alert volume v' -e 'beep'" }],
"type": "basic"
}
]
}
]
}
2. python3 -m json.tool で JSON 妥当性を確認。
3. 有効化: ユーザーに「Karabiner-Elements → Complex Modifications → Add rule →
『通知音(アラート音量)を ⌃+F11/F12 で増減』を Enable」と案内する。
4. 動作確認(耳でなく数値で。あなたはキーを押せないのでユーザーに押してもらう):
- osascript -e 'set volume output volume 30' と 'set volume alert volume 20' で基準化
- 「素の F12 を2回」→ output が上がる(メイン音量は従来どおり)
- 「左Control を押しながら F12 を2回」→ alert が上がる(通知音だけ)
- osascript -e 'get volume settings' で両方を確認
5. 補足: 左Control を使う。別の修飾キーが良ければ mandatory の値を変える。
注意点
- 左
Controlを使う。別の修飾キーにしたいときはmandatoryの値を変えるだけ。 -
shell_commandのosascriptは環境差を避けるため フルパス/usr/bin/osascriptで記述。 - 刻みは
±10。+ 10/- 10で調整。末尾の-e 'beep'は変更後の音量で1回鳴らすフィードバック(不要なら削除)。 - 通知音が鳴らない場合は、System Settings → 通知 → 各アプリで「サウンドを再生」がオンか確認。
まとめ
- 通知音 = Alert volume。
osascript -e 'set volume alert volume N'で出力音量と独立に操作できる。 - Karabiner で
⌃+F11/F12に割り当てる。キーはkey_code: f11/f12+mandatory:["left_control"]で捕まえる。 -
optional:["any"]だけはNG(素の F11/F12 まで奪ってメイン音量が壊れる)。 - F 行が
consumer_key_code(メディアキー)しか出さないキーボードでは Karabiner では不可。EventViewer で確認し、その場合は Hammerspoon へ。
