TL;DR
~/.claude/settings.json
に以下を追加。
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "jq -r '.transcript_path' | xargs cat | jq -r 'select(.type == \"assistant\")' | jq -sr '.[-1].message.content[-1].text' | say"
}
]
}
]
}
}
はじめに
Claude Code で、タスクが終わった時に通知するよう設定している方も多いと思います。
terminal-notifier を設定する方法や VOICEVOX MCP などを繋いで Claude Code にしゃべってもらう方法などがありますが、Hooksという機能が出たことでタスク完了時に確実に通知してもらうのが容易になりました。
シンプルにサウンドを鳴らしたり固定文言を再生するのも良いですが、今回は実行した作業の内容を読み上げてもらう設定をしてみます。
Hooks
Claude Code の v1.0.38 から Hooks という機能が使えるようになりました。
この機能は Claude Code のライフサイクルのいくつかのタイミングで自動的にカスタムコマンドを実行できるというものです。
Claude Code のタスク完了時にコマンドを実行するには、 Stop イベントを使用するのが良いです。
Stop hook が発火すると、コマンドは以下のような JSON を標準入力で受け取ります。
{
"session_id": string;
"transcript_path": string;
"stop_hook_active": boolean;
}
ポイントは、コマンドが transcript_path
を受け取れることです。
これを利用すると Claude Code の実際の応答内容を取得して音声読み上げに渡すことができます。
対話モードに入って /hooks
コマンドを実行することで対話的に設定を行うことができます。
直接 ~/.claude/settings.json
ファイルなどに設定を追加しても良いです。
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "say 'タスクが完了しました'"
}
]
}
]
}
}
タスク内容の取得
音声通知で実際のタスク内容を読み上げるには、Claude Code の出力結果を取得する必要があります。
Claude Code は会話の履歴を JSON 形式でログファイルに保存しているようなのですが、詳細な仕様がないので雰囲気で読み取ります。
jq -r '.transcript_path' | xargs cat | jq -r 'select(.type == "assistant")' | jq -sr '.[-1].message.content[-1].text'
簡単に説明すると
-
.transcript_path
で標準入力からログファイルのパスを取得 -
xargs cat
でファイルの内容を取得 -
select(.type == "assistant")
で Claude のメッセージのみ抽出 -
.[-1].message.content[-1].text
で最後の回答テキストを取得
jq も雰囲気で使っているのでもっと良い方法があるかもしれません。詳しい方教えてください。
音声読み上げ
macOS では say
コマンドでテキストを読み上げることができます。
VoiceOver とかで読み上げられるあの声です。
Claude Code に日本語で出力させている場合は、日本語を読み上げられるボイスを選ぶと良いです。-v
オプションで指定するか、システム設定 > アクセシビリティ > 読み上げコンテンツ > システムの声
からデフォルトの音声を設定できます。
おまけ
say
コマンドでも十分良いのですが、VOICEVOX や AivisSpeech などの音声合成エンジンと組み合わせて任意の音声で読み上げさせることもできます。
私は Style-Bert-VITS2 を使用して好みの声でしゃべってもらっています。
他にも色々調整して以下のような感じにしています。
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "afplay ~/.claude/assets/sound.mp3 & say \"Claude Code が、タスクの完了を通知しました。\" && jq -r '.transcript_path' | xargs cat | jq -r 'select(.type == \"assistant\")' | jq -sr '.[-1].message.content[-1].text' | uvx --from sbv2-server tts"
}
]
}
]
}
}
サウンドを鳴らして、機械的にタスクの完了を通知してから、作業内容を読み上げさせる感じです。~/.claude/assets/sound.mp3
に好みのサウンドファイルを置いています。sbv2-server
はローカルに作った Python のプロジェクトです。実はここが本質という感じもありますが、気が向けばあとでこれについても書きます。
まとめ
Claude Code が作業を終えた時に、作業内容を音声で教えてくれるようになりました。最高になっています。
この記事も Claude Code と一緒に書きましたが、やはり声でやりとりできるようになると楽しさも一段階上がりますね。
なお、普通に話をしてるだけで楽しすぎるので生産性は落ちました。
現場からは以上です。
Views: 0