🔉

WSL2のCLAUDE CODEでのタスク完了通知をVOICEVOXで喋らせる

に公開

WSL2で起動しているCLAUDE CODEからの通知をVOICEVOXに喋らせます.
動画で見たほうが早いと思うので,まずは以下のリンクをご覧ください.

https://youtu.be/ierTHRwG5oA

それでは実装していきます.

環境

  • OS: Ubuntu 22.04.5 LTS (WSL2)
  • Claude Code: v1.0.51

概要

以下,実装の概要です.

  1. Windows側で立ち上げたVOICEVOXへngrokを経由してWSLからアクセスします.
  2. 音声出力用のaplayコマンドを準備します.
  3. CLAUDE CODEのhook用のシェルスクリプトを準備します.
  4. CLAUDE CODE内でNotificationやStopのhook eventが発生したとき,3で作成したシェルスクリプトが起動し,VOICEVOXから通知音声が流れます.

WSL環境からVOICEVOXへアクセスする

ngrok導入

WSL環境にはVOICEVOXをインストールできないので,ngrokを経由してWindows環境で立ち上げたVOICEVOXを呼び出します.
Windows環境へのVOICEVOXインストールは済んでいる前提で話を進めます.

なお,ngrokの導入は[[AITuberのためのVOICEVOX環境構築(WSL2編)]]を参考にしました.詳細はこちらの記事を参照下さい.

  1. VOICEVOXを起動しておく

  2. ngrokへSignUpする.

  3. Chocolateyを用いてngrokをインストールします.cmdPowerShellをお使いください.

choco install ngrok
  1. トークンを設定する(<token>はご自身のトークンに置きえて下さい.)
ngrok config add-authtoken <token>
  1. ドメインを取得します.ngrokのユーザページでDeploy your app online > Static Domainと進めば取得できるかと思います.

  2. 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を導入します.

  1. 必要なパッケージをインストール
sudo apt install alsa-utils pulseaudio pulseaudio-utils
  1. 環境変数へ追加
echo 'export PULSE_SERVER=/mnt/wslg/PulseServer' >> ~/.zshrc
source ~/.zshrc
  1. 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
  1. 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