From daymade-audio
Corrects speech-to-text transcription errors using dictionary rules and AI-powered analysis. Builds personalized correction databases that learn from each fix. Triggers when working with ASR/STT output containing recognition errors, homophones, garbled technical terms, or Chinese/English mixed content. Also triggers on requests to clean up meeting notes, lecture transcripts, interview recordings, or any text produced by speech recognition. Use this skill even when the user just says "fix this transcript" or "clean up these meeting notes" without mentioning ASR specifically.
How this skill is triggered — by the user, by Claude, or both
Slash command
/daymade-audio:transcript-fixerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Two-phase correction pipeline: deterministic dictionary rules (instant, free) followed by AI-powered error detection. Corrections accumulate in `~/.transcript-fixer/corrections.db`, improving accuracy over time.
references/architecture.mdreferences/best_practices.mdreferences/database_schema.mdreferences/dictionary_guide.mdreferences/example_session.mdreferences/false_positive_guide.mdreferences/file_formats.mdreferences/glm_api_setup.mdreferences/installation_setup.mdreferences/iteration_workflow.mdreferences/quick_reference.mdreferences/script_parameters.mdreferences/sql_queries.mdreferences/team_collaboration.mdreferences/troubleshooting.mdreferences/workflow_guide.mdrequirements.txtscripts/__init__.pyscripts/check_type_hints.pyscripts/cli/__init__.pyTwo-phase correction pipeline: deterministic dictionary rules (instant, free) followed by AI-powered error detection. Corrections accumulate in ~/.transcript-fixer/corrections.db, improving accuracy over time.
What each phase is actually good at (calibration, not a rule): the dictionary shines on recurring errors — product names, common homophones, anything you've corrected before — at zero cost and zero latency. But on a fresh database, on high-quality ASR (e.g. transcripts from a strong engine like Whisper, Otter, or Feishu / Tencent-Meeting), or in specialized domains (finance, medical, legal), the dictionary often matches almost nothing — the errors that remain are proper nouns and domain terms it has never seen. There, the AI pass does essentially all the real work. Treat Stage 1 as a cheap pre-filter for known repeats, not as the primary corrector, and don't be alarmed when it changes only a handful of lines on a clean transcript.
All scripts use PEP 723 inline metadata — uv run auto-installs dependencies. Requires uv (install guide).
# First time: Initialize database
uv run scripts/fix_transcription.py --init
# Single file
uv run scripts/fix_transcription.py --input meeting.md --stage 1
# Batch: multiple files in parallel (use shell loop)
for f in /path/to/*.txt; do
uv run scripts/fix_transcription.py --input "$f" --stage 1
done
After Stage 1, Claude reads the output and fixes remaining ASR errors natively (no API key needed). The full method — triage by confidence, verify-don't-guess, second pass, needs-checking list — is in Native AI Correction below; read that section as the source of truth. For a quick, clean transcript it collapses to: read the whole thing → fix the obvious errors with sed → save reusable patterns to the dictionary.
See references/example_session.md for a concrete input/output walkthrough.
Alternative: API batch processing (for automation without Claude Code):
export GLM_API_KEY="<api-key>" # From https://open.bigmodel.cn/
uv run scripts/fix_transcript_enhanced.py input.md --output ./corrected
Two-phase pipeline with persistent learning:
uv run scripts/fix_transcription.py --init--add "错误词" "正确词" --domain <domain>--input file.md --stage 1 (instant, free)--stage 3 with GLM_API_KEY for API mode--add "错误词" "正确词" after each session--review-learned and --approve high-confidence suggestionsDomains: general, embodied_ai, finance, medical, or custom (e.g., legal, gaming)
Learning: Patterns appearing ≥3 times at ≥80% confidence auto-promote from AI to dictionary
After fixing, always save reusable corrections to dictionary. This is the skill's core value — see references/iteration_workflow.md for the complete checklist.
After native AI correction, review all applied fixes and decide which to save. Use this decision matrix:
| Pattern type | Example | Action |
|---|---|---|
| Non-word → correct term | 克劳锐→Claude, cloucode→Claude Code | ✅ Add (zero false positive risk) |
| Rare word → correct term | 拉行链→LangChain, 哈金费斯→Hugging Face | ✅ Add (verify it's not a real word first) |
| Person/company name ASR error | 卡帕西→Karpathy, Anthropics→Anthropic | ✅ Add (stable, unique) |
| Common word → context word | 争→蒸, affect→effect | ❌ Skip (high false positive risk) |
| Real brand → different brand | Xcode→Claude Code, Clover→Claude | ❌ Skip (real words in other contexts) |
Batch add multiple corrections in one session:
uv run scripts/fix_transcription.py --add "错误1" "正确1" --domain tech
uv run scripts/fix_transcription.py --add "错误2" "正确2" --domain business
# Chain with && for efficiency
Adding wrong dictionary rules silently corrupts future transcripts. Read references/false_positive_guide.md before adding any correction rule, especially for short words (≤2 chars) or common Chinese words that appear correctly in normal text.
When running inside Claude Code, use Claude's own language understanding for Phase 2 — on high-quality ASR this is where almost all the real correction happens. Scale the effort to the transcript. A short, clean recording with no proper nouns (a quick voice memo) just needs steps 1-3 plus one obvious-fix pass; skip the verification / second-pass / subagent / needs-checking machinery below, which earns its keep on long, multi-speaker, domain-heavy, or high-stakes transcripts. Don't turn a 10-second memo into a research project.
their→there where context forces it; 彭波→彭博 when every other mention already reads 彭博). Apply directly (step 5).sed -i '' with multiple -e flagsdiff <original> <your-working-file>) — every change should trace back to a triage decision*_stage1.md → *.md, delete the original .txtcorrected_stage1.md, strip any remaining Stage 1 false positives before finalizingAI product names are frequently garbled. These patterns recur across transcripts:
| Correct term | Common ASR variants |
|---|---|
| Claude | cloud, Clou, calloc, 克劳锐, Clover, color |
| Claude Code | cloud code, Xcode, call code, cloucode, cloudcode, color code |
| Claude Agent SDK | cloud agent SDK |
| Opus | Opaas |
| Vibe Coding | web coding, Web coding |
| GitHub | get Hub, Git Hub |
| prototype | Pre top |
Person names and company names also produce consistent ASR errors across sessions — always add confirmed name corrections to the dictionary.
When fixing multiple files (e.g., 5 transcripts from one day):
-e flags), then per-file context-dependent fixes\n\n at logical topic transitionsUse GLM_API_KEY + Stage 3 for batch processing, standalone usage without Claude Code, or reproducible automated processing.
When the script outputs [CLAUDE_FALLBACK] (GLM API error), switch to native mode automatically.
Timestamp repair:
uv run scripts/fix_transcript_timestamps.py meeting.txt --in-place
Split transcript into sections (rebase each to 00:00:00):
uv run scripts/split_transcript_sections.py meeting.txt \
--first-section-name "intro" \
--section "main::<verbatim line that starts the next section>" \
--rebase-to-zero
Word-level diff (recommended for reviewing corrections):
uv run scripts/generate_word_diff.py original.md corrected.md output.html
*_stage1.md — Dictionary corrections applied*_corrected.txt — Final version (native mode) or *_stage2.md (API mode)*_对比.html — Visual diff (open in browser)Read references/database_schema.md before writing any custom query — the column names are not what you'd guess. The correction columns are from_text / to_text (not wrong_term/correct_term, not original/corrected). Guessing column names is the most common way these queries fail with "no such column".
# Inspect corrections — real column names are from_text, to_text, domain
sqlite3 ~/.transcript-fixer/corrections.db "SELECT from_text, to_text, domain FROM active_corrections;"
# Count rules per domain
sqlite3 ~/.transcript-fixer/corrections.db "SELECT domain, COUNT(*) FROM active_corrections GROUP BY domain;"
# Schema version
sqlite3 ~/.transcript-fixer/corrections.db "SELECT value FROM system_config WHERE key='schema_version';"
| Stage | Description | Speed | Cost |
|---|---|---|---|
| 1 | Dictionary only | Instant | Free |
| 1 + Native | Dictionary + Claude AI (default) | ~1min | Free |
| 3 | Dictionary + API AI + diff report | ~10s | API calls |
Scripts:
fix_transcription.py — Core CLI (dictionary, add, audit, learning)fix_transcript_enhanced.py — Enhanced wrapper for interactive usefix_transcript_timestamps.py — Timestamp normalization and repairgenerate_word_diff.py — Word-level diff HTML generationsplit_transcript_sections.py — Split transcript by marker phrasesReferences (load as needed):
false_positive_guide.md (read before adding rules), database_schema.md (read before DB ops)iteration_workflow.md, workflow_guide.md, example_session.mdquick_reference.md, script_parameters.mddictionary_guide.md, sql_queries.md, architecture.md, best_practices.mdtroubleshooting.md, installation_setup.md, glm_api_setup.md, team_collaboration.mduv run scripts/fix_transcription.py --validate checks setup health. See references/troubleshooting.md for detailed resolution.
After correcting a transcript, if the content is from a meeting, lecture, or interview, suggest structuring it:
Transcript corrected: [N] errors fixed, saved to [output_path].
Want to turn this into structured meeting minutes with decisions and action items?
Options:
A) Yes — run /daymade-audio:meeting-minutes-taker (Recommended for meetings/lectures)
B) Export as PDF — run /daymade-docs:pdf-creator on the corrected text
C) No thanks — the corrected transcript is all I need
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
npx claudepluginhub majuniores/claude-code-skills --plugin daymade-audio