WSL2のCLAUDE CODEでのタスク完了通知をVOICEVOXで喋らせる
WSL2で起動しているCLAUDE CODEからの通知をVOICEVOXに喋らせます.
動画で見たほうが早いと思うので,まずは以下のリンクをご覧ください.
それでは実装していきます.
環境
- OS: Ubuntu 22.04.5 LTS (WSL2)
- Claude Code: v1.0.51
概要
以下,実装の概要です.
- Windows側で立ち上げたVOICEVOXへngrokを経由してWSLからアクセスします.
- 音声出力用の
aplayコマンドを準備します. -
CLAUDE CODEのhook用のシェルスクリプトを準備します. - CLAUDE CODE内でNotificationやStopのhook eventが発生したとき,3で作成したシェルスクリプトが起動し,VOICEVOXから通知音声が流れます.
WSL環境からVOICEVOXへアクセスする
ngrok導入
WSL環境にはVOICEVOXをインストールできないので,ngrokを経由してWindows環境で立ち上げたVOICEVOXを呼び出します.
Windows環境へのVOICEVOXインストールは済んでいる前提で話を進めます.
なお,ngrokの導入は[[AITuberのためのVOICEVOX環境構築(WSL2編)]]を参考にしました.詳細はこちらの記事を参照下さい.
-
VOICEVOXを起動しておく
-
ngrokへSignUpする.
-
Chocolateyを用いてngrokをインストールします.
cmdやPowerShellをお使いください.
choco install ngrok
- トークンを設定する(
<token>はご自身のトークンに置きえて下さい.)
ngrok config add-authtoken <token>
-
ドメインを取得します.ngrokのユーザページで
Deploy your app online > Static Domainと進めば取得できるかと思います. -
VOICEVOXサーバが立ち上がっているportと,取得したドメインを指定してngrokを起動する.
ngrok http --url=<your-domain>.ngrok-free.app 50021
以上でngrokの導入は完了です.
WSLからVOICEVOXにアクセスできるか,確認しておきましょう.
WSLで以下のコマンドを叩き,speaker IDが返ってくるか確認します.
curl https://<取得したドメイン>.ngrok-free.app/speakers
- ここで
<取得したドメイン>にはngrokで取得したドメインを入れてください.
以下のような出力が返ってくれば成功です.
[{"name":"四国めたん","speaker_uuid":"7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff","styles":[{"name":"ノーマル","id":2,"type":"talk"},{"name":"あまあま","id":0,"type":"talk"},{"name":"ツンツン","id":6,"type":"talk"},{"name":"セクシー","id":4,"type":"talk"},{"name":"ささやき","id":36,"type":"talk"},{"name":"ヒソヒソ","id":37,"type":"talk"}],"version":"0.15.9","supported_features":{"permitted_synthesis_morphing":"SELF_ONLY"}},…<中略>…{"name":"東北イタコ","speaker_uuid":"ab4c31a3-8769-422a-b412-708f5ae637e8","styles":[{"name":"ノーマル","id":109,"type":"talk"}],"version":"0.15.9","supported_features":{"permitted_synthesis_morphing":"SELF_ONLY"}}]%
WSL上でVOICEVOXに喋ってもらう
WSL上でVOICEVOXを喋らせるために,音声読み上げ用ツールのaplayを導入します.
- 必要なパッケージをインストール
sudo apt install alsa-utils pulseaudio pulseaudio-utils
- 環境変数へ追加
echo 'export PULSE_SERVER=/mnt/wslg/PulseServer' >> ~/.zshrc
source ~/.zshrc
- VOICEVOXがこんにちわと喋っている音声ファイル,hello.wavという音声ファイルを作成します.
curl -X POST "http://<取得したドメイン>.ngrok-free.app/audio_query?text=こんにちは&speaker=1" \
-H "Content-Type: application/json" | \
curl -X POST "http://<取得したドメイン>.ngrok-free.app/synthesis?speaker=1" \
-H "Content-Type: application/json" \
-d @- \
-o hello.wav
-
aplayで音声ファイルを再生する
aplay hello.wav
上手くいけば,「こんにちは」という音声が再生されるはずです.
CLAUDE CODE用のhookスクリプトを準備する
CLAUDE CODEが提供しているhookを利用して,CLAUDE CODEで作業が完了したら音声で通知されるようにします.
hookについて詳しく知りたい方は公式ページを参照ください.
Notification Hook eventでVOICEVOXに音声通知を出させる
CLAUDE CODEがNotificationのHook Eventを起動したとき,VOICEVOXから音声で通知されるようにします.
例えばCLAUDE CODEがユーザから許可を求めるときに,音声で通知がくるようになります.
~/.claude/hooksに次のファイルを作成します.
最初の数行を,解説しておきます.
source ${HOME}/.claude/hooks/.env
は,hooksディレクトリに配置してある.envファイルを読み込む処理です.
よって,例えば以下のような.envファイルを作成してください.
VOICEVOX_URL=<your-domain>
VOICEVOX_ID=<your-speaker-id>
<your-domain>と<your-speaker-id>には,ngrokでアクセスするためのurlとお好みのVOICEVOXのspeaker-IDを記載してください.
さて,シェルスクリプトに実行権限を付与します.
chmod +x ~/.claude/hooks/notification-voice.sh
jqをインストールしておきます.
sudo apt install jq
更にsettings.jsonにhookを設定します.
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/notification-voice.sh"
}
]
}
]
}
}
以上の設定を済ませてCLAUDE CODEを起動すれば,Notification Hook Eventが発生したときに,
VOICEVOXから音声で通知されます.
StopイベントでもVOICEVOXに音声通知をさせる.
CLAUDE CODEが一連の動作を完了したときに音声で通知させたい,というのは自然な要求でしょう.
しかし完了時にはNotification Hook Eventは発生せず,代わりにStop Hook Eventが発生するので,このときに動作するHookを別で定義します.
これもsetting.jsonに追加しておきましょう.
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/notification-voice.sh"
}
]
}
],
+ "Stop": [
+ {
+ "matcher": "",
+ "hooks": [
+ {
+ "type": "command",
+ "command": "~/.claude/hooks/stop-to-notification.sh"
+ }
+ ]
+ }
+ ]
}
}
以上で全ての設定が完了しました.
冒頭の動画のような動作が実現するはずです.
まとめ
WSL上で立ち上げたCLAUDE CODEで,VOICEVOXから音声通知を出させるhookを作成しました.
- ngrokを経由して,win環境で立ち上がっているVOICEVOXにアクセスしました.
- Notification hook eventで発火するhookを作成しました.
- Stop hook eventで発火するhookを作成しました.
Discussion