90 lines
3.3 KiB
Bash
Executable File
90 lines
3.3 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# 音声通知スクリプト
|
||
# 最後のメッセージを取得し、要約してメッセージを読み上げ
|
||
|
||
# 標準入力からJSONを読み取る
|
||
INPUT=$(cat)
|
||
|
||
# プラグインのディレクトリを取得
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
PLUGIN_DIR="$(dirname "$SCRIPT_DIR")"
|
||
HOOKS_DIR="$SCRIPT_DIR"
|
||
NOTIFY_LOG_PATH="$HOOKS_DIR/notify.log"
|
||
|
||
# ログディレクトリの作成
|
||
mkdir -p "$HOOKS_DIR"
|
||
|
||
# トランスクリプトを処理(.jsonl形式に対応)
|
||
TRANSCRIPT_PATH=$(echo "$INPUT" | jq -r '.transcript_path')
|
||
if [ -f "$TRANSCRIPT_PATH" ]; then
|
||
# 最後のアシスタントメッセージのみを取得(全文)
|
||
TEMP_FILE=$(mktemp)
|
||
|
||
if command -v tail >/dev/null 2>&1; then
|
||
tail -r "$TRANSCRIPT_PATH" > "$TEMP_FILE"
|
||
|
||
LAST_MESSAGE=""
|
||
while IFS= read -r line; do
|
||
# JSON形式の妥当性をチェック
|
||
if echo "$line" | jq -e . >/dev/null 2>&1; then
|
||
if echo "$line" | jq -e '.type == "assistant"' >/dev/null 2>&1; then
|
||
LAST_MESSAGE=$(echo "$line" | jq -r '.message.content[]? | select(.type == "text") | .text' 2>/dev/null)
|
||
break
|
||
fi
|
||
fi
|
||
done < "$TEMP_FILE"
|
||
|
||
rm -f "$TEMP_FILE"
|
||
fi
|
||
|
||
# メッセージが取得できた場合の処理
|
||
if [ -n "$LAST_MESSAGE" ]; then
|
||
# 最後のメッセージの1行目を取得(最大100文字)
|
||
MESSAGE=$(echo "$LAST_MESSAGE" | head -n 1 | head -c 100 | sed 's/[[:space:]]*$//')
|
||
|
||
# メッセージが空の場合はデフォルト文例
|
||
if [ -z "$MESSAGE" ]; then
|
||
MESSAGE="処理が完了しました。"
|
||
fi
|
||
|
||
# プロジェクト名を取得して追加
|
||
PROJECT_PATH=$(echo "$INPUT" | jq -r '.cwd // empty')
|
||
if [ -n "$PROJECT_PATH" ]; then
|
||
PROJECT_MANAGER="$HOOKS_DIR/project_manager.sh"
|
||
if [ -f "$PROJECT_MANAGER" ]; then
|
||
PROJECT_NAME=$(bash "$PROJECT_MANAGER" get "$PROJECT_PATH" 2>/dev/null || echo "")
|
||
if [ -n "$PROJECT_NAME" ]; then
|
||
MESSAGE="${PROJECT_NAME}のたくしです。${MESSAGE}"
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
# 通知実行
|
||
# terminal-notifier使用(Macネイティブ通知)
|
||
if command -v terminal-notifier >/dev/null 2>&1; then
|
||
terminal-notifier -message "$MESSAGE" -title "Assistant" >/dev/null 2>&1 &
|
||
fi
|
||
|
||
# 音声出力(Style-Bert-VITS2)
|
||
TTS_SCRIPT="$HOOKS_DIR/tts_bert_vits.sh"
|
||
if [ -f "$TTS_SCRIPT" ]; then
|
||
nohup bash "$TTS_SCRIPT" "$MESSAGE" >/dev/null 2>&1 &
|
||
fi
|
||
|
||
# ログ保存(タイムスタンプ|発言のみ、改行除去)
|
||
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
|
||
CLEAN_MESSAGE=$(echo "$MESSAGE" | tr -d '\n\r' | sed 's/[[:space:]]\+/ /g' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
||
echo "$TIMESTAMP|$CLEAN_MESSAGE" >> "$NOTIFY_LOG_PATH"
|
||
|
||
# ログを10件までに制限
|
||
if [ -f "$NOTIFY_LOG_PATH" ]; then
|
||
TEMP_LOG=$(mktemp)
|
||
tail -n 10 "$NOTIFY_LOG_PATH" > "$TEMP_LOG"
|
||
mv "$TEMP_LOG" "$NOTIFY_LOG_PATH"
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
echo '{"decision": "approve"}'
|
||
exit 0 |