关于 wispr-analytics
Wispr Analytics 是一组用于分析本地 SQLite 数据库中 Wispr Flow 听写历史的技能与脚本,涵盖使用统计、文本反思、保留音频的韵律分析和词典管理。
主要功能
- 01按日期范围提取听写记录
- 02分析使用指标与文本样本
- 03对比周期并生成图表面板
- 04分析保留音频的韵律
- 05检查和管理词典条目
适用场景
- 01查看一周内的听写活动
- 02根据听写样本反思工作模式
- 03比较不同时段的使用趋势
- 04查找词典词条和文本片段候选
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ glebis/ claude-skills --skill wispr-analytics安装后在 Claude Code 中输入/wispr-analytics确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.claude-plugin/plugin.jsonreferences/analysis-prompts.mdscripts/extract_prosody.pyextract_wispr.pywispr_dictionary.py详细介绍
Wispr Analytics
从本地 SQLite 数据库中提取并分析 Wispr Flow 听写历史。将定量指标与大模型驱动的定性分析相结合,用于自我反思、识别工作模式和关注心理健康。
数据源
Wispr Flow 将所有听写内容存储在以下 SQLite 数据库中:
~/Library/Application Support/Wispr Flow/flow.sqlite
关键数据表:History,包含字段:formattedText、timestamp、app、numWords、duration、speechDuration、detectedLanguage、isArchived。
用户自 2025 年 2 月以来已有约 8,500 条以上听写记录,使用俄语和英语双语,涉及的应用包括:iTerm2、ChatGPT、Arc 浏览器、Claude Desktop、Windsurf、Telegram、Obsidian、Perplexity。
提取脚本
运行 scripts/extract_wispr.py 从数据库中提取数据:
# Get today's data as JSON with stats + text samples
python3 scripts/extract_wispr.py --period today --mode all --format json
# Get markdown stats for the last week
python3 scripts/extract_wispr.py --period week --format markdown
# Get text samples only for LLM analysis
python3 scripts/extract_wispr.py --period month --mode mental --texts-only
# Save to file
python3 scripts/extract_wispr.py --period week --format markdown --output /path/to/output.md
时段选项
today—— 当天(默认)yesterday—— 前一天week—— 过去 7 天month—— 过去 30 天YYYY-MM-DD—— 指定日期YYYY-MM-DD:YYYY-MM-DD—— 日期范围
模式选项
all—— 完整分析(默认)technical—— 筛选编码/AI 工具相关的听写内容soft—— 筛选沟通/写作相关的听写内容trends—— 重点分析数量/频率模式mental—— 分析所有文本,并以促进身心健康反思的方式呈现prosody—— 基于音频:从录制的 WAV 中分析音高/强度/语音质量(使用独立脚本scripts/extract_prosody.py;仅适用于近期听写内容)。请参阅下文的“韵律模式”。
对比与图表
--compare—— 自动与等长的前一时段进行对比(本周与上周对比,本月与上月对比)--graphs PATH—— 生成包含 Chart.js 图表的 HTML 仪表板(隐含启用--compare)。图表包括:每日词数叠加图、每小时活动、类别细分、使用频率最高的应用、语言分布
# Compare this month vs previous month (markdown)
python3 scripts/extract_wispr.py --period month --compare --format markdown
# Generate visual dashboard for week comparison
python3 scripts/extract_wispr.py --period week --compare --graphs /tmp/wispr-week.html
# Compare and save both markdown + graphs
python3 scripts/extract_wispr.py --period month --compare --format markdown --output report.md --graphs report.html
韵律模式(基于音频)
这是一种独立的分析模式,与 technical/soft/trends/mental 同级,分析听写内容的说话方式,而不仅仅是说了什么。它会读取存储在 History.audio 中的录制 WAV 音频,并通过 Praat(经由 parselmouth)提取韵律特征,作为温和的情绪/精力代理指标,用于自我反思。请使用专用脚本 scripts/extract_prosody.py 运行。
依赖项
pip install praat-parselmouth
librosa/scipy/soundfile 可作为替代方案,但脚本使用 parselmouth(Praat)作为首选标准。
音频保留注意事项(请先阅读)
Wispr 仅保留近期听写内容的录制音频——约为 16,000 多条历史记录中最近的 900 条。较早记录的 audio 数据块会在上传后被清除(而 builtInAudio 始终为空)。因此,韵律分析仅适用于近期听写内容;较早时段的音频已丢失,只能恢复基于时间的指标(语速、停顿)。脚本会如实呈现这一情况:每份报告开头都会显示覆盖情况(此时段的 X 条听写中有 Y 条保留了音频),并在 --limit 限制覆盖范围时记录日志。
测量内容
- 音高(F0):通过 Praat
to_pitch()获取,忽略无声帧;包括均值、中位数、最小值、最大值、范围、标准差,以及作为单调 <-> 富于表现力代理指标的 CV(标准差/均值)。 - 强度(dB):均值、范围、标准差——表示响度变化。
- 语音质量:抖动(局部)、闪烁(局部)和 HNR(谐噪比)。通过 try/except 计算——处理失败的短音频/噪声音频会被跳过并计数(
feature_failures)。 - 节奏(来自数据库中的计时列,而非音频):语速
numWords / (speechDuration/60)WPM,以及停顿比例(duration - speechDuration)/duration(下限设为 >= 0)。 - 按语言拆分(俄语与英语的 F0/语速不同——分开统计,避免双语混合模糊信号),以及多日时段的每日趋势表。
命令
# Prosody report for the last week (text)
python3 scripts/extract_prosody.py --period week
# Last month as JSON
python3 scripts/extract_prosody.py --period month --format json
# Specific day, raise the clip cap so coverage isn't truncated
python3 scripts/extract_prosody.py --period 2026-06-11 --limit 600
# Save to a file
python3 scripts/extract_prosody.py --period week --output /tmp/prosody-week.md
参数:--period(与 extract_wispr.py 语义相同:today/yesterday/week/month/YYYY-MM-DD/YYYY-MM-DD:YYYY-MM-DD)、--format text|json、--limit N(限制处理的片段数量,默认值为 300,以限制运行时间;截断时会向 stderr 写入日志)、--output PATH。数据库将严格以只读模式打开(mode=ro&immutable=1)。
性能:对 300 个片段进行音频分析约需 15–20 秒(比 SQL 慢)。默认的 --limit 300 可让单次运行保持快速;繁忙时段需要完整覆盖时,可提高此值。
合理性预期
Gleb 为男性,因此平均 F0 预计约为 95–150 Hz(观察到的值约为 120 Hz)。按语言拆分时,俄语通常表现出略高于英语的 F0 和 CV。F0 CV 通常为 0.2–0.3。
与心理模式的关联
韵律分析通过声学情感/能量指标补充基于文本的 mental 模式,并采用相同的呈现方式——邀请用户进行自我反思,而非给出诊断:
- F0 CV(音高变化度)可作为投入度/表达力指标:较平缓可能表示疲倦/偏事务性,变化较丰富则可能表示更有活力。
- 语速和停顿比例可作为能量/认知负荷指标。
- HNR 降低可能反映声音疲劳或紧张。
声学特征也会受到麦克风、房间、感冒和语言的影响——因此务必说明这种不确定性,并进行同类比较(相同语言,与用户近期的基线比较)。完整的解读提示词请参阅 references/analysis-prompts.md 中的 Prosody Mode 模板。
工作流
步骤 1:提取数据
使用请求的时段和模式运行提取脚本。需要完整数据时使用 --format json;侧重 LLM 分析时使用 --texts-only。
步骤 2:呈现定量统计数据
首先显示定量摘要:
- 听写总数、字数、语音时长
- 类别细分(coding、ai_tools、communication、writing、other)
- 语言分布
- 每小时活动模式
- 每日趋势(针对多日时段)
- 常用应用
步骤 3:进行定性分析
读取 references/analysis-prompts.md,加载适用于请求模式的分析模板。然后使用该模板分析文本样本。
针对每种模式:
Technical:关注处理的工作、技术决策、上下文切换模式和生产力评估。
Soft:关注沟通风格变化、语言切换模式、受众适配和人际互动。
Trends:关注数量变化、时段变化、应用迁移和行为变化假设。
Mental:关注能量指标、情绪信号、反刍检测和活动模式变化。所有观察都应表达为自我反思的邀请,绝不可作为诊断。使用“你可能会注意到……”或“这种模式可能表明……”之类的措辞。
All:结合全部四个视角,形成统一的反思。
步骤 4:输出
默认输出位置:知识库中的 meta/wispr-analytics/YYYYMMDD-period-mode.md。
文件格式:
---
created_date: '[[YYYYMMDD]]'
type: wispr-analytics
period: [period description]
mode: [mode]
---
# Wispr Flow Analytics: [period]
## Quantitative Summary
[stats from Step 2]
## Analysis
[qualitative analysis from Step 3]
## Reflection Prompts
[3-5 questions based on observations]
如果用户要求仅输出到控制台,则跳过文件创建并直接显示。
应用类别映射
提取脚本会对应用进行分类:
- coding:iTerm2、cmuxterm、VS Code、Windsurf、Zed、Cursor、Terminal
- ai_tools:ChatGPT、Claude Desktop、Perplexity、OpenAI Atlas、Codex
- communication:Telegram、Messages、Slack、Zoom
- writing:Obsidian、Notes、Chrome、Arc browser
词典管理
管理 Wispr Flow 的词典,以提高识别准确率。词典 JSON 在 ~/ai_projects/claude-skills/wispr-analytics/data/dictionary.json 中进行版本控制。
词典脚本
运行 scripts/wispr_dictionary.py 执行所有词典操作:
# Check database health and dictionary stats
python3 scripts/wispr_dictionary.py check
# List all entries (safe while Wispr is running)
python3 scripts/wispr_dictionary.py list
python3 scripts/wispr_dictionary.py list --filter "claude"
# Export dictionary to JSON (safe while running)
python3 scripts/wispr_dictionary.py export
# Suggest new entries by analyzing ASR vs formatted text differences
python3 scripts/wispr_dictionary.py suggest --days 30 --min-freq 3
# Propose snippets + replacement rules + vocab from dictation logs (safe while running)
python3 scripts/wispr_dictionary.py propose --days 30 --min-freq 3
python3 scripts/wispr_dictionary.py propose --days 90 --min-freq 2 --format json
# Add a single term (requires Wispr Flow to be QUIT)
python3 scripts/wispr_dictionary.py add "Gastown"
python3 scripts/wispr_dictionary.py add "cloud code" "Claude Code"
# Remove an entry (requires Wispr Flow to be QUIT)
python3 scripts/wispr_dictionary.py remove "old term"
# Import from JSON (requires Wispr Flow to be QUIT)
python3 scripts/wispr_dictionary.py import --dry-run
python3 scripts/wispr_dictionary.py import
词典安全规则
重要:执行任何写入操作(添加、移除、导入)前,必须退出 Wispr Flow。脚本会自动执行此检查。读取操作(导出、列出、建议、检查)可在 Wispr 运行时安全执行。
Wispr Flow 打开数据库时向 SQLite 数据库写入内容会导致索引损坏。请务必:
- 检查 Wispr 是否正在运行:
pgrep -f "Wispr Flow" - 如果正在运行,请先让用户退出(Cmd+Q)
- 写入后,运行
check验证完整性 - 重启 Wispr Flow
词典条目类型
- 识别词条(仅短语):教 Wispr 正确识别这个词(例如,“Gastown”、“LLM”、“subagent”)
- 替换规则(短语 → 替换内容):自动纠正识别错误(例如,“cloud code” → “Claude Code”,“клод дизайн” → “Claude Design”)
- 文本片段(isSnippet=true):文本扩展快捷方式(例如,“my email” → “[email protected]”)
提议替换规则和文本片段
suggest 只能捕捉 ASR 识别错误。propose 则进行范围更广、更贴近人工审阅的检查:
它会读取近期听写日志,并按三种
类别提议添加词典条目,同时跳过词典中已有的内容。它是只读的,
可在 Wispr Flow 运行时安全使用——绝不会写入数据库。
# Default: last 30 days, terms seen >= 3 times
python3 scripts/wispr_dictionary.py propose
# Wider net, machine-readable
python3 scripts/wispr_dictionary.py propose --days 90 --min-freq 2 --format json
标志:--days(历史记录时间范围)、--min-freq(最少出现次数)、--format
(默认为 text,也可用 json)。
三种类别:
- 文本片段候选项(收益最高、利用最少):反复出现的网址、
邮箱和电话号码,以及重复使用的固定句子/开场白/结束语
(至少 8 个词,按规范化的逐字频率计数)。每项提议都包含一个
简短的
My X触发短语,以及完整的扩展内容。 - 替换规则候选项:反复出现的 ASR 识别错误(通过
find_mishearshelper 与suggest共用代码)。 - 词汇候选项:频繁听写的首字母大写/技术术语
(例如
HTML、LinkedIn、SDK),这些词可能会被错误识别——教 Wispr 正确拼写。
每项提议都会显示出现频次,并提供可直接运行的 add 命令行。
文本片段是收益最高、利用最少的词典功能。
每月有 1,600 多次听写的用户,往往只有少数几个文本片段。添加一个
My GitHub → 网址文本片段,就能省去数十次听写(和错误听写)网址的麻烦。
务必优先展示文本片段候选项。
建议的工作流
- 运行分析(
extract_wispr.py),了解听写量以及文本片段能发挥作用的地方。 - 运行
propose(Wispr 运行时也可安全使用)。 - 向用户展示分组后的提议——先展示文本片段,再展示替换规则, 最后展示词汇。强调文本片段带来的显著收益。
- 用户批准后,退出 Wispr Flow(Cmd+Q),运行已批准的
add命令(文本片段需使用add "My X" "expansion")。 - 运行
python3 scripts/wispr_dictionary.py check验证完整性。 - 重启 Wispr Flow。
主动改进词典的工作流
运行分析时,也要检查是否有改进词典的机会:
- 运行
propose,一次性找出文本片段、替换规则和词汇 (或者运行suggest,仅查找识别错误) - 对比
asrText与formattedText,查找规律 - 留意俄语/英语切换时的识别错误
- 检查用户是否开始使用新的技术术语
- 导出更新后的词典并提交到 git
备注
- 分析时:数据库为只读;分析过程绝不会修改 Wispr 数据
- 词典操作:写入前必须先退出 Wispr Flow
- 每次提取最多保留 100 条文本样本,以控制上下文窗口
- 分析多日时段时,按日趋势表有助于直观展示变化
- 双语听写很常见;分析时应兼顾俄语和英语
asrText字段包含格式化前的原始语音识别结果——可用于检测语音模式与格式化输出之间的差异- 词典 JSON 存储在
~/ai_projects/claude-skills/wispr-analytics/data/dictionary.json,用于版本控制