WSLで音声認識や機械学習のトレーニングなど、長時間かかるプログラムを実行していると、「いつ終わったか分からない」という問題が発生します。席を外している間に終わっていた、なんてこともしばしばあります🥲せっかくなら、プログラムの終了時に通知が来ると便利ですよね。昔もしばしばビープ音を鳴らしていましたが、音に気づかないことも多く、あまり効果的ではありませんでした。
本記事では、プログラム自体を修正せずに、終了時に音声を鳴らす方法やWindowsのトースト通知を表示させる方法を紹介します。 トースト通知はアクションセンターに履歴が残るため、席を外していても後から確認できるのが大きな利点です😊
今回取り扱う環境
今回は以下のような環境を取り扱います。ビープ音を鳴らす方法は他のLinux環境でも応用可能です。また、トースト通知の方法はWindows環境でもPowerShellから同様に利用できます。
- Windows11(PowerShell) … 実行可能な場合には🪟
- WSL2 (Ubuntu) … 実行可能な場合には🐧
🐧方法1: シンプルなコマンド連結(手軽に試したい場合)
最もシンプルな音を鳴らす方法はビープ音を鳴らすことです。
実行の終了時にビープ音を鳴らす方法は、コマンド(プログラム)の末尾に;で連結して、ビープ音を鳴らすコマンドを実行することです。
実行させるプログラムがyour_programの場合、以下のようにします。
# プログラム終了後にビープ音
$ your_program ; echo -e '\a'
# 複数回鳴らす
$ your_program ; for i in {1..5}; do echo -e '\a'; sleep 0.5; done
ただし、ビープ音は環境によって鳴らないこともありますし、音が小さくて気づきにくいという問題があります。 また、ターミナルで音をオフっていることもあるので、それにも注意です。
🐧🪟方法2: Windowsの音声ファイルを再生
WSLからPowerShellを呼び出して、Windows側の音声ファイルを再生できます。
実行させるプログラムがyour_programの場合、以下のように実行します。
この例では、プログラム終了後にWindowsの標準音声ファイル(C:\Windows\Media\Ring01.wav)を再生しています。
# WSLの場合(;で連結) $ your_program ; powershell.exe -c '(New-Object Media.SoundPlayer "C:\Windows\Media\Ring01.wav").PlaySync()' # PowerShellの場合(;で連結) PS> your_program ; powershell.exe -c '(New-Object Media.SoundPlayer "C:\Windows\Media\Ring01.wav").PlaySync()' # cmd.exeの場合(&で連結) > your_program & powershell.exe -c '(New-Object Media.SoundPlayer "C:\Windows\Media\Ring01.wav").PlaySync()'
cmd.exeの場合、別途音声再生用のプログラムを起動すれば良いのですが、powershell.exeを呼び出すのが簡単です。
概ねこれで問題はありませんが、席を外していると音を聞き逃す可能性があります🤔
🐧🪟方法3: トースト通知を使う(個人的おすすめ)
Windowsのトースト通知を使用すれば、音を聞き逃しても、アクションセンターに履歴が残るため、席を外していても後から確認できます。
BurntToastモジュールのインストール
PowerShellでトースト通知を簡単に扱えるBurntToastモジュールを使います。
Windows側で管理者権限のPowerShellを開き、1回だけ実行してください
PS> Install-Module -Name BurntToast -Force
「続行するにはNuGetプロバイダーが必要です」という警告が出た場合は、Yを入力してNugetプロバイダーのインストールとともに処理を続行します。

🐧WSLから呼び出す関数を作成
~/.bashrcに以下を追加します。
# シンプルなトースト通知
toast() {
local title="${1:-通知}"
local message="${2:-処理が完了しました}"
local sound="${3:-Default}"
powershell.exe -Command "New-BurntToastNotification -Text '$title', '$message' -Sound '$sound'"
}
# プログラム終了時にトースト通知(成功/失敗で通知を変える)
notify_on_done() {
"$@"
local exit_code=$?
if [ $exit_code -eq 0 ]; then
toast "完了" "コマンドが正常に終了しました"
else
toast "エラー" "異常終了 (code: $exit_code)" "Alarm"
fi
return $exit_code
}
# アラーム音付きで通知(目立たせたい時用)
toast_alarm() {
local title="${1:-アラーム}"
local message="${2:-処理が完了しました}"
powershell.exe -Command "New-BurntToastNotification -Text '$title', '$message' -Sound 'Alarm'"
}
追加したら、設定を反映させます。
$ source ~/.bashrc
🐧使い方
基本的な通知
# タイトルとメッセージを指定 $ toast "ビルド完了" "makeが終了しました"

アラーム音付き通知
$ toast_alarm "緊急" "ディスク容量不足"

サウンドを指定
# 第3引数でサウンドを指定 $ toast "重要" "バックアップ完了" "Alarm2"

指定可能なサウンド一覧
| サウンド名 | 説明 |
|---|---|
Default |
標準の通知音 |
Alarm, Alarm2〜Alarm10 |
目覚まし時計のような音 |
Call, Call2〜Call10 |
着信音 |
SMS |
SMS受信音 |
Mail |
メール受信音 |
Reminder |
リマインダー音 |
長時間プログラムの終了を通知
notify_on_done関数を使うと、コマンドの終了コードに応じて通知内容が変わります:
# 正常終了なら完了の、異常終了ならエラーのアラーム音 $ notify_on_done make -j8 $ notify_on_done python train.py $ notify_on_done npm run build
シンプルにコマンド連結
直接コマンドと連結することも可能です。
$ your_program ; toast "完了" "処理が終わりました"
動作確認
以下のコマンドで動作を確認できます。
# 3秒後に通知 $ sleep 3 ; toast "テスト" "3秒経ちました" # アラーム音テスト $ sleep 3 ; toast_alarm "テスト" "アラーム音確認"
🪟使い方
PowerShellからも同様に使えます。
# シンプルな通知 PS> your_program ; New-BurntToastNotification -Text "処理完了", "プログラムが終了しました"

おわりに
BurntToastモジュールを使えば、WSLからでも簡単にWindowsのトースト通知を送れます。長時間処理を実行する際は、ぜひ活用してみてください🤩私はWindowsの通知機能は通常はOFFにしているのですが、この機能を知ってからは長時間作業のときにはONにしています。