
Whisper Transcribe
- 15 installs
- 1 repo stars
- Updated December 29, 2025
- spillwavesolutions/whisper-transcribe
Helps with ai & agent building tasks during AI-assisted development.
About
whisper-transcribe is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- whisper-transcribe
- AI & Agent Building
- AI-coding skill
Whisper Transcribe by the numbers
- 15 all-time installs (skills.sh)
- +6 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #11,187 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/spillwavesolutions/whisper-transcribe --skill whisper-transcribeAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 15 |
|---|---|
| repo stars | ★ 1 |
| Last updated | December 29, 2025 |
| Repository | spillwavesolutions/whisper-transcribe ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
Whisper Transcribe Skill
Transcribe audio and video files to text using OpenAI's Whisper with contextual grounding from markdown files.
Purpose
Intelligent audio/video transcription that: 1. Converts media files to accurate text transcripts 2. Uses markdown context files to correct technical terms, names, and jargon 3. Handles various audio/video formats (mp3, wav, m4a, mp4, webm, etc.)
When to Use
- User asks to transcribe an audio or video file
- User wants to convert a recording to text
- User mentions "whisper" in context of transcription
- User needs meeting notes or interview transcripts
- User has media files with domain-specific terminology
Installation
macOS (Recommended for MacBook Pro)
# Install via Homebrew (recommended)
brew install ffmpeg openai-whisper
# Verify installation
whisper --versionLinux/pip Installation
# Install ffmpeg first
sudo apt install ffmpeg # Debian/Ubuntu
# or: sudo dnf install ffmpeg # Fedora
# Install Whisper
pip install openai-whisperVerify Installation
whisper --version
ffmpeg -versionTranscription Workflow
Step 1: Identify Media File and Context
1. Locate the audio/video file to transcribe 2. Check for markdown files in the same directory (context files) 3. If no context files exist, optionally create one using assets/context-template.md
Step 2: Run Whisper Transcription
Basic transcription:
whisper "/path/to/audio.mp3" --output_dir "/path/to/output"With model selection (trade-off: speed vs accuracy):
# Fast (less accurate)
whisper "audio.mp3" --model tiny
# Balanced (recommended)
whisper "audio.mp3" --model base
# High quality
whisper "audio.mp3" --model small
# Best quality (slower, requires more RAM)
whisper "audio.mp3" --model medium
whisper "audio.mp3" --model largeWith language specification:
whisper "audio.mp3" --language enOutput format options:
whisper "audio.mp3" --output_format txt # Plain text
whisper "audio.mp3" --output_format srt # Subtitles
whisper "audio.mp3" --output_format vtt # Web subtitles
whisper "audio.mp3" --output_format json # Detailed JSON
whisper "audio.mp3" --output_format all # All formatsStep 3: Apply Context Grounding
Use the scripts/transcribe_with_context.py script for automated grounding, or manually apply corrections:
# Automated approach (recommended)
python scripts/transcribe_with_context.py /path/to/audio.mp3For manual grounding: 1. Read the transcript output 2. Read all .md files in the media file's directory 3. Extract terminology, names, and technical terms from context files 4. Search transcript for likely misrecognitions 5. Apply corrections based on context
Common corrections:
- "cooler net ease" -> "Kubernetes"
- "sequel" -> "SQL"
- "post gress" -> "Postgres"
- Names: Match phonetic variations to names in context files
Step 4: Save Corrected Transcript
Save the grounded transcript with a clear filename:
original_filename_transcript.txt
original_filename_transcript.mdContext Files
Context files are markdown files in the same directory as the media file. They provide grounding information to improve transcription accuracy.
What to Include in Context Files
- People: Names of speakers, team members, interviewees
- Technical Terms: Domain-specific vocabulary, product names
- Acronyms: Abbreviations and their expansions
- Organizations: Company names, department names
- Projects: Project codenames, feature names
Context File Example
See assets/context-template.md for a complete template.
# Meeting Context
## Speakers
- Richard Hightower (host)
- Jane Smith (engineering lead)
## Technical Terms
- Kubernetes (container orchestration)
- FastAPI (Python web framework)
- AlloyDB (Google Cloud database)
## Acronyms
- CI/CD - Continuous Integration/Continuous Deployment
- PR - Pull RequestModel Selection Guide
Use base for general use, medium for important recordings. See references/whisper-options.md for full model comparison and all available options.
Quick reference: tiny (fastest) < base (balanced) < small (better) < medium (high) < large (best accuracy)
For MacBook Pro with Apple Silicon: small or medium models recommended for best speed/accuracy balance.
Troubleshooting
"whisper: command not found"
# macOS
brew install openai-whisper
# Linux
pip install openai-whisper
export PATH="$HOME/.local/bin:$PATH""ffmpeg not found"
# macOS
brew install ffmpeg
# Linux
sudo apt install ffmpegOut of memory errors
Use a smaller model:
whisper "audio.mp3" --model tinySlow transcription
- Use
tinyorbasemodel for faster results - Ensure correct architecture is being used (Apple Silicon vs Intel)
Resources
scripts/
The scripts/transcribe_with_context.py script automates the full workflow:
- Finds context files automatically
- Runs Whisper transcription
- Applies context-based corrections
- Saves the final transcript
Usage:
python scripts/transcribe_with_context.py /path/to/audio.mp3references/
See references/whisper-options.md for complete CLI reference and advanced options.
assets/
The assets/context-template.md provides a template for creating context files to improve transcription accuracy.
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# Virtual environments
.venv/
venv/
ENV/
env/
# IDE
.idea/
.vscode/
*.swp
*.swo
*~
# macOS
.DS_Store
.AppleDouble
.LSOverride
._*
# Transcription outputs
*_transcript.txt
*_transcript.md
*_grounded.txt
*.srt
*.vtt
*.tsv
# Audio/Video files (user content, not part of skill)
*.mp3
*.wav
*.m4a
*.mp4
*.webm
*.mkv
*.avi
*.mov
*.flac
*.ogg
*.opus
*.wma
*.aac
# Distribution archives
*.zip
*.tar.gz
# Logs
*.log
# Temporary files
*.tmp
*.temp
.cache/
Transcription Context Template
Use this template to create context files that improve transcription accuracy. Place this file (or your customized version) in the same directory as your audio/video files.
---
Meeting/Recording Information
- Date: [YYYY-MM-DD]
- Type: [Meeting / Interview / Presentation / Podcast / etc.]
- Topic: [Brief description of what was discussed]
Speakers
List all participants with their full names and roles:
- [Full Name] - [Role/Title]
- [Full Name] - [Role/Title]
- [Full Name] - [Role/Title]
Technical Terms
Domain-specific vocabulary that may be misrecognized:
Products & Services
- [Product Name] - [Brief description]
- [Service Name] - [Brief description]
Technologies
- Kubernetes - container orchestration platform
- Docker - containerization tool
- FastAPI - Python web framework
- PostgreSQL - relational database
- Redis - in-memory data store
- Terraform - infrastructure as code
- Pulumi - infrastructure as code
- AlloyDB - Google Cloud database
- Cloud Run - serverless container platform
Frameworks & Libraries
- React - JavaScript UI library
- Vue.js - JavaScript framework
- Next.js - React framework
- Django - Python web framework
- Flask - Python micro framework
Acronyms & Abbreviations
| Acronym | Expansion |
|---|---|
| API | Application Programming Interface |
| CI/CD | Continuous Integration/Continuous Deployment |
| PR | Pull Request |
| MR | Merge Request |
| K8s | Kubernetes |
| GCP | Google Cloud Platform |
| AWS | Amazon Web Services |
| VM | Virtual Machine |
| VPC | Virtual Private Cloud |
| IAM | Identity and Access Management |
| JWT | JSON Web Token |
| OAuth | Open Authorization |
| REST | Representational State Transfer |
| SQL | Structured Query Language |
| ORM | Object-Relational Mapping |
Organizations & Teams
- [Company Name]
- [Department Name]
- [Team Name]
- [Partner Organization]
Projects & Codenames
- [Project Name] - [Brief description]
- [Feature Codename] - [What it refers to]
Proper Nouns
Locations
- [Office Location]
- [City Names]
- [Building Names]
Events
- [Conference Names]
- [Meeting Series Names]
Common Phrases
Phrases frequently used in your domain:
- "[Specific phrase or jargon]"
- "[Another common phrase]"
---
Usage Notes
1. Keep this file updated - Add new terms as they come up 2. Be specific - Include exact spellings, especially for unusual names 3. Include context - Brief descriptions help with disambiguation 4. Multiple files OK - You can have separate files for different contexts:
team-members.md- Just names and rolestech-glossary.md- Technical terminologyproject-context.md- Current project details
Whisper Transcribe Skill
A Claude Code skill for transcribing audio and video files using OpenAI's Whisper with context-grounding from markdown files.
  
Features
- Audio/Video Transcription: Convert media files to text using OpenAI Whisper
- Context Grounding: Uses markdown files in the same directory to improve accuracy for technical terms, names, and jargon
- Multi-format Support: Works with mp3, wav, m4a, mp4, webm, and more
- Cross-platform: Supports macOS (Homebrew) and Linux installations
- Automated Workflow: Python script handles the full transcription pipeline
Installation
Quick Install with Skilz (Recommended)
The easiest way to install this skill is using the skilz universal installer:
npx skilz install SpillwaveSolutions_whisper-transcribe/whisper-transcribeThis command automatically downloads and configures the skill for Claude Code.
View on Skilz Marketplace: whisper-transcribe
Manual Installation
Clone the repository to your Claude Code skills directory:
git clone https://github.com/SpillwaveSolutions/whisper-transcribe.git ~/.claude/skills/whisper-transcribePrerequisites
After installing the skill, you need to install Whisper and ffmpeg on your system.
macOS (Homebrew)
brew install ffmpeg openai-whisperLinux
# Install ffmpeg
sudo apt install ffmpeg # Debian/Ubuntu
# Install Whisper
pip install openai-whisperVerify Installation
whisper --version
ffmpeg -versionUsage
Basic Transcription
whisper /path/to/audio.mp3 --output_dir /path/to/outputWith Context Grounding Script
python scripts/transcribe_with_context.py /path/to/audio.mp3 --model base --language enThe script will: 1. Find markdown context files in the same directory 2. Run Whisper transcription 3. Apply corrections based on context (technical terms, names) 4. Save both original and grounded transcripts
Model Selection
| Model | Speed | Accuracy | RAM Required | Best For |
|---|---|---|---|---|
| tiny | Fastest | Lower | ~1 GB | Quick drafts, testing |
| base | Fast | Good | ~1 GB | General use |
| small | Medium | Better | ~2 GB | Important recordings |
| medium | Slower | High | ~5 GB | Professional transcription |
| large | Slowest | Highest | ~10 GB | Critical accuracy needs |
For MacBook Pro with Apple Silicon: small or medium models recommended for best speed/accuracy balance.
Context Files
Create markdown files in the same directory as your audio to improve transcription accuracy.
Example Context File
# Meeting Context
## Speakers
- Richard Hightower (host)
- Jane Smith (engineering lead)
## Technical Terms
- Kubernetes (container orchestration)
- FastAPI (Python web framework)
- AlloyDB (Google Cloud database)
## Acronyms
- CI/CD - Continuous Integration/Continuous Deployment
- PR - Pull RequestSee assets/context-template.md for a complete template.
Project Structure
whisper-transcribe/
├── SKILL.md # Skill definition
├── README.md # This file
├── scripts/
│ └── transcribe_with_context.py # Automated transcription script
├── references/
│ └── whisper-options.md # Complete Whisper CLI reference
└── assets/
└── context-template.md # Template for context filesTriggers
This skill activates when users mention:
- whisper, transcribe, transcription
- audio to text, video to text, speech to text
- meeting transcript, convert recording
- File extensions: .mp3, .wav, .m4a, .mp4, .webm
Troubleshooting
"whisper: command not found"
# macOS
brew install openai-whisper
# Linux
pip install openai-whisper
export PATH="$HOME/.local/bin:$PATH""ffmpeg not found"
# macOS
brew install ffmpeg
# Linux
sudo apt install ffmpegOut of memory errors
Use a smaller model:
whisper "audio.mp3" --model tinySlow transcription
- Use
tinyorbasemodel for faster results - Ensure correct architecture is being used (Apple Silicon vs Intel)
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
MIT
Whisper CLI Complete Reference
OpenAI Whisper command-line interface options and usage patterns.
Contents
- Basic Syntax
- Core Options
- Model Selection
- Language
- Output Format
- Output Directory
- Advanced Options
- Performance Options
- Common Workflows
- Supported Audio Formats
- Error Handling
- Python API
- References
Basic Syntax
whisper <audio_file> [options]Core Options
Model Selection (--model)
| Model | Parameters | Size | Required VRAM | Relative Speed |
|---|---|---|---|---|
| tiny | 39 M | ~75 MB | ~1 GB | ~32x |
| tiny.en | 39 M | ~75 MB | ~1 GB | ~32x |
| base | 74 M | ~150 MB | ~1 GB | ~16x |
| base.en | 74 M | ~150 MB | ~1 GB | ~16x |
| small | 244 M | ~500 MB | ~2 GB | ~6x |
| small.en | 244 M | ~500 MB | ~2 GB | ~6x |
| medium | 769 M | ~1.5 GB | ~5 GB | ~2x |
| medium.en | 769 M | ~1.5 GB | ~5 GB | ~2x |
| large | 1550 M | ~3 GB | ~10 GB | 1x |
| large-v2 | 1550 M | ~3 GB | ~10 GB | 1x |
| large-v3 | 1550 M | ~3 GB | ~10 GB | 1x |
Note: .en models are English-only and perform better for English audio.
# Examples
whisper audio.mp3 --model tiny # Fastest, least accurate
whisper audio.mp3 --model base # Good balance
whisper audio.mp3 --model small # Better accuracy
whisper audio.mp3 --model medium # High accuracy
whisper audio.mp3 --model large-v3 # Best accuracyLanguage (--language)
Force a specific language instead of auto-detection:
whisper audio.mp3 --language en # English
whisper audio.mp3 --language es # Spanish
whisper audio.mp3 --language fr # French
whisper audio.mp3 --language de # German
whisper audio.mp3 --language ja # Japanese
whisper audio.mp3 --language zh # ChineseCommon language codes: en, es, fr, de, it, pt, ja, ko, zh, ru, ar, hi
Output Format (--output_format)
whisper audio.mp3 --output_format txt # Plain text (default)
whisper audio.mp3 --output_format vtt # WebVTT subtitles
whisper audio.mp3 --output_format srt # SRT subtitles
whisper audio.mp3 --output_format tsv # Tab-separated values
whisper audio.mp3 --output_format json # Detailed JSON with timestamps
whisper audio.mp3 --output_format all # All formatsOutput Directory (--output_dir)
whisper audio.mp3 --output_dir ./transcripts
whisper audio.mp3 --output_dir /path/to/outputAdvanced Options
Task (--task)
whisper audio.mp3 --task transcribe # Transcribe in original language (default)
whisper audio.mp3 --task translate # Translate to EnglishTemperature (--temperature)
Controls randomness in decoding (0.0-1.0):
whisper audio.mp3 --temperature 0 # Deterministic
whisper audio.mp3 --temperature 0.2 # Low randomness (default)Word Timestamps (--word_timestamps)
Enable word-level timing information:
whisper audio.mp3 --word_timestamps True --output_format jsonInitial Prompt (--initial_prompt)
Provide context to guide transcription style:
whisper audio.mp3 --initial_prompt "This is a technical discussion about Kubernetes and Docker."Condition on Previous Text (--condition_on_previous_text)
whisper audio.mp3 --condition_on_previous_text True # Use context (default)
whisper audio.mp3 --condition_on_previous_text False # Independent segmentsCompression Ratio Threshold (--compression_ratio_threshold)
Filter out segments with high compression (likely garbage):
whisper audio.mp3 --compression_ratio_threshold 2.4No Speech Threshold (--no_speech_threshold)
Probability threshold for silence detection:
whisper audio.mp3 --no_speech_threshold 0.6Hallucination Silence Threshold (--hallucination_silence_threshold)
Skip silent segments to reduce hallucinations:
whisper audio.mp3 --hallucination_silence_threshold 2Performance Options
Device (--device)
whisper audio.mp3 --device cpu # CPU only
whisper audio.mp3 --device cuda # NVIDIA GPU
whisper audio.mp3 --device mps # Apple Silicon (M1/M2/M3)Threads (--threads)
CPU threads for computation:
whisper audio.mp3 --threads 4FP16 (--fp16)
Half-precision (faster on GPU):
whisper audio.mp3 --fp16 True # Enable (default on GPU)
whisper audio.mp3 --fp16 False # Disable (required on CPU)Common Workflows
Quick Draft Transcription
whisper meeting.mp3 --model tiny --output_format txtHigh-Quality Transcription
whisper interview.mp3 --model medium --language en --output_format allGenerate Subtitles
whisper video.mp4 --model small --output_format srtTranslate Foreign Audio to English
whisper spanish_audio.mp3 --task translate --model mediumTechnical Content with Context
whisper tech_talk.mp3 \
--model medium \
--language en \
--initial_prompt "Technical discussion about cloud computing, Kubernetes, and microservices architecture." \
--output_format jsonBatch Processing
# Transcribe all MP3 files in a directory
for f in *.mp3; do
whisper "$f" --model base --output_dir ./transcripts
doneSupported Audio Formats
Whisper uses ffmpeg and supports:
- Audio: mp3, wav, m4a, flac, ogg, opus, wma, aac
- Video: mp4, mkv, webm, avi, mov (extracts audio automatically)
Error Handling
Out of Memory
# Use smaller model
whisper audio.mp3 --model tiny
# Or disable FP16 on CPU
whisper audio.mp3 --device cpu --fp16 FalseSlow Performance
# Use faster model
whisper audio.mp3 --model base
# Specify device explicitly
whisper audio.mp3 --device mps # Apple SiliconPoor Accuracy
# Use larger model
whisper audio.mp3 --model medium
# Specify language explicitly
whisper audio.mp3 --language en
# Provide context
whisper audio.mp3 --initial_prompt "Meeting about project planning"Python API (Alternative)
For programmatic use:
import whisper
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
print(result["text"])
# With options
result = model.transcribe(
"audio.mp3",
language="en",
task="transcribe",
fp16=False
)References
#!/usr/bin/env python3
"""
Whisper Transcription with Context Grounding
This script automates the full transcription workflow:
1. Find markdown context files in the same directory as the media file
2. Run Whisper transcription
3. Apply context-based corrections to improve accuracy
4. Save the grounded transcript
Usage:
python transcribe_with_context.py /path/to/audio.mp3 [--model base] [--language en]
Requirements:
- OpenAI Whisper: brew install openai-whisper (macOS) or pip install openai-whisper
- ffmpeg: brew install ffmpeg (macOS) or apt install ffmpeg (Linux)
"""
import argparse
import os
import re
import subprocess
import sys
from pathlib import Path
from typing import Optional
def find_context_files(media_dir: Path) -> list[Path]:
"""Find all markdown files in the same directory as the media file."""
return list(media_dir.glob("*.md"))
def extract_terms_from_context(context_files: list[Path]) -> dict[str, str]:
"""
Extract terminology from context files.
Returns a dict mapping phonetic variations to correct terms.
"""
terms = {}
# Common phonetic misrecognitions and their corrections
phonetic_mappings = {
# Technical terms
"cooler net ease": "Kubernetes",
"kube er net ease": "Kubernetes",
"cube er net ease": "Kubernetes",
"sequel": "SQL",
"my sequel": "MySQL",
"post gress": "Postgres",
"post gray sequel": "PostgreSQL",
"redis": "Redis",
"doc er": "Docker",
"get hub": "GitHub",
"get lab": "GitLab",
"jay son": "JSON",
"yam el": "YAML",
"rest full": "RESTful",
"graph cue el": "GraphQL",
"pie thon": "Python",
"java script": "JavaScript",
"type script": "TypeScript",
"fast a p i": "FastAPI",
"alloy d b": "AlloyDB",
"cloud run": "Cloud Run",
"pub sub": "Pub/Sub",
}
terms.update(phonetic_mappings)
for context_file in context_files:
try:
content = context_file.read_text()
# Extract proper nouns (capitalized words)
# Look for patterns like "- Name (description)" or "- **Name**"
name_patterns = [
r"[-*]\s+\*?\*?([A-Z][a-zA-Z]+(?:\s+[A-Z][a-zA-Z]+)*)\*?\*?",
r"##\s+([A-Z][a-zA-Z]+(?:\s+[A-Z][a-zA-Z]+)*)",
]
for pattern in name_patterns:
matches = re.findall(pattern, content)
for name in matches:
# Create phonetic variation (lowercase, spaced)
phonetic = name.lower().replace("-", " ")
terms[phonetic] = name
except Exception as e:
print(f"Warning: Could not read context file {context_file}: {e}")
return terms
def run_whisper(
media_file: Path,
output_dir: Path,
model: str = "base",
language: Optional[str] = None
) -> Path:
"""Run Whisper transcription on the media file."""
cmd = [
"whisper",
str(media_file),
"--model", model,
"--output_dir", str(output_dir),
"--output_format", "txt",
]
if language:
cmd.extend(["--language", language])
print(f"Running Whisper with model '{model}'...")
print(f"Command: {' '.join(cmd)}")
try:
subprocess.run(cmd, check=True)
except subprocess.CalledProcessError as e:
print(f"Error running Whisper: {e}")
sys.exit(1)
except FileNotFoundError:
print("Error: whisper command not found.")
print("Install with: brew install openai-whisper (macOS) or pip install openai-whisper")
sys.exit(1)
# Find the output file
output_file = output_dir / f"{media_file.stem}.txt"
if not output_file.exists():
print(f"Error: Expected output file not found: {output_file}")
sys.exit(1)
return output_file
def apply_context_grounding(transcript: str, terms: dict[str, str]) -> str:
"""Apply context-based corrections to the transcript."""
grounded = transcript
corrections_made = []
for phonetic, correct in terms.items():
# Case-insensitive replacement
pattern = re.compile(re.escape(phonetic), re.IGNORECASE)
if pattern.search(grounded):
grounded = pattern.sub(correct, grounded)
corrections_made.append(f"'{phonetic}' -> '{correct}'")
if corrections_made:
print(f"\nContext corrections applied:")
for correction in corrections_made:
print(f" {correction}")
return grounded
def main():
parser = argparse.ArgumentParser(
description="Transcribe audio/video with context grounding"
)
parser.add_argument(
"media_file",
type=Path,
help="Path to the audio or video file to transcribe"
)
parser.add_argument(
"--model",
default="base",
choices=["tiny", "base", "small", "medium", "large"],
help="Whisper model to use (default: base)"
)
parser.add_argument(
"--language",
default=None,
help="Language code (e.g., 'en' for English)"
)
parser.add_argument(
"--output-dir",
type=Path,
default=None,
help="Output directory (default: same as media file)"
)
args = parser.parse_args()
# Validate input file
media_file = args.media_file.resolve()
if not media_file.exists():
print(f"Error: Media file not found: {media_file}")
sys.exit(1)
media_dir = media_file.parent
output_dir = args.output_dir or media_dir
output_dir.mkdir(parents=True, exist_ok=True)
print(f"Transcribing: {media_file}")
print(f"Output directory: {output_dir}")
# Step 1: Find context files
context_files = find_context_files(media_dir)
if context_files:
print(f"\nFound {len(context_files)} context file(s):")
for cf in context_files:
print(f" - {cf.name}")
else:
print("\nNo context files found. Proceeding without grounding.")
# Step 2: Extract terms from context
terms = extract_terms_from_context(context_files)
print(f"Loaded {len(terms)} terms for context grounding")
# Step 3: Run Whisper
transcript_file = run_whisper(
media_file,
output_dir,
model=args.model,
language=args.language
)
# Step 4: Read transcript
transcript = transcript_file.read_text()
print(f"\nTranscript length: {len(transcript)} characters")
# Step 5: Apply context grounding
grounded_transcript = apply_context_grounding(transcript, terms)
# Step 6: Save grounded transcript
grounded_file = output_dir / f"{media_file.stem}_grounded.txt"
grounded_file.write_text(grounded_transcript)
print(f"\n✓ Original transcript: {transcript_file}")
print(f"✓ Grounded transcript: {grounded_file}")
return 0
if __name__ == "__main__":
sys.exit(main())