mcpField
W
wispr-analytics

wispr-analytics

github.com/glebis生産性401213 回インストール1 日前に更新
リポジトリ

wispr-analytics について

Wispr Analytics は、ローカルの SQLite データベースにある Wispr Flow のディクテーション履歴を分析するスキルとスクリプトです。利用統計やテキスト分析、保持音声の韻律分析、辞書管理を行います。

主な機能

  1. 01期間を指定した履歴の抽出
  2. 02利用指標とテキストサンプルの分析
  3. 03期間比較とグラフダッシュボード作成
  4. 04保持音声の韻律分析
  5. 05辞書項目の確認と管理

活用シーン

  1. 011週間のディクテーション活動の確認
  2. 02ディクテーションから作業パターンを振り返る
  3. 03期間ごとの利用傾向の比較
  4. 04辞書用語やスニペット候補の発見

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/glebis/claude-skills --skill wispr-analytics

インストール後、Claude Code で/wispr-analyticsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

.claude-plugin/
plugin.json
references/
analysis-prompts.md
scripts/
extract_prosody.py
extract_wispr.py
wispr_dictionary.py

詳細

Wispr Analytics

ローカルの SQLite データベースから Wispr Flow のディクテーション履歴を抽出して分析します。定量的な指標と LLM を活用した定性的な分析を組み合わせ、自己を振り返り、仕事のパターンを認識し、メンタルヘルスへの意識を高めるのに役立ちます。

データソース

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 browser、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 blob はアップロード後に削除されます(builtInAudio は常に空です)。そのため、プロソディを利用できるのは最近のディクテーションのみです。古い期間の音声は失われており、タイミングに基づく指標(速度、一時停止)だけが取得可能です。スクリプトはこの点を正確に示します。すべてのレポートはカバレッジ行(「この期間の X 件のディクテーションのうち、Y 件で音声が保持されていました」)から始まり、--limit によってカバレッジが制限される場合はログに記録します。

測定項目
  • ピッチ(F0):Praat の to_pitch() を使用し、有声でないフレームは無視します。平均、中央値、最小、最大、範囲、標準偏差、および単調さと表現力の指標となる CV(標準偏差/平均) を算出します。
  • 強度(dB):平均、範囲、標準偏差。音量の変化を示します。
  • 音声品質:ジッター(局所)、シマー(局所)、および HNR(調波対雑音比)。try/except で計算します。失敗した短いクリップやノイズの多いクリップはスキップされ、件数が記録されます(feature_failures)。
  • テンポ(音声ではなく DB のタイミング列から算出):発話速度は 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で、実行時間を抑えます。クリップ数を制限した場合は標準エラー出力にログを記録します)、--output PATH。DBは厳密に読み取り専用で開きます(mode=ro&immutable=1)。

パフォーマンス:音声分析には300クリップで約15~20秒かかります(SQLに比べて低速です)。デフォルトの--limit 300を使うと、1回の実行を短時間で完了できます。忙しい期間のデータをすべて対象にする場合は、値を大きくしてください。

妥当性の確認項目

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つすべての視点を組み合わせ、統合的な振り返りとしてまとめます。

ステップ4:出力する

デフォルトの出力先:Vault内の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 データベースへ書き込むと、インデックスが破損します。必ず次の手順に従ってください。

  1. Wispr が実行中か確認します:pgrep -f "Wispr Flow"
  2. 実行中の場合は、先に終了するようユーザーに依頼します(Cmd+Q)
  3. 書き込み後、check を実行して整合性を確認します
  4. Wispr Flow を再起動します
辞書エントリの種類
  • 認識用語(フレーズのみ):Wispr が単語を正しく聞き取れるように学習させます(例:「Gastown」、「LLM」、「subagent」)
  • 置換ルール(フレーズ → 置換語句):誤認識を自動修正します(例:「cloud code」→「Claude Code」、「клод дизайн」→「Claude Design」)
  • スニペット(isSnippet=true):テキスト展開用のショートカットです(例:「my email」→「[email protected]」)
置換候補とスニペットの提案

suggest は ASR の誤認識のみを検出します。より広範な、人が確認するようなレビューには propose を使います。 最近のディクテーションログを読み取り、すでに辞書にある項目を除外したうえで、3 つの カテゴリに分けて辞書への追加候補を提案します。これは読み取り専用で、 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)。

3 つのカテゴリは次のとおりです。

  1. スニペット候補(効果が最も高く、最も活用されていない項目):繰り返し出現する URL、 メールアドレス、電話番号、および繰り返される定型文や冒頭・締めくくりの文 (8 語以上、正規化した逐語表記の頻度でカウント)。各候補には短い My X のトリガーフレーズと、 展開後の全文が含まれます。
  2. 置換ルール候補:繰り返し発生する ASR の誤認識(find_mishears ヘルパーを介して suggest とコードを共有します)。
  3. 語彙候補:頻繁にディクテーションされる大文字表記の用語や技術用語 (例:HTML、LinkedIn、SDK)のうち、誤認識される可能性があるものです。Wispr に 正しい綴りを学習させます。

各候補には出現頻度と、そのまま実行できる add コマンドラインが表示されます。

スニペットは、効果が最も高く、最も活用されていない辞書機能です。 月に 1,600 件以上ディクテーションするユーザーでも、スニペットはほんの数個しか使っていないことがよくあります。 My GitHub → URL のスニペットを 1 つ作るだけで、URL を何十回もディクテーションする(そして誤ってディクテーションする)手間を省けます。スニペット候補を必ず最初に提示してください。

推奨ワークフロー
  1. 分析(extract_wispr.py)を実行し、件数とスニペットの効果が期待できる箇所を把握します。
  2. propose を実行します(Wispr の実行中でも安全です)。
  3. カテゴリごとにまとめた候補をユーザーに提示します。スニペット、置換ルール、語彙の順に並べ、スニペットが大きな効果をもたらすことを伝えます。
  4. ユーザーの承認後、Wispr Flow を終了してから(Cmd+Q)、承認された add の行を実行します(スニペットには add "My X" "expansion" が必要です)。
  5. python3 scripts/wispr_dictionary.py check を実行して整合性を確認します。
  6. Wispr Flow を再起動します。
辞書を積極的に改善するワークフロー

分析を実行する際は、辞書を改善できる機会も確認します。

  1. propose を実行して、スニペット、置換ルール、語彙をまとめて洗い出します (誤認識のみの場合は suggest を実行します)。
  2. パターンを見つけるため、asrText と formattedText を比較します。
  3. ロシア語と英語が切り替わる箇所での誤認識を探します。
  4. ユーザーが使い始めた新しい技術用語がないか確認します。
  5. 更新した辞書をエクスポートし、git にコミットします。

メモ

  • 分析ではデータベースは読み取り専用です。分析によって Wispr のデータが変更されることはありません。
  • 辞書への書き込みは、事前に Wispr Flow を終了しておく必要があります。
  • コンテキストウィンドウを管理するため、テキストサンプルは抽出ごとに最大 100 件です。
  • 複数日にわたる期間では、日別の傾向表を使うと変化を可視化できます。
  • バイリンガルのディクテーションは一般的です。分析ではロシア語と英語の両方を考慮してください。
  • asrText フィールドには、フォーマット処理前の生の音声認識結果が格納されています。音声のパターンとフォーマット済みの出力を見分けるのに役立ちます。
  • 辞書 JSON は、バージョン管理用に ~/ai_projects/claude-skills/wispr-analytics/data/dictionary.json に保存されています。

コメント