WSL2環境でClaude Codeを使っている開発者の皆さん、タスク完了時の通知音が鳴らなくて困っていませんか?本記事では、WSL2でのサウンド再生設定からClaude CodeのHooks機能を使った通知音設定まで、ガイドをお届けします。
注意: 本記事で使用する音源は、フリー音源サイトなどから入手してください。著作権に配慮した適切な音源をご利用ください。
1. 対象読者
- WSL2 でClaude Codeを使っている開発者
- Claude Codeのタスク完了時に音で通知を受け取りたい人
- 「
libasound_module_pcm_pulse.so
が無い」と言われて困っている人 - CLI だけで効果音・通知音を鳴らしたい人
WSL (Microsoft Store 版) を想定しています。
ディストリは Ubuntu/Debian 系で検証しましたが、他系統でも手順はほぼ同じです。
2. ゴール
Claude CodeのHooks機能を使って、以下のような通知音再生を実現します:
方法 | 対象 | コマンド例 | 用途 |
---|---|---|---|
WSLg 経由 | WAV | aplay notify.wav |
タスク完了通知 |
MP3 | ffplay -nodisp -autoexit music.mp3 |
長時間タスク完了 |
3. WSL2でのサウンド再生環境構築
3-1. WSLg が使える環境(Windows 11 / Store 版 WSL)
必要パッケージのインストール
sudo apt update
sudo apt install alsa-utils ffmpeg libasound2-plugins libpulse0
-
alsa-utils
…aplay
が入る -
ffmpeg
…ffplay
で MP3/OGG など再生 -
libasound2-plugins
+libpulse0
… ALSA → PulseAudio ブリッジ
ALSA を PulseAudio に向ける設定
~/.asoundrc
を新規作成(全ユーザ共通なら /etc/asound.conf
):
pcm.!default {
type pulse
fallback "sysdefault"
}
ctl.!default {
type pulse
}
再生テスト
# WAV
aplay ~/sounds/notify.wav
# MP3
ffplay -nodisp -autoexit ~/sounds/notify.mp3
-nodisp -autoexit
を付けるとコンソール専用&再生後に自動終了します。
もっと軽い MP3 プレイヤーが欲しければsudo apt install mpg123
でも OK。
4. Claude Code hooks機能による通知音設定
4-1. hooks機能とは
Claude Code v.1.0.38で追加されたhooks機能は、Claude Codeのライフサイクルの特定のタイミングで自動実行されるユーザー定義のシェルコマンドです。
4つのイベントタイプがあります:
- PreToolUse: ツール実行前
- PostToolUse: ツール実行後
- Notification: 通知送信時
- Stop: 応答終了時
4-2. 通知音用のサウンドファイルを準備
まず、通知音用のサウンドファイルを準備します:
# サウンドファイル用ディレクトリを作成
mkdir -p ~/sounds
# フリー音源サイトから通知音をダウンロードし、~/sounds にコピー
# または、Windows側のサウンドファイルを使用
cp /mnt/c/Windows/Media/Windows\ Notify\ System\ Generic.wav ~/sounds/notify.wav
4-3. Claude Code hooksの設定方法
プロジェクト固有設定にするなど、お好みに合わせて設定してください。
方法1: /hooksコマンドを使用(推奨)
- Claude Codeセッション内で
/hooks
コマンドを実行 -
4. Stop
イベントを選択(タスク完了時に通知) -
+ Add new matcher…
で空のマッチャーを追加(全てのStopイベントに対応) -
+ Add new hook…
で以下のコマンドを追加:
WSLg環境の場合:
aplay ~/sounds/notify.wav > /dev/null 2>&1 || echo "通知音の再生に失敗しました"
- 保存場所を
User settings
に設定(全プロジェクトで使用)
方法2: 設定ファイルに直接記述
~/.claude/settings.json
に以下を追加:
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "aplay ~/sounds/notify.wav > /dev/null 2>&1 || echo '通知音の再生に失敗しました'"
}
]
}
]
}
}
4-4. 高度な通知設定
Notification イベントでの通知
Claude Codeが許可を求める際にも音を鳴らしたい場合:
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "aplay ~/sounds/attention.wav > /dev/null 2>&1"
}
]
}
],
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "aplay ~/sounds/notify.wav > /dev/null 2>&1"
}
]
}
]
}
}
4-5. 設定の確認とテスト
設定が正しく適用されているか確認:
# 設定確認
cat ~/.claude/settings.json
# Claude Code内で確認
/hooks
テスト実行:
# 簡単なタスクを実行して通知音をテスト
echo "Hello, World!" > test.txt
5. トラブルシューティング
5-1. libasound_module_pcm_pulse.so
が見つからない
aplay: audio open error: No such device or address
原因
libasound2-plugins
が消えて ALSA → PulseAudio ブリッジが失われている。
復旧コマンド
sudo apt update
sudo apt install --reinstall libasound2-plugins libpulse0
sudo apt autoremove
後に再発することがあるので、削除候補に入っていないか確認しましょう。
5-2. hooksが実行されない
-
設定ファイルの確認
# JSON形式が正しいか確認 python3 -m json.tool ~/.claude/settings.json
-
Claude Codeの再起動
# 設定変更後は必ず再起動 /exit claude
5-3. 音が途切れる・出ない
wsl --shutdown # PowerShell (管理者)
wsl # 再起動
WSLg/Audio ブリッジをリセットすると直ることが多いです。
5-4. MP3 を aplay
で渡しても無音
aplay
は 非圧縮 PCM 専用。MP3/OGG などは ffplay
・mpg123
を使用。
6. 便利 Tips
6-1. 音量調整
# 音量を50%に調整して再生
aplay -D pulse ~/sounds/notify.wav
amixer set Master 50%
# または、ffplayで音量指定
ffplay -nodisp -autoexit -volume 30 ~/sounds/notify.mp3
6-2. 複数の通知音を使い分け
# 通知音用ディレクトリ構成
~/sounds/
├── notify.wav # 一般的なタスク完了
├── success.wav # 成功
├── error.wav # エラー
├── attention.wav # 注意・許可要求
└── long_task.wav # 長時間タスク完了
7. まとめ
-
WSL2サウンド環境 →
alsa-utils
+libasound2-plugins
で.wav
/.mp3
再生可能 - Claude Code hooks → Stop/Notificationイベントで通知音自動再生
-
設定方法 →
/hooks
コマンドまたはsettings.json
直接編集 - カスタマイズ → 通知タイプ別の音の使い分けも可能
これでWSL2環境でもClaude Codeのタスク完了を音で知ることができます。長時間のタスクでも画面に張り付く必要がなくなり、開発効率が大幅に向上するはずです!
お疲れさまでした!🎵