{"skill":{"slug":"daily-voice-quote","displayName":"Daily Voice Quote","summary":"每日名言語音任務。產生「語音 + 封面圖靜態影片 +（選配）HeyGen 數位人影片」並發送給主人。","description":"---\nname: daily-voice-quote\ndescription: 每日名言語音任務。產生「語音 + 封面圖靜態影片 +（選配）HeyGen 數位人影片」並發送給主人。\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"🎙️\",\n        \"requires\":\n          {\n            \"bins\": [\"sag\", \"ffmpeg\"],\n            \"env\": [\"ELEVENLABS_API_KEY\"],\n            \"optionalBins\": [\"uv\", \"python3\"],\n            \"optionalEnv\": [\"GEMINI_API_KEY\", \"HEYGEN_API_KEY\"],\n          },\n        \"primaryEnv\": \"ELEVENLABS_API_KEY\",\n        \"install\":\n          [\n            {\n              \"id\": \"sag-brew\",\n              \"kind\": \"brew\",\n              \"formula\": \"steipete/tap/sag\",\n              \"bins\": [\"sag\"],\n              \"label\": \"Install sag - ElevenLabs TTS CLI (brew)\",\n            },\n            {\n              \"id\": \"ffmpeg-brew\",\n              \"kind\": \"brew\",\n              \"formula\": \"ffmpeg\",\n              \"bins\": [\"ffmpeg\"],\n              \"label\": \"Install ffmpeg - audio/video processing (brew)\",\n            },\n            {\n              \"id\": \"uv-brew\",\n              \"kind\": \"brew\",\n              \"formula\": \"uv\",\n              \"bins\": [\"uv\"],\n              \"label\": \"Install uv - Python runner for image generation (brew, optional)\",\n            },\n          ],\n        \"notes\": \"Required: ELEVENLABS_API_KEY + sag + ffmpeg for voice generation. Optional: GEMINI_API_KEY + uv for cover image generation (nano-banana-pro). Optional: HEYGEN_API_KEY for digital avatar video. Without ElevenLabs, the built-in tts tool can be used as a fallback.\",\n      },\n  }\n---\n\n# Daily Voice Quote 每日名言語音\n\n這個 skill 會在每天早上：\n1) 用主人的聲音朗讀一則名人名言（語音）\n2) 生成封面圖並合成靜態影片\n3) （選配）產生 HeyGen 數位人影片\n\n最終產出三件套：**語音、靜態影片、HeyGen 數位人影片**。\n\n---\n\n## 1. 簡介\n\n每天早上自動選一則名人名言，用主人的聲音念出來，並搭配一張美感封面圖與影片版本發送給主人。若你沒有 HeyGen 帳號，也可以只做「語音 + 靜態影片」。\n\n---\n\n## 2. 前置準備 Checklist\n\n### a) 主人的照片（封面圖生成用）\n- 需要 **1-3 張高品質照片**（正臉、清楚、光線好）\n- 放到 workspace 的 `avatars/` 目錄\n- 如果沒有照片：**請主人提供 1-3 張好看的照片！**\n\n### b) ElevenLabs 帳號 + 語音克隆\n- 註冊：[**👉 ElevenLabs 免費開始**](https://try.elevenlabs.io/clawhub)（免費方案含 10,000 字元/月，足夠試玩！）\n- 取得 API Key 後，存到你的 OpenClaw config 或環境變數 `ELEVENLABS_API_KEY`\n- 語音克隆方式：\n  - **方法一（官方 UI）**：主人錄 1-3 分鐘語音 → 上傳到 ElevenLabs Voice Lab\n  - **方法二（主人傳語音給你）**：主人傳語音訊息 → 你下載後用 API 上傳克隆：\n    ```bash\n    curl -X POST \"https://api.elevenlabs.io/v1/voices/add\" \\\n      -H \"xi-api-key: $ELEVENLABS_API_KEY\" \\\n      -F \"name=主人的名字\" \\\n      -F \"files=@/path/to/voice-sample.mp3\" \\\n      -F \"description=Voice clone for daily quotes\"\n    ```\n    API 會回傳 `voice_id`，記下來。\n- 記錄到 TOOLS.md：**Voice Name、Voice ID**\n\n#### 檢查 API Key 和語音\n\n```bash\n# 1. 確認 API Key 存在\necho $ELEVENLABS_API_KEY  # 應該有值\n\n# 2. 列出所有可用語音\nsag voices\n\n# 3. 測試語音生成\nsag -v \"YOUR_VOICE_NAME\" -o /tmp/test.mp3 \"早安，這是一個語音測試。\"\n```\n\n⚠️ `sag` 所有指令都需要 `ELEVENLABS_API_KEY` 環境變數。如果沒有，請先設定。\n\n#### 沒有 ElevenLabs？用內建 tts 替代\n\n如果暫時沒有 ElevenLabs API Key，可以先用 OpenClaw 內建的 `tts` tool：\n```\ntts({ text: \"早安！今天想分享 Steve Jobs 的一句話...\" })\n```\n音色不會是主人的聲音，但流程可以先跑起來。\n\n### c) HeyGen 帳號 + 數位人 Avatar（選配）\n- 註冊：[**👉 HeyGen 免費試用**](https://www.heygen.com/?sid=rewardful&via=clawhub)（新用戶送 1 支免費影片！）\n- 數位人訓練：主人錄一段 **2 分鐘自拍影片** 上傳訓練\n- 記錄：**Avatar ID、Voice ID**\n- 如果沒有 HeyGen 帳號 → **跳過 Part 3，只做語音 + 靜態影片**\n\n### d) Channel 設定\n- 先確認主人常用的通訊軟體\n- **LINE**：需要 `CHANNEL_ACCESS_TOKEN` + `USER_ID / GROUP_ID`\n- 其他（Telegram / Discord / WhatsApp 等）：使用 `message` tool 或 `tts` tool\n\n#### 📱 LINE 媒體格式要求（重要！）\n\nLINE 對語音和影片的格式有嚴格限制，格式不對會無法在聊天裡直接點開播放！\n\n**語音訊息（audio message）：**\n| 項目 | 要求 |\n|------|------|\n| 格式 | **M4A**（`.m4a`）- AAC 編碼 |\n| 來源 | 必須是 **HTTPS 公開 URL**（不接受本地檔案路徑） |\n| duration | 必須提供毫秒數（如 `21000` = 21 秒） |\n| ❌ 不行 | MP3 直接發送（LINE 不支援 audio type 用 MP3） |\n| ✅ 轉換 | `ffmpeg -i input.mp3 -c:a aac -b:a 128k output.m4a -y` |\n\n**影片訊息（video message）：**\n| 項目 | 要求 |\n|------|------|\n| 格式 | **MP4**（`.mp4`）- H.264 視訊 + AAC 音訊 |\n| 來源 | 必須是 **HTTPS 公開 URL**（支援 Range requests） |\n| previewImageUrl | 必須提供影片預覽圖 URL（JPEG/PNG） |\n| ❌ 不行 | ngrok + Python SimpleHTTPServer（不支援 Range requests，LINE 無法播放） |\n| ✅ 可行 | ngrok + Node.js static server、HeyGen CDN URL、任何支援 Range requests 的 CDN |\n\n**公開 URL 方案：**\n- **最簡單**：把檔案放到支援 Range requests 的靜態檔案伺服器 + ngrok/cloudflare tunnel\n- **免設定**：HeyGen 影片直接用 HeyGen CDN URL（自帶）\n- **進階**：上傳到 S3/GCS/Cloudflare R2 等雲端儲存\n\n**LINE Push API 範例：**\n```bash\n# 語音\ncurl -s -X POST https://api.line.me/v2/bot/message/push \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer $LINE_CHANNEL_ACCESS_TOKEN\" \\\n  -d '{\n    \"to\": \"YOUR_LINE_USER_ID\",\n    \"messages\": [{\n      \"type\": \"audio\",\n      \"originalContentUrl\": \"https://your-domain.com/daily-quote.m4a\",\n      \"duration\": 21000\n    }]\n  }'\n\n# 影片\ncurl -s -X POST https://api.line.me/v2/bot/message/push \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer $LINE_CHANNEL_ACCESS_TOKEN\" \\\n  -d '{\n    \"to\": \"YOUR_LINE_USER_ID\",\n    \"messages\": [{\n      \"type\": \"video\",\n      \"originalContentUrl\": \"https://your-domain.com/daily-quote.mp4\",\n      \"previewImageUrl\": \"https://your-domain.com/daily-quote-preview.jpg\"\n    }]\n  }'\n```\n\n### e) Gemini API Key（封面圖生成）\n- 取得：https://aistudio.google.com\n- 或改用你喜歡的圖片生成 skill（DALL·E / SD / Midjourney 皆可）\n\n---\n\n## 3. 名言選擇規則（v2 — AI 動態選擇）\n\n不要用固定清單輪播！每天根據上下文 **動態選擇** 最有共感的名言。\n\n### Step 1: 收集上下文\n每天 cron 執行時自動收集：\n- 日期、星期幾、農曆日期\n- 節日 / 紀念日（參考 `references/holidays.md`）\n- `web_search` 當天重大新聞（尤其 AI、科技、政策相關）\n- 極端天氣（颱風 / 暴雨 / 暴雪 / 極端高溫才影響）\n\n### Step 2: 人物池\n從以下類別選擇主人和粉絲會有共感的人物：\n\n| 類別 | 人物範例 |\n|------|---------|\n| **科技先驅** | Alan Turing, Ada Lovelace, Nikola Tesla, Tim Berners-Lee, Grace Hopper |\n| **科學家** | Einstein, Feynman, Marie Curie, Carl Sagan, Hawking |\n| **區塊鏈/Web3** | Satoshi Nakamoto, Vitalik Buterin, Naval Ravikant |\n| **創業家** | Steve Jobs, Elon Musk, Jeff Bezos, Marc Andreessen, Peter Thiel |\n| **投資大師** | Warren Buffett, Charlie Munger, Ray Dalio |\n| **東方智慧** | 老子, 孔子, 莊子, 王陽明 |\n| **民主/領導** | Churchill, Mandela, MLK, Lincoln, 甘地 |\n| **哲學家** | Marcus Aurelius, Seneca, Epictetus |\n| **文藝/思想** | Leonardo da Vinci, Hemingway |\n\n> 完整人物與名言範例見 `references/quotes.md`\n> ⚠️ 排除有重大醜聞/爭議的人物\n> ⚠️ 避免太政治敏感的人物（注意主人所在地的政治脈絡）\n\n### Step 3: 加權邏輯\n| 情境 | 加權方向 | 偏好類別 |\n|------|---------|---------|\n| 週一 | 激勵、新開始、行動力 | 創業家、領導者 |\n| 週五 | 反思、展望、輕鬆 | 哲學家、科學家 |\n| 週末 | 人生智慧、生活 | 東方智慧、哲學家 |\n| AI 重大新聞 | 科技思考、人機關係 | Turing, Feynman, Hawking |\n| 加密/Web3 新聞 | 去中心化、金融哲學 | Satoshi, Vitalik, Buffett |\n| 國安/國際局勢 | 勇氣、韌性、準備 | Churchill, Lincoln, Mandela |\n| 能源議題 | 科學、創新、永續 | Tesla, Curie, Sagan |\n| 節日 | 與節日主題呼應的名人名言 | 教師節→孔子 等 |\n| 普通日 | 人生智慧、好奇心 | Feynman, 老子, Marcus Aurelius |\n\n### Step 4: 品質要求\n1. **啟發性** — 要能啟發人、給力量\n2. **正面** — 正向積極\n3. **中文翻譯通順** — 不能硬翻，要像母語者自然說出的話\n4. **原文正確** — 選名言後，`web_search` 確認原文正確性和出處\n\n### Step 5: 去重複\n- 記錄已用名言到 `memory/used-quotes.md`（或你偏好的追蹤檔）\n- **同一名人間隔至少 14 天**\n- **完全相同的名言永不重複**\n\n### Step 6: 最終選擇\n生成 3-5 個候選名言，選最佳的一個。記錄選擇理由到日誌。\n\n> ⚠️ 必須是「名人 + 名言」，不是祝賀詞 / 成語 / 諺語\n> 語音稿開頭可加節日問候，但名言本身要有明確出處\n\n---\n\n## 4. 完整執行流程\n\n> ⛔ **絕對不要把語音稿當文字訊息發送！**\n> 語音稿裡有 `[short pause]` 等 TTS 標籤，這些只是給 sag 引擎用的，使用者看到會覺得壞掉了。\n> **只發送：① 音訊檔 ② 靜態影片 ③ HeyGen+字幕影片。不要發送任何純文字訊息。**\n\n### ⚠️ 三份稿件分開做！（不要偷懶！）\n\n每日名言有 **三份獨立的文稿**，各有不同需求，不能互相混用：\n\n| 稿件 | 用途 | 特色 |\n|------|------|------|\n| **ElevenLabs 語音稿** | sag CLI 生語音 | 可用 `[short pause]`, `[excited]` 等 TTS 情緒標籤 |\n| **HeyGen 影片稿** | 數位人影片台詞 | 中英文用換行 + 過渡句分隔，❌ 不能用 TTS 標籤 |\n| **ZapCap 字幕稿** | 影片字幕顯示 | 修 Whisper 錯誤 + `punctuation` 控制分頁 |\n\n### Part 1：語音（ElevenLabs 語音稿）\n\n**流程：**選名言 → 寫語音稿 → `sag` 生成 → `ffmpeg` 轉 m4a → 發送（只發音訊檔，不發文字）\n\n**語音稿模板（含情緒標籤，僅供 TTS 引擎使用，絕不直接發送給使用者）：**\n```\n早安，我是{SPEAKER_NAME}。[short pause]\n今天想分享{AUTHOR}的一句話：[short pause]\n{QUOTE_ZH} [short pause]\n{QUOTE_EN} [short pause]\n{CLOSING_WORDS}\n```\n\n- ElevenLabs 對中英文混合處理得較好，可以自然混合\n- `[short pause]` 等標籤只有 ElevenLabs 支援，其他平台不認得\n\n**產生語音（範例）：**\n```bash\n# 1. 生成 MP3\nELEVENLABS_API_KEY=\"YOUR_ELEVENLABS_API_KEY\" \\\n  sag -v \"YOUR_VOICE_NAME\" \\\n  --speed 0.95 --stability 1.0 --similarity 0.85 \\\n  -o /tmp/daily-quote.mp3 \"${SCRIPT}\"\n\n# 2. 轉換為 M4A（LINE 必須！MP3 不能直接在 LINE 聊天裡播放）\nffmpeg -i /tmp/daily-quote.mp3 -c:a aac -b:a 128k /tmp/daily-quote.m4a -y\n\n# 3. 取得音訊長度（LINE audio message 需要 duration 毫秒數）\n#    從 ffmpeg 輸出讀取，例如 time=00:00:21.16 → 21160 ms\n#    或用 ffprobe：\nffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 /tmp/daily-quote.m4a\n# → 乘以 1000 得到毫秒數\n```\n\n> 📱 **LINE 用戶注意**：語音必須是 **M4A 格式**（AAC 編碼）才能在聊天裡直接點開播放。MP3 不行！詳見上方「LINE 媒體格式要求」。\n\n### Part 2：封面圖靜態影片\n\n> ⚠️ **超重要：`--input-image` 是讓 AI 重新生成新照片，不是去背剪貼！**\n\n**⚠️ 封面圖主角 = 主人（不是 AI Agent！）**\n- 封面圖要用**主人的照片**作為 `--input-image`\n- ❌ 不要用 AI Agent（小龍蝦等）的照片\n- 只有「AI Agent 主題」的文章封面才用 AI Agent 照片\n\n**⚠️ 封面圖比例 = 直式 9:16**\n- 靜態影片是直式的，封面圖也要直式\n- prompt 裡明確寫 \"vertical 9:16 portrait\"\n\n**好的 prompt 範例：**\n```\nGenerate a vertical 9:16 portrait of this person wearing a traditional outfit,\nstanding in a festive scene with soft lantern lights. The person is smiling\nconfidently. Overlay elegant text: \"{QUOTE_ZH} — {AUTHOR}\".\nCinematic lighting, Instagram story style.\n```\n\n**壞的 prompt（不要用）：**\n```\nPaste this person onto a red background...\nCut out the person and place into the scene...\nUse the AI agent character as the main subject...\n```\n\n**生成封面圖（範例，用 nano-banana-pro skill）：**\n```bash\nGEMINI_API_KEY=\"YOUR_GEMINI_API_KEY\" \\\nuv run /opt/homebrew/lib/node_modules/openclaw/skills/nano-banana-pro/scripts/generate_image.py \\\n  --prompt \"YOUR_PROMPT\" \\\n  --input-image \"/path/to/avatars/photo.jpg\" \\\n  --filename \"/tmp/daily-quote-cover.png\" \\\n  --resolution 2K\n```\n\n**合成靜態影片（封面圖 + 語音 = 影片）：**\n```bash\n# 合成 MP4（H.264 + AAC）- LINE 可直接播放的格式\nffmpeg -loop 1 -i /tmp/daily-quote-cover.png -i /tmp/daily-quote.mp3 \\\n  -c:v libx264 -tune stillimage -c:a aac -b:a 128k \\\n  -pix_fmt yuv420p -shortest \\\n  -vf \"scale=720:1280:force_original_aspect_ratio=decrease,pad=720:1280:(ow-iw)/2:(oh-ih)/2\" \\\n  /tmp/daily-quote-static.mp4 -y\n\n# 截取預覽圖（LINE video message 必須提供 previewImageUrl）\nffmpeg -i /tmp/daily-quote-static.mp4 -vframes 1 -q:v 2 /tmp/daily-quote-preview.jpg -y\n```\n\n> 📱 **LINE 用戶注意**：影片必須是 **MP4 格式**（H.264 視訊 + AAC 音訊），且需要透過支援 Range requests 的 HTTPS URL 提供，LINE 才能在聊天裡直接點開播放。同時必須提供預覽圖 URL。詳見上方「LINE 媒體格式要求」。\n\n### Part 3：HeyGen 數位人影片（選配 — HeyGen 影片稿）\n\n**⚠️ HeyGen 影片稿是獨立的！不要直接複製 ElevenLabs 語音稿！**\n\n**HeyGen 影片稿規則：**\n- 口白**中文為主**，只有名言原文才用英文\n- `--language \"en\"` 是 TTS 引擎參數（因為 clone voice 訓練語言是英文），**不是要把口白改成英文！**\n- ❌ 不能用 `[short pause]` 等 ElevenLabs 標籤（HeyGen 不認得）\n\n**⚠️⚠️ 中英文切換處理（關鍵！）**\n\nHeyGen TTS 在中英文切換時容易產生怪聲音或咬字不清。解法：\n\n1. **中英文之間加完整過渡句 + 換行**：\n```\n生命中沒有什麼值得恐懼的，只有需要理解的。\n原文是這樣說的。\nNothing in life, is to be feared, it is only, to be understood.\n```\n\n2. **英文名言用逗號斷句**（防止 TTS 黏字）：\n   - ✅ `Nothing in life, is to be feared, it is only, to be understood.`\n   - ❌ `Nothing in life is to be feared it is only to be understood.`\n\n3. **英文人名前後加逗號**：\n   - ✅ `今天分享，居禮夫人，的一句話。`\n\n4. **驗證**：生成前把口白稿印出來檢查所有英文斷句\n\n**HeyGen 影片稿模板：**\n```\n早安，我是{SPEAKER_NAME}。\n今天想分享，{AUTHOR}的一句話。\n{QUOTE_ZH}\n原文是這樣說的。\n{QUOTE_EN_WITH_COMMAS}\n{CLOSING_WORDS}\n```\n\n**⚠️ 重要語音參數（A/B 測試確認最佳設定）：**\n\n```bash\nHEYGEN_API_KEY=\"YOUR_HEYGEN_API_KEY\" \\\npython3 /path/to/heygen/generate_video.py \\\n  --text \"${SCRIPT_PLAIN}\" \\\n  --avatar-id \"YOUR_AVATAR_ID\" \\\n  --voice-id \"YOUR_HEYGEN_VOICE_ID\" \\\n  --speed 0.98 \\\n  --emotion \"Friendly\" \\\n  --language \"en\" \\\n  --dimension \"720x1280\" \\\n  --aspect-ratio \"9:16\" \\\n  --output /tmp/daily-quote-heygen.mp4\n```\n\n**關鍵設定（缺一不可）：**\n- `--speed 0.98` - 最自然的語速\n- `--emotion \"Friendly\"` - 溫暖友善的語氣\n- `--language \"en\"` - 即使中文內容也用 en（clone voice 原始訓練語言）\n- **英文斷句要口語化** - 用逗號斷句：\"Success, is not final. Failure, is not fatal.\"\n- 不要寫成一整句不斷的英文，要像人講話一樣有停頓\n\n如果沒有 HeyGen 帳號，直接跳過本段即可。\n\n### Part 3b：ZapCap 字幕（HeyGen 影片加字幕 — ZapCap 字幕稿）\n\n**ZapCap 字幕稿是獨立於語音稿和影片稿的第三份文稿！**\n它只管「觀眾看到的字幕文字和分頁」。\n\n如果有使用 ZapCap 加字幕，**approve 前必須手動修正 transcript**：\n\n**⚠️ Whisper 轉錄常見問題（每次都要檢查！）：**\n1. **英文單字全黏在一起** — `Nothinginlifeistobefeared` → 拆成 `Nothing in life is to be feared`\n2. **英文人名黏在一起** — `TheodoreRoosevelt` → `Theodore Roosevelt`\n3. **中文斷詞錯誤** — `開始行動祝` → `開始` `行動` `祝`\n4. **人名辨識錯誤** — 常見的錯字都要修（如主人名字的錯字）\n\n**⚠️ 字幕分頁控制（關鍵！）：**\n\nZapCap transcript 只支援 `\"type\": \"word\"` 和 `\"type\": \"punctuation\"` 兩種 type。\n- ❌ **不支援 `\"type\": \"linebreak\"`**（會回 400 Bad Request）\n- ✅ **用 `punctuation` type + `\"text\": \"。\"` 來強制換頁**\n\n在以下位置插入 `{\"type\": \"punctuation\", \"text\": \"。\", \"start_time\": X, \"end_time\": X, \"confidence\": 1}`：\n- 完整句子結束處\n- 中文 → 英文切換處\n- 英文 → 中文切換處\n- 語意斷點（每頁最多 8-10 中文字 / 6-8 英文字）\n\n**成功分頁範例（居禮夫人名言）：**\n```\n[頁1] 早安 我 是 葛如鈞\n[頁2] 今天 想 分享 居禮夫人 的 一句 話\n[頁3] 生命 中 沒 有 什麼 值得 恐懼 的\n[頁4] 只有 需要 理解 的\n[頁5] 現 在 是 時候 去 理解 更多\n[頁6] 這樣 我們 才能 少 一些 恐懼\n[頁7] 原文 是 這樣 說 的\n[頁8] Nothing in life is to be feared, it is only to be understood.\n[頁9] 面對 未知 不要 害怕 去 理解 它\n[頁10] 祝 大家 週末 愉快\n```\n\n**完整修正流程：**\n1. 下載 transcript JSON\n2. 修正錯字（人名、英文分詞等）\n3. **在句子邊界插入 `punctuation` 元素**（`\"。\"`）\n4. `PUT` 更新 transcript\n5. `POST` approve → 等 render\n\n---\n\n## 5. Cron Job 設定範例\n\n### LINE 版\n```json\n{\n  \"name\": \"每日名言語音\",\n  \"schedule\": { \"kind\": \"cron\", \"expr\": \"0 6 * * *\", \"tz\": \"Asia/Taipei\" },\n  \"payload\": {\n    \"kind\": \"agentTurn\",\n    \"model\": \"anthropic/claude-sonnet-4\",\n    \"message\": \"請執行 daily-voice-quote：產生語音 + 靜態影片（選配 HeyGen），並送到 LINE。使用環境變數：YOUR_LINE_CHANNEL_ACCESS_TOKEN / YOUR_LINE_USER_ID / YOUR_AUDIO_PUBLIC_URL。\"\n  }\n}\n```\n\n### 非 LINE 版（Telegram / Discord / WhatsApp 等）\n```json\n{\n  \"name\": \"每日名言語音\",\n  \"schedule\": { \"kind\": \"cron\", \"expr\": \"0 6 * * *\", \"tz\": \"Asia/Taipei\" },\n  \"payload\": {\n    \"kind\": \"agentTurn\",\n    \"model\": \"anthropic/claude-sonnet-4\",\n    \"message\": \"請執行 daily-voice-quote：產生語音 + 靜態影片（選配 HeyGen），並用 message/tts 工具送到當前 channel。\"\n  }\n}\n```\n\n---\n\n## 6. 常見問題 FAQ\n\n**Q1：沒有主人照片怎麼辦？**\n- A：請主人提供 1-3 張清晰照片。沒有照片就無法生成封面圖。\n\n**Q2：沒有 ElevenLabs 怎麼辦？**\n- A：可改用內建 `tts` tool 先產生語音，但音色就不是主人的聲音。[免費註冊 ElevenLabs](https://try.elevenlabs.io/clawhub) 就能用自己的聲音！\n\n**Q3：HeyGen 額度不足怎麼辦？**\n- A：先只做語音 + 靜態影片，等額度恢復再補數位人影片。[升級 HeyGen 方案](https://www.heygen.com/?sid=rewardful&via=clawhub) 可獲得更多額度。\n\n**Q4：如何更換名言清單？**\n- A：直接編輯 `references/quotes.md`，或在腳本中指定 `QUOTES_FILE`。\n\n**Q5：LINE 聊天裡點語音/影片沒反應或無法播放？**\n- A：檢查格式！語音必須是 **M4A**（不是 MP3），影片必須是 **MP4**（H.264+AAC）。URL 必須是 HTTPS 且支援 Range requests（Python SimpleHTTPServer 不支援！用 Node.js static server 或 CDN）。\n\n---\n\n## 附：腳本位置\n\n- `scripts/send-daily-quote.sh`：完整 bash 腳本（無硬編碼，全部用環境變數）\n- `references/quotes.md`：名言清單\n- `references/holidays.md`：節日清單\n\n<!-- Last verified by LittleLobster: 2026-05-21 -->\n","tags":{"latest":"1.1.1"},"stats":{"comments":0,"downloads":1090,"installsAllTime":2,"installsCurrent":2,"stars":0,"versions":7},"createdAt":1771295108035,"updatedAt":1779353232843},"latestVersion":{"version":"1.1.1","createdAt":1779353232843,"changelog":"Re-scan trigger: verified by LittleLobster 2026-05-21. No functional changes.","license":"MIT-0"},"metadata":{"setup":[{"key":"ELEVENLABS_API_KEY","required":true}],"os":null,"systems":null},"owner":{"handle":"daaab","userId":"s1734aczwq16mt7vnhrq68bkq5841wa6","displayName":"Ju Chun Ko","image":"https://avatars.githubusercontent.com/u/1607280?v=4"},"moderation":{"isSuspicious":false,"isMalwareBlocked":false,"verdict":"clean","reasonCodes":["review.llm_review"],"summary":"Review: review.llm_review","engineVersion":"v2.4.24","updatedAt":1779972248617}}