First transcription
Open PowerShell 7 in the project directory and pass the local media file as the first argument.
pwsh -File .\Invoke-TranscriptOrganizer.ps1 '.\recording.webm'Inspect the complete plan without inference or an output folder:
pwsh -File .\Invoke-TranscriptOrganizer.ps1 '.\recording.webm' -DryRunrecording-transcript contains raw JSON Lines, readable text, SRT subtitles, normalized segments, metadata, validation, and sampled frames. Later runs create recording-transcript_001 and subsequent available suffixes.Requirements
| Component | Requirement |
|---|---|
| Operating system | Windows 10 or Windows 11, 64-bit |
| PowerShell | PowerShell 7 or later, Core edition |
| FFmpeg | A build containing the whisper audio filter and its required options |
| FFprobe | Available as a native application |
| Main model | ggml-model-whisper-medium.en-q5_0.bin, at least 100 MB |
The target machine uses an i7-8750H, 32 GB RAM, and a GTX 1050 Ti with 4 GB VRAM. The module runs one request at a time, prefers GPU device 0, and permits one classified CPU fallback by default.
Check readiness
The check inspects Windows, PowerShell, FFmpeg, FFprobe, the actual Whisper filter options, NVIDIA diagnostics, and the required model. It never starts transcription.
$manifest = '.\module\TranscriptOrganizer.psd1'
Import-Module $manifest -Force
$configuration = New-TranscriptOrganizerConfiguration -ProjectDirectory $PWD
Test-TranscriptOrganizerEnvironment -Configuration $configuration -IncludeModelA general FFmpeg installation is insufficient. Confirm the selected binary directly:
ffmpeg -hide_banner -help filter=whisperModel setup
The supplied English model is ggml-model-whisper-medium.en-q5_0.bin. Search order is an explicit WhisperModelPath, the project root name, the models directory name, then canonical ggml-medium.en-q5_0.bin locations. An explicit missing path fails without silent substitution.
Downloads are opt-in through DownloadMissingModels. Automatic download also requires a trusted SHA-256 in configuration, uses a temporary .download file, validates it, and moves it only after success. The shipped configuration has no asserted hash, so it safely refuses automatic download.
EnableVad is true. Ordinary transcription never checks or downloads it.Output formats
| Artifact | Use |
|---|---|
transcript.txt | Reading, searching, and quoting |
transcript.srt | Timestamped subtitles and review |
transcript.raw.jsonl | Byte-preserved timestamped backend evidence for automation |
There is no format selection: every run uses one internal JSON inference and derives text and SRT. Existing runs are preserved through new suffixed folders unless Overwrite is explicit.
Build a shared extraction corpus
A corpus performs Whisper inference once in JSON mode, then derives normalized segments, readable text, SRT, media metadata, bounded visual frames, validation evidence, and hashes. Downstream projects can reuse these source artifacts without another transcription run.
$configuration = New-TranscriptOrganizerConfiguration -ProjectDirectory $PWD
Export-TranscriptOrganizerCorpus -InputPath '.\talk.webm' -OutputFolder '.\talk-transcript' -Configuration $configurationUse ReuseExistingTranscript when a validated transcript.raw.jsonl already exists. This protects the expensive source extraction from accidental repetition.
FFmpeg 8.1.2 can emit unescaped quotation marks when quoted speech occurs inside the JSON text field. Export preserves the raw JSONL unchanged, applies a narrow recovery only to the exact FFmpeg record shape, and reports strictly valid and recovered record counts separately.
Reusable coding-agent skills
Experiments 01, 02, and 10 produced workflows that generalize beyond the original talk. Their dated skill folders contain self-contained SKILL.md prompts: each repeats the extraction-folder layout, segment and frame schemas, expected outputs, review questions, and definition of done. Give an agent a validated Transcript Organizer corpus and an output directory; the skill does not need another experiment.
| Origin | Skill | Result for an arbitrary video |
|---|---|---|
| Experiment 01 | Create a Faithful Video Companion | Detailed source-only HTML article with timestamped evidence and sampled illustrations. |
| Experiment 02 | Build a Researched Video Field Guide | Knowledge-dense article with primary-source research, claim boundaries, and a source ledger. |
| Experiment 10 | Build a Searchable Transcript Navigator | Offline lexical search, continuous chapters, recovery provenance, sampled frames, and local-media timestamps. |
The skills are project knowledge artifacts, not application runtime files, so they remain outside the version 001 PowerShell distribution ZIP.
Common workflows
Choose an output folder
pwsh -File .\Invoke-TranscriptOrganizer.ps1 '.\talk.webm' -OutputFolder '.\results\talk'Replace one known result
pwsh -File .\Invoke-TranscriptOrganizer.ps1 '.\talk.webm' -OutputFolder '.\results\talk' -OverwriteCPU-only processing
Edit UseGpu = $false in the launcher’s user-editable defaults block. Set AllowCpuFallback = $false when no fallback distinction is needed.
GPU-preferred processing
The default attempts GPU device 0. CPU fallback occurs once only when FFmpeg reports a recognized GPU initialization failure; invalid models, output conflicts, missing filters, and malformed requests never trigger it.
VAD-enabled processing
Edit EnableVad = $true and provide VadModelPath in the defaults block. VAD remains completely inactive otherwise.
Sequential batch
Get-ChildItem '.\media' -Filter '*.webm' -File | ForEach-Object {
pwsh -File .\Invoke-TranscriptOrganizer.ps1 $_.FullName
}Module-level orchestration
$request = New-TranscriptOrganizerRequest -InputPath '.\talk.webm' -OutputFolder '.\talk-transcript'
$result = Invoke-TranscriptOrganizer -Request $request -Configuration $configuration
$requests | Invoke-TranscriptOrganizerBatch -Configuration $configurationDry run
pwsh -File .\Invoke-TranscriptOrganizer.ps1 '.\talk.webm' -DryRunConfiguration reference
| Setting | Default | Meaning |
|---|---|---|
Language | en | English model language; auto is accepted |
QueueSeconds | 20 | Accumulated audio used to form stable segments |
UseGpu | true | Attempt the compiled GPU backend |
AllowCpuFallback | true | Permit one classified retry |
EnableVad | false | Enable conditional Silero VAD handling |
TimeoutMultiplier | 6 | Six times media duration plus 30 minutes, clamped to two–24 hours |
All operational defaults are together near the beginning of Invoke-TranscriptOrganizer.ps1. The product accepts local media files only.
Logs and diagnostics
Each request writes JSON Lines to artifacts/logs/transcript-organizer-YYYYMMDD.jsonl. Every event includes request and operation identifiers. Process events record the resolved executable, native argument array, working directory, outcome, duration, exit code summary, execution mode, and a separately formatted diagnostic command.
URL credentials, sensitive query strings, password-like properties, and token-like properties are redacted. Transcript output content is not logged. If persistent logging fails, a warning is emitted and the original operation result remains authoritative.
Collect a request for support
Copy the result's RequestId, Error.Code, and LogPath. Extract only JSON Lines whose RequestId matches. Review paths before sharing them.
Troubleshooting
| Symptom | Action |
|---|---|
| FFmpeg missing | Install a Windows FFmpeg application and ensure the selected ffmpeg.exe is on PATH. |
| Whisper filter missing | Install or build FFmpeg with --enable-whisper; run ffmpeg -hide_banner -help filter=whisper. |
| Main model missing | Place ggml-model-whisper-medium.en-q5_0.bin in the project root or models, or provide WhisperModelPath. |
| VAD model missing | Provide a compatible Silero model or remove EnableVad. |
| GPU initialization failure | Close GPU-heavy software, verify the compiled backend, or use CPU-only mode. Classified failures fall back once when permitted. |
| Output conflict | Use the automatically suffixed folder, choose another OutputFolder, or enable Overwrite. |
| No audio stream | Inspect the file with FFprobe and confirm the first audio stream is readable. |
| Output not created | Use the request ID to inspect the FFmpeg exit, arguments, and diagnostics. Empty artifacts are failures. |
Limitations
- Recognition is probabilistic; important transcripts require human review.
- The English quantized medium model is optimized for English, not multilingual accuracy.
- VAD detects speech and silence; it does not identify speakers.
- The project accepts local media files only; live devices and network input are not supported.
- The project does not summarize, correct, edit video, or provide a subtitle editor.
- The FFmpeg Whisper filter does not expose a documented Whisper thread-count setting.