← 返回
内容创作

Voice Memo Sync

Sync, transcribe, and intelligently organize voice memos, audio/video files, and URLs. 同步、转录、智能整理语音备忘录、音视频文件和视频链接。
同步、转录并智能整理语音备忘录、音视频文件和链接
ying-wen
内容创作 clawhub v1.6.1 2 版本 100000 Key: 无需
★ 0
Stars
📥 705
下载
💾 9
安装
2
版本
#latest

概述

Voice Memo Sync 🎙️

Intelligent voice/video transcription and organization system.

智能语音/视频转录与整理系统。


Quick Start / 快速开始

# Run installation script / 运行安装脚本
cd ~/.openclaw/workspace/skills/voice-memo-sync
./scripts/install.sh

What it does / 安装内容:

  1. Creates data directory memory/voice-memos/ / 创建数据目录
  2. Creates config file config/voice-memo-sync.yaml / 创建配置文件
  3. Creates Apple Notes folder "Voice Memos" / 创建 Apple Notes 文件夹
  4. Checks dependencies and prompts installation / 检查依赖并提示安装

When to Use / 何时使用

USE this skill when user:

  • Sends voice/audio/video files / 发送语音/音频/视频文件
  • Sends YouTube/Bilibili URLs / 发送 YouTube/B站 链接
  • Sends transcript text files / 发送转录文本文件
  • Says "sync voice memos", "process recording", "organize this video"
  • 说「同步语音备忘录」「处理录音」「整理这个视频」

DO NOT use when:

  • User just wants to play audio/video / 用户只想播放音视频
  • User asks about music/podcasts without transcription needs / 询问音乐/播客但不需要转录

Supported Formats / 支持格式

⚡ Metal GPU Acceleration (NEW)

On Apple Silicon, whisper-cpp provides 15-20x faster transcription:

AudioCPU (openai-whisper)Metal GPU (whisper-cpp)
----------------------------------------------------
5 min~5 min~20 sec
30 min~30 min~2 min
60 min~60 min~4 min
# Install for Metal acceleration (recommended)
brew install whisper-cpp

The skill auto-detects and uses Metal when available.

Type / 类型Formats / 格式Processing / 处理方式
---------------------------------------------------
Voice Memos.qta, .m4aApple native (QTA metadata) → Whisper fallback
Audio.mp3, .wav, .aac, .flacWhisper local transcription
Video.mp4, .mov, .mkv, .webmffmpeg extract → Whisper
YouTubeURLsummarize CLI → yt-dlp fallback
BilibiliURLyt-dlp download → Whisper
Text.txt, .mdDirect read, skip transcription
Documents.doc, .docxtextutil convert → process
Structured.json, .csvParse and extract text
iCloudConfigured pathsScheduled sync

Processing Pipeline / 处理流程

Input (File/URL/Text)
        │
        ▼
┌─────────────────────────────────────┐
│     1. Source Detection            │
│     来源识别                        │
│  Voice Memo / URL / File / Text    │
└─────────────────┬───────────────────┘
                  │
                  ▼
┌─────────────────────────────────────┐
│     2. Save Source Metadata        │
│     保存源信息                      │
│  → memory/voice-memos/sources/     │
└─────────────────┬───────────────────┘
                  │
                  ▼
┌─────────────────────────────────────┐
│     3. Transcription               │
│     转录提取                        │
│  Priority: Apple > Text > summarize│
│           > Whisper-local > API    │
└─────────────────┬───────────────────┘
                  │
                  ▼
┌─────────────────────────────────────┐
│     4. Save Raw Transcript         │
│     保存原始转录                    │
│  → memory/voice-memos/transcripts/ │
└─────────────────┬───────────────────┘
                  │
                  ▼
┌─────────────────────────────────────┐
│     5. LLM Deep Processing         │
│     LLM深度整理                     │
│  • Read USER.md & MEMORY.md        │
│  • Clean up spoken language        │
│  • Extract key points & insights   │
│  • Identify TODOs & connections    │
└─────────────────┬───────────────────┘
                  │
                  ▼
┌─────────────────────────────────────┐
│     6. Save Processed Result       │
│     保存处理结果                    │
│  → memory/voice-memos/processed/   │
└─────────────────┬───────────────────┘
                  │
          ┌───────┴───────┐
          ▼               ▼
┌─────────────────┐ ┌─────────────────┐
│ 7a. Apple Notes │ │ 7b. Reminders  │
│ Structured note │ │ Create TODOs   │
│ with #hashtags  │ │ 创建提醒       │
└────────┬────────┘ └────────┬───────┘
         │                   │
         └─────────┬─────────┘
                   ▼
┌─────────────────────────────────────┐
│     8. Update Index                │
│     更新索引                        │
│  → memory/voice-memos/INDEX.md     │
└─────────────────────────────────────┘

Data Structure / 数据结构

memory/voice-memos/           # All data, searchable via memory_search
├── INDEX.md                  # Processing records index / 处理记录索引
├── sources/                  # Original file metadata / 原始文件元数据
│   └── YYYY-MM-DD_xxx.json
├── transcripts/              # Raw transcripts / 原始转录文本
│   └── YYYY-MM-DD_source_title.md
├── processed/                # LLM processed content / LLM处理后内容
│   └── YYYY-MM-DD_source_title.md
└── synced/                   # Sync records / 同步记录
    └── YYYY-MM-DD_source_title.json

Apple Notes Output Format / 输出格式

The skill reads USER.md, SOUL.md, and MEMORY.md to provide personalized analysis:

  • Deep insights tailored to user's research/work focus
  • Connections to active projects and ongoing interests
  • Actionable recommendations based on user's decision style
  • Critical thinking that challenges assumptions

处理时会读取 USER.mdSOUL.mdMEMORY.md 提供个性化分析

  • 结合用户研究/工作重点的深度洞察
  • 与活跃项目和持续关注领域的关联
  • 基于用户决策风格的行动建议
  • 挑战假设的批判性思考
🎙️ [Auto-generated Title / 智能生成的标题]

📅 Date | ⏱️ Duration | 👤 Source
🏷️ #tag1 #tag2 #tag3

━━━━━━━━━━━━━━━━━━━━━━

📌 Summary / 核心摘要
[One paragraph summarizing the content]

🎯 Key Points / 关键要点
• Point 1
• Point 2
• Point 3

💡 Deep Analysis & Reflection (For User) / 深度分析与反思
[Personalized analysis connecting to user's:
 - Current research directions (from MEMORY.md)
 - Active projects and interests (from USER.md)
 - Decision-making style and preferences
 - Critical counter-arguments and blind spots]

📋 Action Items / 行动建议
☐ Research: [specific to user's academic work]
☐ Business: [relevant to startup/investment focus]
☐ Content: [ideas for courses/articles]

🔗 Related Connections / 相关联系
• Connection to [project/memory]
• Recommended reading/research

💬 Notable Quotes / 金句摘录
• "Quote 1"
• "Quote 2"

━━━━━━━━━━━━━━━━━━━━━━

📝 Original Transcript (Cleaned) / 原始转录(已整理)
[Full transcript text, cleaned up from spoken language / 完整转录,已整理口语表达]

QTA File Format / QTA文件格式 (Technical Reference)

Apple Voice Memos on iOS/macOS 14+ uses .qta (QuickTime Audio) files that embed native transcription directly in the file metadata.

Structure

QTA File
├── ftyp (file type marker: "qt  ")
├── wide (extended marker)
├── mdat (audio data, typically 90%+ of file size)
└── moov (metadata container)
    ├── mvhd (movie header)
    └── trak (one or more tracks)
        ├── tkhd (track header)
        ├── mdia (media data)
        └── meta (metadata - TRANSCRIPTION HERE!)
            ├── hdlr (handler: "mdta")
            ├── keys (key list: "com.apple.VoiceMemos.tsrp")
            └── ilst (data list)
                └── data (JSON transcription payload)

Transcription JSON Format

{
  "locale": {"identifier": "zh-Hans_GB", "current": 1},
  "attributedString": {
    "runs": ["字",0,"符",1,"转",2,"录",3,...],
    "attributeTable": [
      {"timeRange": [0.0, 0.5]},
      {"timeRange": [0.5, 0.8]},
      ...
    ]
  }
}

Key Points:

  • runs array alternates: [text, index, text, index, ...]
  • attributeTable provides timestamps for each character
  • JSON is embedded raw in the ilst/data atom
  • Use extract-apple-transcript.py to reliably extract

Extraction Script

# Extract plain text
python3 scripts/extract-apple-transcript.py recording.qta

# Extract with metadata (JSON output)
python3 scripts/extract-apple-transcript.py recording.qta --json

# Extract with timestamps
python3 scripts/extract-apple-transcript.py recording.qta --json --with-timestamps

Common Issues

IssueCauseSolution
------------------------
"未找到转录数据"Recording still processingWait 1-2 min, or use Whisper
"转录标记存在但数据不完整"Partial transcriptionUse Whisper fallback
JSON parse errorCorrupted fileTry Whisper transcription

Location / 位置: ~/.openclaw/workspace/config/voice-memo-sync.yaml

sources:
  voice_memos:
    enabled: true
    path: "~/Library/Group Containers/group.com.apple.VoiceMemos.shared/Recordings/"
  icloud:
    enabled: true
    paths:
      - "~/Library/Mobile Documents/com~apple~CloudDocs/Recordings"
      - "~/Library/Mobile Documents/com~apple~CloudDocs/Meeting Recordings"
    watch_patterns: ["*.m4a", "*.mp3", "*.mp4", "*.wav", "*.mov"]

transcription:
  # Priority order / 优先级顺序
  priority: ["apple", "text", "summarize", "whisper-local"]
  whisper_model: "small"  # tiny/small/medium/large
  language: "auto"        # auto/zh/en/ja/ko/...

notes:
  folder: "Voice Memos"   # Apple Notes folder name
  include_quotes: true
  include_original: true

reminders:
  enabled: true
  list: "Reminders"
  auto_create: true

Scripts / 脚本

ScriptPurpose / 用途Usage / 用法
--------------------------------------
install.shInitialize setup./install.sh
process.shUnified processing./process.sh
extract-apple-transcript.pyExtract Apple native transcriptionpython3 extract-apple-transcript.py
create-apple-note.shCreate Apple Notes./create-apple-note.sh <content></code></td></tr><tr><td><code>sync-icloud-recordings.sh</code></td><td>Sync iCloud directory</td><td><code>./sync-icloud-recordings.sh</code></td></tr></tbody></table><hr><h2>Agent Processing Guide / Agent处理指南</h2><p>When user sends audio/video or URL, follow these steps: </p><p>当用户发送音视频或URL时,按以下步骤处理:</p><h3>Step 1: Detect Input Type / 识别输入类型</h3><pre><code>YouTube URL → summarize extract Bilibili URL → yt-dlp download + whisper .qta/.m4a → Apple transcript extraction Other audio/video → whisper transcription .txt/.md file → direct read .doc/.docx → textutil convert </code></pre><h3>Step 2: Save Source Info / 保存源信息</h3><pre><code># Record to memory/voice-memos/sources/ echo '{"input":"...", "type":"...", "date":"YYYY-MM-DD"}' > sources/xxx.json </code></pre><h3>Step 3: Get/Save Transcript / 获取保存转录</h3><pre><code># Save to memory/voice-memos/transcripts/YYYY-MM-DD_source_title.md # Include: source info + full raw transcript </code></pre><h3>Step 4: LLM Deep Processing / LLM深度整理</h3><pre><code>Read USER.md and MEMORY.md, combining user context. **MODE SELECTION (Auto-detect or Manual Override) / 模式选择:** ┌─────────────────────────────────────────────────────────────────┐ │ Mode A: Solo Memo (Default) / 短语音 │ │ Trigger: < 5 min, single speaker, casual │ │ Output: Clean text + Key points + TODOs + Connections │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ Mode B: Deep Meeting / 深度会议 │ │ Trigger: 15-60 min, multi-speaker with labels │ │ Output: │ │ 1. Executive Summary (1 paragraph) │ │ 2. Chronological Detail by time blocks │ │ 3. Debate Flow (who said what, conflicts) │ │ 4. Decision Matrix (Issue → Decision → Rationale) │ │ 5. Action Items with owners │ │ 6. Vital Quotes (preserve Voice) │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ Mode C: Lecture / Talk / 讲座模式 (NEW) │ │ Trigger: Single speaker, 30min-3hr, structured presentation │ │ Output: │ │ 1. Executive Summary (1 paragraph) │ │ 2. **Argument Structure (论点层级)**: │ │ - Core Thesis (核心论点) │ │ - Supporting Arguments (分论点 1, 2, 3...) │ │ - Key Evidence/Examples for each argument │ │ - Counter-arguments addressed (if any) │ │ 3. Key Definitions (关键定义/概念) │ │ 4. Notable Quotes (金句, with timestamps if available) │ │ 5. Connections to User's Work (个人关联) │ │ 6. Questions Raised / Gaps (讲座未解决的问题) │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ Mode D: Lecture + Q&A / 讲座+问答 (NEW) │ │ Trigger: First part monologue, second part Q&A │ │ Output: │ │ **Part I: Lecture Section** (use Mode C structure) │ │ **Part II: Q&A Section** │ │ - Group questions by theme/topic (not chronological) │ │ - Format: Q1 → A1 (summary), Q2 → A2... │ │ - Highlight: Best Questions, Surprising Answers │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ Mode E: Long-form No-Speaker-Label / 超长无标注会议 (NEW) │ │ Trigger: > 90 min, NO speaker diarization (text is a blob) │ │ Strategy: │ │ 1. **Chunking**: Split into ~30min segments for processing │ │ 2. **Topic Detection**: Identify topic shift points │ │ (Don't force time blocks; use semantic breaks) │ │ 3. **Abandon Attribution**: Don't guess who said what │ │ Output: │ │ 1. Executive Summary │ │ 2. **Topic Blocks** (not time blocks): │ │ - Topic 1: [Summary] + [Key points] + [Quotes] │ │ - Topic 2: ... │ │ 3. Unresolved Issues / Open Questions │ │ 4. Action Items (may lack owners) │ │ 5. Full Cleaned Transcript (appended or linked) │ └─────────────────────────────────────────────────────────────────┘ **TWO-PASS PROCESSING for Long Content (> 60 min):** - Pass 1 (Quick Scan): Identify structure type, speaker presence, topic shifts - Pass 2 (Deep Process): Apply appropriate mode to each segment **OUTPUT DENSITY LEVELS (User can request):** - Level 1: Executive Only (1 page, for busy stakeholders) - Level 2: Structured Summary (5-10 pages, default) - Level 3: Full Annotated Transcript (everything, with margin notes) </code></pre><h3>Step 5: Save Processed Result / 保存处理结果</h3><pre><code># Save to memory/voice-memos/processed/YYYY-MM-DD_source_title.md </code></pre><h3>Step 6: Sync to Apple Notes (MANDATORY) / 同步到Apple Notes(必须执行)</h3><p>⚠️ <strong>CRITICAL: This step is MANDATORY. Never skip it.</strong> </p><p>⚠️ <strong>关键:此步骤必须执行,不可跳过。</strong></p><p>⚠️ <strong>Apple Notes requires HTML format, NOT Markdown!</strong> </p><p>⚠️ <strong>Apple Notes 需要 HTML 格式,不能直接用 Markdown!</strong></p><p><strong>Correct workflow / 正确流程:</strong></p><pre><code># 1. Convert Markdown to HTML using pandoc (REQUIRED) pandoc /path/to/processed.md -f markdown -t html -o /tmp/note-content.html # 2. Create note with HTML content via AppleScript osascript <<'EOF' set htmlContent to do shell script "cat /tmp/note-content.html" set noteTitle to "🎙️ Note Title" tell application "Notes" set folderName to "Voice Memos" set targetFolder to missing value repeat with f in folders if name of f is folderName then set targetFolder to f exit repeat end if end repeat if targetFolder is missing value then make new folder with properties {name:folderName} delay 1 set targetFolder to folder folderName end if tell targetFolder make new note with properties {name:noteTitle, body:htmlContent} end tell end tell EOF </code></pre><p><strong>Common mistakes to avoid / 常见错误:</strong></p><ul><li>❌ Writing raw Markdown to Apple Notes → 乱码/格式错误</li><li>❌ Using <code>memo notes -a</code> interactively → 无法自动化</li><li>❌ Skipping this step entirely → 其他设备看不到</li><li>✅ Always convert MD → HTML via pandoc first</li><li>✅ Always verify the note was created successfully</li></ul><h3>Step 7: Create Reminders / 创建提醒</h3><pre><code>remindctl add --title "TODO" --list "Reminders" --due "YYYY-MM-DD" </code></pre><h3>Step 8: Update INDEX.md / 更新索引</h3><pre><code># Append record to memory/voice-memos/INDEX.md </code></pre><hr><h2>Privacy / 隐私说明</h2><p>⚠️ <strong>Privacy-First Design:</strong></p><ul><li>All transcription runs locally by default / 所有转录默认在本地完成</li><li>Apple native transcripts extracted from local files / Apple原生转录从本地文件提取</li><li>Whisper runs locally / Whisper在本地运行</li><li>No data sent to external servers (unless user explicitly configures external API)</li><li>User data stored only in local memory directory</li></ul><hr><h2>Troubleshooting / 故障排除</h2><h3>Whisper not found</h3><pre><code>brew install openai-whisper </code></pre><h3>yt-dlp download fails</h3><pre><code># Update yt-dlp brew upgrade yt-dlp # Or use proxy export ALL_PROXY=http://127.0.0.1:7890 </code></pre><h3>Apple Notes folder not created</h3><pre><code># Manually create via AppleScript osascript -e 'tell application "Notes" to tell account "iCloud" to make new folder with properties {name:"Voice Memos"}' </code></pre><h3>Transcription quality issues</h3><pre><code># Use larger model for better accuracy # Edit config: whisper_model: "medium" or "large" </code></pre><hr><h2>Changelog / 更新日志</h2><h3>v1.6.1 (2026-03-09)</h3><ul><li><strong>CRITICAL FIX</strong>: Apple Notes sync step marked as MANDATORY (不可跳过).</li><li><strong>FORMAT FIX</strong>: Explicit requirement to convert Markdown → HTML via pandoc before syncing.</li><li>Added complete AppleScript template with folder creation.</li><li>Common mistakes checklist to prevent format issues.</li></ul><h3>v1.6.0 (2026-03-09)</h3><ul><li><strong>QTA Format Documentation</strong>: Added detailed technical reference for Apple's QTA file format.</li><li><strong>Enhanced extract-apple-transcript.py v1.1</strong>: Improved JSON boundary detection, better error diagnostics, timestamp extraction support.</li><li>Added <code>--with-timestamps</code> option for detailed time-aligned output.</li><li>Better handling of large files (>100MB).</li></ul><h3>v1.5.0 (2026-03-09)</h3><ul><li>Added Mode C: Lecture/Talk (single speaker, argument structure extraction).</li><li>Added Mode D: Lecture + Q&A (hybrid processing).</li><li>Added Mode E: Long-form No-Speaker-Label (> 90min, topic-based chunking).</li><li>Introduced Two-Pass Processing for content > 60 min.</li><li>Added Output Density Levels (Executive / Structured / Full Annotated).</li></ul><h3>v1.4.0 (2026-03-09)</h3><ul><li>Introduced "Deep Meeting Mode" for content > 15min or multi-speaker.</li><li>Preserves information density for critical discussions/interviews.</li><li>New structure: Executive Summary + Chronological Detail + Debate Flow + Decision Matrix.</li><li>Explicit attribution of quotes and arguments.</li></ul><h3>v1.2.0 (2026-03-08)</h3><ul><li>Added unified processing script process.sh / 新增统一处理脚本</li><li>Added installation script install.sh / 新增安装脚本</li><li>Unified data storage to memory/voice-memos/ / 统一数据存储</li><li>Added .doc/.docx/.json/.csv support / 新增文档格式支持</li><li>Bilingual SKILL.md / 中英双语SKILL.md</li><li>Improved INDEX.md auto-update / 完善索引自动更新</li></ul><h3>v1.1.0 (2026-03-08)</h3><ul><li>Added iCloud directory sync / 新增iCloud目录同步</li><li>Added YouTube/Bilibili support / 新增YouTube/B站支持</li><li>Added text file processing / 新增文本文件处理</li></ul><h3>v1.0.0 (2026-03-08)</h3><ul><li>Initial release / 初始版本</li><li>Apple Voice Memos transcription / Apple语音备忘录转录</li><li>Apple Notes sync / Apple Notes同步</li></ul></div> </div> </div> <div id="tab-versions" class="detail-content"> <div class="detail-section"> <h2>版本历史</h2> <p style="margin-bottom:12px;font-size:14px;color:#94a3b8;">共 2 个版本</p> <ul class="version-list"> <li> <div> <span class="version-tag">v1.6.0</span> </div> <div style="font-size:12px;color:#94a3b8;"> 2026-03-31 03:30 </div> </li> <li> <div> <span class="version-tag">v1.6.1</span> <span style="font-size:11px;color:#5b6abf;margin-left:8px;background:#eef0ff;padding:1px 8px;border-radius:10px;">当前</span> </div> <div style="font-size:12px;color:#94a3b8;"> 2026-03-19 01:42 安全 安全 </div> </li> </ul> </div> </div> <div id="tab-security" class="detail-content"> <div class="detail-section"> <h2>安全检测</h2> <div class="sec-grid"> <div class="sec-card"> <h4>腾讯云安全 (Keen)</h4> <div class="sec-status sec-safe"> 安全,无风险 </div> <a href="https://tix.qq.com/search/skill?keyword=709fcb903d71d3466d4e1ae54f4987fa" target="_blank">查看报告</a> </div> <div class="sec-card"> <h4>腾讯云安全 (Sanbu)</h4> <div class="sec-status sec-safe"> 安全,无风险 </div> <a href="https://static.cloudsec.tencent.com/html-report-v2/2026/05/25/407565_f4f27d8db4cd35e449681c3d6a592883.html?q-sign-algorithm=sha1&q-ak=AKID8JMG1bzBC1dz96qNhssfFftujT1NCoFi&q-sign-time=1781297186%3B1812833186&q-key-time=1781297186%3B1812833186&q-header-list=host&q-url-param-list=&q-signature=ebf32724ca2c8fdc1f73542a21819088240710e8" target="_blank">查看报告</a> </div> </div> </div> </div> <!-- Recommended Skills --> <div style="margin-top:24px;"> <h2 style="font-size:18px;font-weight:600;margin-bottom:16px;">🔗 相关推荐</h2> <div class="rec-grid"> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">content-creation</span> <h3><a href="/s/humanizer">Humanizer</a></h3> <div class="rec-owner">biostartechnology</div> <div class="rec-desc">消除AI写作痕迹,使文本更自然真实。基于维基百科"AI写作特征"指南,识别并修正夸张象征、宣传用语、肤浅-ing分析、模糊归因、破折号滥用、三项排比、AI词汇、负面平行结构及冗长连接词等模式。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 860</span> <span style="color:#5b6abf;">📥 199,662</span> </div> </div> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">content-creation</span> <h3><a href="/s/youtube-api-skill">YouTube</a></h3> <div class="rec-owner">byungkyu</div> <div class="rec-desc">使用托管OAuth集成YouTube Data API,支持搜索视频、管理播放列表、获取频道数据及评论互动,适用于用户需要时使用此技能。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 142</span> <span style="color:#5b6abf;">📥 41,049</span> </div> </div> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">content-creation</span> <h3><a href="/s/ai-ppt-generator">Baidu Wenku AIPPT</a></h3> <div class="rec-owner">ide-rea</div> <div class="rec-desc">使用百度文库 AI 智能生成 PPT,自动根据内容选择模板。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 66</span> <span style="color:#5b6abf;">📥 46,173</span> </div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded',function(){ document.querySelectorAll('.detail-tab').forEach(function(btn){ btn.addEventListener('click',function(e){ var tab = this.getAttribute('data-tab'); document.querySelectorAll('.detail-tab').forEach(function(b){b.classList.remove('active')}); document.querySelectorAll('.detail-content').forEach(function(c){c.classList.remove('active')}); this.classList.add('active'); var el = document.getElementById('tab-'+tab); if(el) el.classList.add('active'); }); }); }); </script> <div class="footer"> <p>Skill工具集 © 2026</p> </div></body> </html>