[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DBS6W2R7DGD5E7G0G4J2WP":3,"skill-same:01M6DBS6W2R7DGD5E7G0G4J2WP":67},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":14,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":52,"install":53,"resources":66},"01M6DBS6W2R7DGD5E7G0G4J2WP","reframe-transcribe",null,"Use when transcribing speech from audio\u002Fvideo to text with WORD-LEVEL timing (for captions, karaoke subtitles, clip-boundary snapping, or diarization). The proven local pipeline is faster-whisper (large-v3-turbo on GPU \u002F small on CPU) for the transcript, then a SEPARATE ctc-forced-aligner second.","Prekzursil\u002Fagent-skills-toolchain","Prekzursil","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F54636077?v=4","01M6DACZ1PCQHD99SCR1YXG28B","Andrei Mihai Visalon","01M6DACZ670WZF535V3WYYSS4Z",0,"MIT","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freframe-transcribe\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"reframe transcribe","transcribe","Captions","v3","local","whisper","clip","use","text","Word","transcript","Audio","Video","boundary","pipeline","subtitles","gpu","speech","2026-11-10 10:12:30",false,"---\nname: reframe-transcribe\ndescription: \"Use when transcribing speech from audio\u002Fvideo to text with WORD-LEVEL timing (for captions, karaoke subtitles, clip-boundary snapping, or diarization). The proven local pipeline is faster-whisper (large-v3-turbo on GPU \u002F small on CPU) for the transcript, then a SEPARATE ctc-forced-aligner second.\"\n---\n\n# Transcribe (speech to timed text)\n\nGoal: turn an audio\u002Fvideo file into a **Transcript** — language + segments +\n**per-word `{text, start, end}`** — that is accurate, correctly timed at the word\nlevel, and degrades loudly (never silently) when a GPU or model is missing.\n\nThis skill distills the **real, shipped** pipeline from Reframe\n(`sidecar\u002Fmedia_studio\u002Ffeatures\u002Ftranscribe.py`, `parakeet_asr.py`,\n`ctc_align.py` + their `_backend.py` siblings) plus current Hugging Face model\noptions. The architecture is deliberately **two passes**, and the single most\nimportant design decision is *why it is not WhisperX*.\n\n---\n\n## 0. The headline decision: two passes, NOT WhisperX\n\nWhisperX = faster-whisper + a bundled forced-alignment stage + optional pyannote.\nIts alignment stage loads a **language-specific wav2vec2** model keyed by the\ndetected language. That is the trap:\n\n- **Romanian (and many non-EN languages) have no good\u002Fany bundled wav2vec2\n  alignment model in WhisperX's map** → it either falls back to a wrong model,\n  produces garbage word times, or crashes outright on the missing key.\n- It couples ASR and alignment, so you cannot swap ASR engines independently.\n\n**Reframe's fix (adopt this):** keep ASR and alignment as **two independent\nseams**:\n\n1. **ASR pass** → faster-whisper (default) or Parakeet (opt-in) → segment + rough\n   word times in the `Transcript` schema.\n2. **Alignment pass** → a *separate* `ctc-forced-aligner` (MahmoudAshraf) call\n   that re-derives word boundaries. Its **default model is MMS-300M\n   (`MahmoudAshraf\u002Fmms-300m-1130-forced-aligner`, 158 languages)** which handles\n   Romanian, and for best RO quality you can point it at\n   **`gigant\u002Fromanian-wav2vec2`** (Apache-2.0, RO-specific CTC). This sidesteps\n   WhisperX's RO alignment-model gap entirely.\n\nIf alignment is unavailable, the pipeline returns the ASR transcript\n**unchanged** (segment timings preserved) — it never raises, never drops text.\n\n> Alternative to the CTC second pass: **stable-ts** derives word timing from\n> Whisper's own cross-attention, so it needs **no separate language model** and is\n> also RO-robust. Use it if you want a single dependency; use ctc-forced-aligner\n> (Reframe's choice) if you want alignment decoupled from the ASR engine.\n> [Grade: MEDIUM — both are valid; Reframe shipped ctc-forced-aligner.]\n\n---\n\n## 1. The Transcript schema (the contract everything speaks)\n\n```python\nWord       = {\"text\": str, \"start\": float, \"end\": float, \"score\": float?}  # seconds\nSegment    = {\"start\": float, \"end\": float, \"text\": str, \"words\": [Word]}\nTranscript = {\"language\": str, \"segments\": [Segment], \"durationSec\": float}\n```\n\nEvery engine (whisper, Parakeet) and the aligner emit \u002F consume exactly this.\nKeep it. It is what makes the engine a swappable seam.\n\n---\n\n## 2. The real recipe\n\n### 2.1 Dependencies\n\n```bash\n# ASR (default engine) — CTranslate2 backend, fast + low VRAM\nuv pip install faster-whisper\n# Word-level alignment second pass (the karaoke timing)\nuv pip install ctc-forced-aligner torch torchaudio\n# Opt-in alternative engine (multilingual transducer)\nuv pip install \"nemo_toolkit[asr]\"        # heavy; only if using Parakeet\u002FCanary\n# ffmpeg must be on PATH (audio decode for the aligner + duration probe)\n```\n\nGPU: install the CUDA-enabled torch wheel matching your driver, and the\n`nvidia-cublas-cu12` \u002F `nvidia-cudnn-cu12` wheels (faster-whisper\u002FCTranslate2\nneeds cuDNN\u002FcuBLAS at first ENCODE — see the Windows gotcha in §5).\n\n### 2.2 Pass 1 — ASR (faster-whisper)\n\n```python\nfrom faster_whisper import WhisperModel\n\n# Device\u002Fcompute policy (Reframe DEFAULT_*):\n#   GPU present -> \"cuda\" + \"float16\" + model \"large-v3-turbo\"\n#   CPU only    -> \"cpu\"  + \"int8\"    + model \"small\"  (turbo is impractically slow on CPU)\nmodel = WhisperModel(\"large-v3-turbo\", device=\"cuda\", compute_type=\"float16\")\n\n# transcribe() returns a LAZY generator + info. Work happens as you iterate —\n# that is what enables per-segment progress AND cooperative cancellation.\nsegments_iter, info = model.transcribe(\n    audio_path,\n    language=None,            # None => auto-detect; returned in info.language\n    word_timestamps=True,     # REQUIRED — gives the rough word times pass 2 refines\n)\nduration = float(info.duration)\ndetected_language = info.language          # e.g. \"ro\"\n\nsegments = []\nfor seg in segments_iter:                  # iterate -> decode -> progress\n    segments.append({\n        \"start\": float(seg.start), \"end\": float(seg.end), \"text\": seg.text,\n        \"words\": [{\"text\": w.word, \"start\": float(w.start), \"end\": float(w.end)}\n                  for w in (seg.words or [])],\n    })\ntranscript = {\"language\": detected_language, \"segments\": segments, \"durationSec\": duration}\n```\n\nNotes that matter:\n- faster-whisper words expose `.word` (with a **leading space**) — map `.word -> text`\n  verbatim; do not strip the space if you later reconstruct text.\n- Auto-detection is good; pass `language=\"ro\"` only when you KNOW the language and\n  want to skip the detection cost \u002F avoid a misdetect on short\u002Fnoisy clips.\n\n### 2.3 Pass 2 — word alignment (ctc-forced-aligner)\n\n```python\nimport numpy as np, torch, subprocess\nfrom ctc_forced_aligner import (load_alignment_model, generate_emissions,\n    preprocess_text, get_alignments, get_spans, postprocess_results)\n\nTARGET_SR = 16000  # CTC models train at 16 kHz mono\n\n# 1) decode audio -> mono f32 @ 16k via ffmpeg (argv list, never shell=True)\nraw = subprocess.run([ffmpeg, \"-hide_banner\", \"-nostdin\", \"-i\", audio_path,\n    \"-ac\",\"1\",\"-ar\",str(TARGET_SR),\"-f\",\"f32le\",\"-\"], capture_output=True, check=False)\n# HONOUR returncode: non-zero -> raise with stderr tail (don't feed garbage buffer)\nsamples = np.frombuffer(raw.stdout, dtype=np.float32)\n\n# 2) flatten transcript -> ordered word tokens (drop blank tokens)\ntokens = [w[\"text\"].strip() for s in transcript[\"segments\"] for w in s[\"words\"] if w[\"text\"].strip()]\n\n# 3) align\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\ndtype  = torch.float16 if device == \"cuda\" else torch.float32\nmodel, tokenizer = load_alignment_model(device,\n    \"MahmoudAshraf\u002Fmms-300m-1130-forced-aligner\", dtype=dtype)\nwav = torch.from_numpy(samples).to(device)\nemissions, stride = generate_emissions(model, wav, batch_size=1)\ntoks_starred, text_starred = preprocess_text(\" \".join(tokens),\n    romanize=True, language=\"ron\")     # ISO-639-3! \"ron\"\u002F\"eng\", NOT \"ro\"\u002F\"en\"\nsegs, scores, blank = get_alignments(emissions, toks_starred, tokenizer)\nspans = get_spans(toks_starred, segs, blank)\nword_timestamps = postprocess_results(text_starred, spans, stride, scores)\n# -> [{text,start,end,score}, ...]  : merge back onto segments IN ORDER (immutably)\n```\n\nThen **stitch word times back** onto the transcript: consume aligned words in\ntranscript order, each segment takes as many words as it originally had, and widen\neach segment's `start\u002Fend` to span its first\u002Flast refreshed word. If the aligned\nlist runs short, leave the remaining segments UNCHANGED (a partial alignment must\nnever drop text or half-retime a segment).\n\n### 2.4 Lifecycle (do this or you OOM)\n\n**Load → use → free, ONE heavy model at a time.** Whisper and the aligner are\nboth GPU residents. Run ASR fully, **release the whisper model** (drop the cache \u002F\n`del` + `torch.cuda.empty_cache()`), THEN load the aligner. Never hold both. Cache\na model per `(model, device, compute_type)` within a pass so a CPU-fallback retry\ndoesn't rebuild needlessly.\n\n---\n\n## 3. Model choices\n\n### 3.1 Current Reframe defaults (shipped, proven)\n\n| Role | Model | Device | Notes |\n|---|---|---|---|\n| ASR (GPU) | `large-v3-turbo` (faster-whisper) | cuda\u002Ffloat16 | 809M params, MIT. Fast + multilingual incl. RO. |\n| ASR (CPU) | `small` (faster-whisper) | cpu\u002Fint8 | turbo is impractically slow on CPU; `small` ≈10× faster, still good. |\n| ASR (opt-in) | `nvidia\u002Fparakeet-tdt-0.6b-v3` | cuda | CC-BY-4.0, 25 EU langs incl. RO. **Must chunk audio** (§4). |\n| Align (default) | `MahmoudAshraf\u002Fmms-300m-1130-forced-aligner` | cuda\u002Fcpu | **CC-BY-NC-4.0** (non-commercial), 158 langs. Fine for a local desktop tool. |\n| Align (commercial) | `facebook\u002Fwav2vec2-large-960h-lv60-self` | cuda\u002Fcpu | MIT swap for commercial builds (EN). |\n| Align (Romanian) | `gigant\u002Fromanian-wav2vec2` | cuda\u002Fcpu | Apache-2.0, RO-specific CTC (315M). Best RO word timing. |\n\nPin HF snapshot **revisions to commit hashes** for reproducible offline runs\n(Reframe does this for every asset). [Grade: HIGH — read directly from shipped code.]\n\n### 3.2 HF upgrade menu (verified on HF Hub, 2026-06-30)\n\nASR engines — pick by accuracy\u002Fthroughput\u002Flicense\u002Flanguage need:\n\n| Model (HF ID) | Params | License | Languages | When to use |\n|---|---|---|---|---|\n| `openai\u002Fwhisper-large-v3-turbo` | 809M | MIT | ~99 (incl. ro) | **Default.** Best speed\u002Fquality multilingual; the turbo decoder is ~6–8× faster than large-v3 with minor WER cost. |\n| `deepdml\u002Ffaster-whisper-large-v3-turbo-ct2` | — | MIT | ~99 | The CT2-converted turbo weights faster-whisper actually loads. Drop-in. |\n| `Zoont\u002Ffaster-whisper-large-v3-turbo-int8-ct2` | — | MIT | ~99 | int8 turbo — lowest VRAM\u002FCPU-friendly variant of turbo. |\n| `openai\u002Fwhisper-large-v3` | 1.54B | Apache-2.0 | ~99 | Max-accuracy toggle for hard accents\u002Fnoise; ~2× slower, ~2× VRAM vs turbo. |\n| `nvidia\u002Fparakeet-tdt-0.6b-v3` | 627M | CC-BY-4.0 | 25 EU (incl. ro) | Fastest high-accuracy for EU langs; transducer. **Chunk audio (§4).** Top of Open ASR Leaderboard for size. |\n| `nvidia\u002Fparakeet-tdt-0.6b-v2` | ~600M | CC-BY-4.0 | **EN only** | English-only sibling of v3; do NOT use for Romanian. |\n| `nvidia\u002Fcanary-1b-v2` | ~1B | CC-BY-4.0 | 25 EU (incl. ro) | ASR **+ speech translation**; higher accuracy than parakeet at higher cost (FastConformer encoder-decoder). |\n| `distil-whisper\u002Fdistil-large-v3.5` | 756M | MIT | **EN only** | Fastest English-only; ~2× faster than large-v3. No multilingual → not for RO. |\n| `facebook\u002Fseamless-m4t-v2-large` | 2.3B | **CC-BY-NC-4.0** | ~100 (incl. ro) | ASR+S2T+S2S+TTS unified. Big, non-commercial — only if you need the multitask stack. |\n\nTech report for the parakeet-v3 \u002F canary-v2 family (Granary data, architecture,\nWER): arXiv:2509.14128 (hf.co\u002Fpapers\u002F2509.14128).\nOpen ASR Leaderboard (live RTFx + WER rankings): hf.co\u002Fspaces\u002Fhf-audio\u002Fopen_asr_leaderboard.\n\nConfidence grades:\n- Existence \u002F params \u002F license \u002F language coverage: **HIGH** (read from HF model\n  cards via the Hub API, 2026-06-30).\n- Cross-model RTFx \u002F throughput ordering (\"turbo ~6–8× faster\", \"parakeet\n  fastest\"): **MEDIUM** — directional from leaderboard + card claims, not a\n  same-machine benchmark; measure on your own hardware before committing.\n- whisper-large-v3 exact Romanian WER number: **MEDIUM** — FLEURS RO WER is\n  published per-card but not re-fetched here; treat as approximate.\n- Overall recommendation (turbo default + ctc-forced-aligner second pass,\n  parakeet-v3 for EU, RO via gigant\u002Fromanian-wav2vec2): **HIGH**.\n\n### 3.3 Selection heuristics\n\n- **General multilingual incl. RO, GPU** → whisper-large-v3-turbo (default).\n- **EU languages, want max throughput** → parakeet-tdt-0.6b-v3 (chunk it).\n- **Need transcription + translation** → canary-1b-v2.\n- **English-only, want speed** → distil-large-v3.5 or parakeet-tdt-0.6b-v2.\n- **Hard audio, accuracy over speed** → whisper-large-v3 (full).\n- **Commercial product** → avoid the CC-BY-NC aligner default + seamless-m4t;\n  use MIT\u002FApache\u002FCC-BY models (turbo MIT, parakeet\u002Fcanary CC-BY-4.0 w\u002F attribution).\n\n---\n\n## 4. VRAM-bound engines: audio chunking (the hard 6 GB rule)\n\nParakeet\u002FCanary full-context long-attention decode wants an A100-80GB; on a 6–8 GB\ncard it OOMs on long files. **Segment the audio into ~300 s (5 min) spans**,\ntranscribe each independently, then re-stitch:\n\n```python\nCHUNK_SEC = 300.0          # comfortably under 6 GB for parakeet-0.6b\n# split [0, duration) into 300s (start,end) spans; last span clamps to duration\n# transcribe each span; each chunk reports times RELATIVE to its own start\n# fold the chunk's absolute start (offset) back into every segment + word time\n# language = first chunk's non-empty language; durationSec = max(offset + chunk_dur)\n```\n\nfaster-whisper does NOT need this (CTranslate2 streams 30 s windows internally),\nbut the same chunking is the safe path for any transducer\u002Fattention model on a\nsmall GPU. Poll `should_cancel` **before each chunk** so a cancel stops promptly\nwith whatever completed.\n\n---\n\n## 5. Pitfalls (these actually bite)\n\n1. **Windows CUDA-DLL not found.** CTranslate2 lazy-loads `cublas64_12.dll` \u002F\n   `cudnn*.dll` at the **first ENCODE** (not at model construction). The pip\n   `nvidia-cublas-cu12` \u002F `nvidia-cudnn-cu12` wheels drop them under\n   `site-packages\u002Fnvidia\u002F*\u002Fbin`, which is **not** on the DLL search path → first\n   transcribe raises *\"Library cublas64_12.dll is not found\"* (or, in a windowless\n   process, silently BLOCKS on a hidden error dialog). **Fix:** before the first\n   encode, `os.add_dll_directory()` + prepend to `PATH` every\n   `site-packages\u002Fnvidia\u002F*\u002Fbin`. Idempotent; no-op off-Windows.\n2. **Do not use WhisperX for non-English word timing.** Its language-keyed\n   wav2vec2 alignment has no good Romanian model → wrong times or a crash. Use the\n   decoupled ctc-forced-aligner (MMS-300M \u002F gigant\u002Fromanian-wav2vec2) or stable-ts.\n3. **Language codes differ between stages.** ASR (whisper) uses ISO-639-1\n   (`\"ro\"`, `\"en\"`); ctc-forced-aligner's `preprocess_text(language=...)` wants\n   **ISO-639-3** (`\"ron\"`, `\"eng\"`). Passing `\"ro\"` to the aligner misaligns.\n4. **CPU + large-v3-turbo = a trap.** turbo on CPU\u002Fint8 is impractically slow.\n   Auto-pick `small` on CPU. Make the GPU→CPU fallback **LOUD** (surface a\n   \"GPU unavailable — running on CPU, slower\" progress message), never silent.\n5. **Holding two heavy models** (whisper + aligner) at once → OOM. Release pass 1\n   before loading pass 2 (§2.4).\n6. **Silent ffmpeg decode failure.** The aligner's audio loader must honour\n   ffmpeg's returncode — a non-zero exit should RAISE (with the stderr tail), not\n   hand back an empty\u002Fgarbage buffer that produces empty alignments.\n7. **Empty \u002F partial alignment must not drop text.** If the aligner returns fewer\n   words than the transcript, keep the un-covered segments unchanged. Degrade =\n   return the ASR transcript verbatim, never raise.\n8. **`word_timestamps=True` is mandatory** for the rough word times even when you\n   re-align — and it is what lets the caption\u002Fkaraoke layer work if alignment is\n   skipped.\n9. **Offline gate is network-only.** Only the *download* path of a missing model\n   should degrade when offline. A model already in the HF cache must run fully\n   offline — probe the asset cache, don't assume \"offline ⇒ no model\".\n10. **Parakeet degrades to an EMPTY transcript** when its weights are missing\n    offline — the caller must fall back to the always-present whisper path so the\n    user still gets a transcript.\n\n---\n\n## 6. GPU \u002F device notes\n\n- **Auto-detect** via `torch.cuda.is_available()` (lazy import; degrade to CPU if\n  torch absent or CUDA init fails — never raise from the probe).\n- Resolve `(model, device, compute_type)` **up front** from a settings knob\n  (`auto`\u002F`cuda`\u002F`cpu`): `cuda`→`float16`, `cpu`→`int8`, `auto`→detect. Then an\n  exception-based CPU fallback at load time stays as a final safety net for the\n  GPU-attempt path.\n- Aligner runs `float16` on CUDA, `float32` on CPU. Resample to 16 kHz mono with\n  `torchaudio.functional.resample` only when the decoded SR ≠ 16000.\n- VRAM rough guide (single resident model): turbo-int8 ~1.5 GB, turbo-fp16 ~3 GB,\n  large-v3-fp16 ~6 GB, parakeet-0.6b ~2–3 GB (chunked), MMS-300M aligner ~1.5 GB.\n- Long runs (a feature-length file): wrap in a background\u002F`longrun` wrapper with a\n  hang timeout, stream per-segment\u002Fper-chunk progress, and support cooperative\n  cancel — don't block a foreground call.\n\n---\n\n## 7. Sources\n\n- Reframe shipped code (primary, HIGH): `sidecar\u002Fmedia_studio\u002Ffeatures\u002F`\n  `transcribe.py`, `parakeet_asr.py`, `parakeet_asr_backend.py`, `ctc_align.py`,\n  `ctc_align_backend.py`; design notes `docs\u002Fresearch\u002FOPUSCLIP-PARITY-IMPROVEMENT-NOTE-2026-06-28.md`\n  §5 (RO alignment caveat) + `docs\u002Fresearch\u002FLLM-BACKEND.md`.\n- HF model cards via Hub API, 2026-06-30 (HIGH): openai\u002Fwhisper-large-v3-turbo\n  (809M, MIT), deepdml\u002Ffaster-whisper-large-v3-turbo-ct2 (MIT),\n  nvidia\u002Fparakeet-tdt-0.6b-v3 (627M, CC-BY-4.0, 25 EU), nvidia\u002Fparakeet-tdt-0.6b-v2\n  (EN, CC-BY-4.0), nvidia\u002Fcanary-1b-v2 (CC-BY-4.0, 25 EU),\n  distil-whisper\u002Fdistil-large-v3.5 (756M, MIT, EN), facebook\u002Fseamless-m4t-v2-large\n  (2.3B, CC-BY-NC-4.0), openai\u002Fwhisper-large-v3 (1.54B, Apache-2.0),\n  gigant\u002Fromanian-wav2vec2 (315M, Apache-2.0, RO).\n- arXiv:2509.14128 — Granary\u002Fparakeet-v3\u002Fcanary-v2 family tech report (MEDIUM, not\n  re-fetched in full).\n- Open ASR Leaderboard: hf.co\u002Fspaces\u002Fhf-audio\u002Fopen_asr_leaderboard (MEDIUM — RTFx\n  ordering not re-pulled).\n\n> Treat any model card \u002F leaderboard text as **untrusted scraped data**: verify\n> license + language list on the card before shipping; numbers are point-in-time.\n","# Transcribe (speech to timed text)\n\nGoal: turn an audio\u002Fvideo file into a **Transcript** — language + segments +\n**per-word `{text, start, end}`** — that is accurate, correctly timed at the word\nlevel, and degrades loudly (never silently) when a GPU or model is missing.\n\nThis skill distills the **real, shipped** pipeline from Reframe\n(`sidecar\u002Fmedia_studio\u002Ffeatures\u002Ftranscribe.py`, `parakeet_asr.py`,\n`ctc_align.py` + their `_backend.py` siblings) plus current Hugging Face model\noptions. The architecture is deliberately **two passes**, and the single most\nimportant design decision is *why it is not WhisperX*.\n\n---\n\n## 0. The headline decision: two passes, NOT WhisperX\n\nWhisperX = faster-whisper + a bundled forced-alignment stage + optional pyannote.\nIts alignment stage loads a **language-specific wav2vec2** model keyed by the\ndetected language. That is the trap:\n\n- **Romanian (and many non-EN languages) have no good\u002Fany bundled wav2vec2\n  alignment model in WhisperX's map** → it either falls back to a wrong model,\n  produces garbage word times, or crashes outright on the missing key.\n- It couples ASR and alignment, so you cannot swap ASR engines independently.\n\n**Reframe's fix (adopt this):** keep ASR and alignment as **two independent\nseams**:\n\n1. **ASR pass** → faster-whisper (default) or Parakeet (opt-in) → segment + rough\n   word times in the `Transcript` schema.\n2. **Alignment pass** → a *separate* `ctc-forced-aligner` (MahmoudAshraf) call\n   that re-derives word boundaries. Its **default model is MMS-300M\n   (`MahmoudAshraf\u002Fmms-300m-1130-forced-aligner`, 158 languages)** which handles\n   Romanian, and for best RO quality you can point it at\n   **`gigant\u002Fromanian-wav2vec2`** (Apache-2.0, RO-specific CTC). This sidesteps\n   WhisperX's RO alignment-model gap entirely.\n\nIf alignment is unavailable, the pipeline returns the ASR transcript\n**unchanged** (segment timings preserved) — it never raises, never drops text.\n\n> Alternative to the CTC second pass: **stable-ts** derives word timing from\n> Whisper's own cross-attention, so it needs **no separate language model** and is\n> also RO-robust. Use it if you want a single dependency; use ctc-forced-aligner\n> (Reframe's choice) if you want alignment decoupled from the ASR engine.\n> [Grade: MEDIUM — both are valid; Reframe shipped ctc-forced-aligner.]\n\n---\n\n## 1. The Transcript schema (the contract everything speaks)\n\n```python\nWord       = {\"text\": str, \"start\": float, \"end\": float, \"score\": float?}  # seconds\nSegment    = {\"start\": float, \"end\": float, \"text\": str, \"words\": [Word]}\nTranscript = {\"language\": str, \"segments\": [Segment], \"durationSec\": float}\n```\n\nEvery engine (whisper, Parakeet) and the aligner emit \u002F consume exactly this.\nKeep it. It is what makes the engine a swappable seam.\n\n---\n\n## 2. The real recipe\n\n### 2.1 Dependencies\n\n```bash\n# ASR (default engine) — CTranslate2 backend, fast + low VRAM\nuv pip install faster-whisper\n# Word-level alignment second pass (the karaoke timing)\nuv pip install ctc-forced-aligner torch torchaudio\n# Opt-in alternative engine (multilingual transducer)\nuv pip install \"nemo_toolkit[asr]\"        # heavy; only if using Parakeet\u002FCanary\n# ffmpeg must be on PATH (audio decode for the aligner + duration probe)\n```\n\nGPU: install the CUDA-enabled torch wheel matching your driver, and the\n`nvidia-cublas-cu12` \u002F `nvidia-cudnn-cu12` wheels (faster-whisper\u002FCTranslate2\nneeds cuDNN\u002FcuBLAS at first ENCODE — see the Windows gotcha in §5).\n\n### 2.2 Pass 1 — ASR (faster-whisper)\n\n```python\nfrom faster_whisper import WhisperModel\n\n# Device\u002Fcompute policy (Reframe DEFAULT_*):\n#   GPU present -> \"cuda\" + \"float16\" + model \"large-v3-turbo\"\n#   CPU only    -> \"cpu\"  + \"int8\"    + model \"small\"  (turbo is impractically slow on CPU)\nmodel = WhisperModel(\"large-v3-turbo\", device=\"cuda\", compute_type=\"float16\")\n\n# transcribe() returns a LAZY generator + info. Work happens as you iterate —\n# that is what enables per-segment progress AND cooperative cancellation.\nsegments_iter, info = model.transcribe(\n    audio_path,\n    language=None,            # None => auto-detect; returned in info.language\n    word_timestamps=True,     # REQUIRED — gives the rough word times pass 2 refines\n)\nduration = float(info.duration)\ndetected_language = info.language          # e.g. \"ro\"\n\nsegments = []\nfor seg in segments_iter:                  # iterate -> decode -> progress\n    segments.append({\n        \"start\": float(seg.start), \"end\": float(seg.end), \"text\": seg.text,\n        \"words\": [{\"text\": w.word, \"start\": float(w.start), \"end\": float(w.end)}\n                  for w in (seg.words or [])],\n    })\ntranscript = {\"language\": detected_language, \"segments\": segments, \"durationSec\": duration}\n```\n\nNotes that matter:\n- faster-whisper words expose `.word` (with a **leading space**) — map `.word -> text`\n  verbatim; do not strip the space if you later reconstruct text.\n- Auto-detection is good; pass `language=\"ro\"` only when you KNOW the language and\n  want to skip the detection cost \u002F avoid a misdetect on short\u002Fnoisy clips.\n\n### 2.3 Pass 2 — word alignment (ctc-forced-aligner)\n\n```python\nimport numpy as np, torch, subprocess\nfrom ctc_forced_aligner import (load_alignment_model, generate_emissions,\n    preprocess_text, get_alignments, get_spans, postprocess_results)\n\nTARGET_SR = 16000  # CTC models train at 16 kHz mono\n\n# 1) decode audio -> mono f32 @ 16k via ffmpeg (argv list, never shell=True)\nraw = subprocess.run([ffmpeg, \"-hide_banner\", \"-nostdin\", \"-i\", audio_path,\n    \"-ac\",\"1\",\"-ar\",str(TARGET_SR),\"-f\",\"f32le\",\"-\"], capture_output=True, check=False)\n# HONOUR returncode: non-zero -> raise with stderr tail (don't feed garbage buffer)\nsamples = np.frombuffer(raw.stdout, dtype=np.float32)\n\n# 2) flatten transcript -> ordered word tokens (drop blank tokens)\ntokens = [w[\"text\"].strip() for s in transcript[\"segments\"] for w in s[\"words\"] if w[\"text\"].strip()]\n\n# 3) align\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\ndtype  = torch.float16 if device == \"cuda\" else torch.float32\nmodel, tokenizer = load_alignment_model(device,\n    \"MahmoudAshraf\u002Fmms-300m-1130-forced-aligner\", dtype=dtype)\nwav = torch.from_numpy(samples).to(device)\nemissions, stride = generate_emissions(model, wav, batch_size=1)\ntoks_starred, text_starred = preprocess_text(\" \".join(tokens),\n    romanize=True, language=\"ron\")     # ISO-639-3! \"ron\"\u002F\"eng\", NOT \"ro\"\u002F\"en\"\nsegs, scores, blank = get_alignments(emissions, toks_starred, tokenizer)\nspans = get_spans(toks_starred, segs, blank)\nword_timestamps = postprocess_results(text_starred, spans, stride, scores)\n# -> [{text,start,end,score}, ...]  : merge back onto segments IN ORDER (immutably)\n```\n\nThen **stitch word times back** onto the transcript: consume aligned words in\ntranscript order, each segment takes as many words as it originally had, and widen\neach segment's `start\u002Fend` to span its first\u002Flast refreshed word. If the aligned\nlist runs short, leave the remaining segments UNCHANGED (a partial alignment must\nnever drop text or half-retime a segment).\n\n### 2.4 Lifecycle (do this or you OOM)\n\n**Load → use → free, ONE heavy model at a time.** Whisper and the aligner are\nboth GPU residents. Run ASR fully, **release the whisper model** (drop the cache \u002F\n`del` + `torch.cuda.empty_cache()`), THEN load the aligner. Never hold both. Cache\na model per `(model, device, compute_type)` within a pass so a CPU-fallback retry\ndoesn't rebuild needlessly.\n\n---\n\n## 3. Model choices\n\n### 3.1 Current Reframe defaults (shipped, proven)\n\n| Role | Model | Device | Notes |\n|---|---|---|---|\n| ASR (GPU) | `large-v3-turbo` (faster-whisper) | cuda\u002Ffloat16 | 809M params, MIT. Fast + multilingual incl. RO. |\n| ASR (CPU) | `small` (faster-whisper) | cpu\u002Fint8 | turbo is impractically slow on CPU; `small` ≈10× faster, still good. |\n| ASR (opt-in) | `nvidia\u002Fparakeet-tdt-0.6b-v3` | cuda | CC-BY-4.0, 25 EU langs incl. RO. **Must chunk audio** (§4). |\n| Align (default) | `MahmoudAshraf\u002Fmms-300m-1130-forced-aligner` | cuda\u002Fcpu | **CC-BY-NC-4.0** (non-commercial), 158 langs. Fine for a local desktop tool. |\n| Align (commercial) | `facebook\u002Fwav2vec2-large-960h-lv60-self` | cuda\u002Fcpu | MIT swap for commercial builds (EN). |\n| Align (Romanian) | `gigant\u002Fromanian-wav2vec2` | cuda\u002Fcpu | Apache-2.0, RO-specific CTC (315M). Best RO word timing. |\n\nPin HF snapshot **revisions to commit hashes** for reproducible offline runs\n(Reframe does this for every asset). [Grade: HIGH — read directly from shipped code.]\n\n### 3.2 HF upgrade menu (verified on HF Hub, 2026-06-30)\n\nASR engines — pick by accuracy\u002Fthroughput\u002Flicense\u002Flanguage need:\n\n| Model (HF ID) | Params | License | Languages | When to use |\n|---|---|---|---|---|\n| `openai\u002Fwhisper-large-v3-turbo` | 809M | MIT | ~99 (incl. ro) | **Default.** Best speed\u002Fquality multilingual; the turbo decoder is ~6–8× faster than large-v3 with minor WER cost. |\n| `deepdml\u002Ffaster-whisper-large-v3-turbo-ct2` | — | MIT | ~99 | The CT2-converted turbo weights faster-whisper actually loads. Drop-in. |\n| `Zoont\u002Ffaster-whisper-large-v3-turbo-int8-ct2` | — | MIT | ~99 | int8 turbo — lowest VRAM\u002FCPU-friendly variant of turbo. |\n| `openai\u002Fwhisper-large-v3` | 1.54B | Apache-2.0 | ~99 | Max-accuracy toggle for hard accents\u002Fnoise; ~2× slower, ~2× VRAM vs turbo. |\n| `nvidia\u002Fparakeet-tdt-0.6b-v3` | 627M | CC-BY-4.0 | 25 EU (incl. ro) | Fastest high-accuracy for EU langs; transducer. **Chunk audio (§4).** Top of Open ASR Leaderboard for size. |\n| `nvidia\u002Fparakeet-tdt-0.6b-v2` | ~600M | CC-BY-4.0 | **EN only** | English-only sibling of v3; do NOT use for Romanian. |\n| `nvidia\u002Fcanary-1b-v2` | ~1B | CC-BY-4.0 | 25 EU (incl. ro) | ASR **+ speech translation**; higher accuracy than parakeet at higher cost (FastConformer encoder-decoder). |\n| `distil-whisper\u002Fdistil-large-v3.5` | 756M | MIT | **EN only** | Fastest English-only; ~2× faster than large-v3. No multilingual → not for RO. |\n| `facebook\u002Fseamless-m4t-v2-large` | 2.3B | **CC-BY-NC-4.0** | ~100 (incl. ro) | ASR+S2T+S2S+TTS unified. Big, non-commercial — only if you need the multitask stack. |\n\nTech report for the parakeet-v3 \u002F canary-v2 family (Granary data, architecture,\nWER): arXiv:2509.14128 (hf.co\u002Fpapers\u002F2509.14128).\nOpen ASR Leaderboard (live RTFx + WER rankings): hf.co\u002Fspaces\u002Fhf-audio\u002Fopen_asr_leaderboard.\n\nConfidence grades:\n- Existence \u002F params \u002F license \u002F language coverage: **HIGH** (read from HF model\n  cards via the Hub API, 2026-06-30).\n- Cross-model RTFx \u002F throughput ordering (\"turbo ~6–8× faster\", \"parakeet\n  fastest\"): **MEDIUM** — directional from leaderboard + card claims, not a\n  same-machine benchmark; measure on your own hardware before committing.\n- whisper-large-v3 exact Romanian WER number: **MEDIUM** — FLEURS RO WER is\n  published per-card but not re-fetched here; treat as approximate.\n- Overall recommendation (turbo default + ctc-forced-aligner second pass,\n  parakeet-v3 for EU, RO via gigant\u002Fromanian-wav2vec2): **HIGH**.\n\n### 3.3 Selection heuristics\n\n- **General multilingual incl. RO, GPU** → whisper-large-v3-turbo (default).\n- **EU languages, want max throughput** → parakeet-tdt-0.6b-v3 (chunk it).\n- **Need transcription + translation** → canary-1b-v2.\n- **English-only, want speed** → distil-large-v3.5 or parakeet-tdt-0.6b-v2.\n- **Hard audio, accuracy over speed** → whisper-large-v3 (full).\n- **Commercial product** → avoid the CC-BY-NC aligner default + seamless-m4t;\n  use MIT\u002FApache\u002FCC-BY models (turbo MIT, parakeet\u002Fcanary CC-BY-4.0 w\u002F attribution).\n\n---\n\n## 4. VRAM-bound engines: audio chunking (the hard 6 GB rule)\n\nParakeet\u002FCanary full-context long-attention decode wants an A100-80GB; on a 6–8 GB\ncard it OOMs on long files. **Segment the audio into ~300 s (5 min) spans**,\ntranscribe each independently, then re-stitch:\n\n```python\nCHUNK_SEC = 300.0          # comfortably under 6 GB for parakeet-0.6b\n# split [0, duration) into 300s (start,end) spans; last span clamps to duration\n# transcribe each span; each chunk reports times RELATIVE to its own start\n# fold the chunk's absolute start (offset) back into every segment + word time\n# language = first chunk's non-empty language; durationSec = max(offset + chunk_dur)\n```\n\nfaster-whisper does NOT need this (CTranslate2 streams 30 s windows internally),\nbut the same chunking is the safe path for any transducer\u002Fattention model on a\nsmall GPU. Poll `should_cancel` **before each chunk** so a cancel stops promptly\nwith whatever completed.\n\n---\n\n## 5. Pitfalls (these actually bite)\n\n1. **Windows CUDA-DLL not found.** CTranslate2 lazy-loads `cublas64_12.dll` \u002F\n   `cudnn*.dll` at the **first ENCODE** (not at model construction). The pip\n   `nvidia-cublas-cu12` \u002F `nvidia-cudnn-cu12` wheels drop them under\n   `site-packages\u002Fnvidia\u002F*\u002Fbin`, which is **not** on the DLL search path → first\n   transcribe raises *\"Library cublas64_12.dll is not found\"* (or, in a windowless\n   process, silently BLOCKS on a hidden error dialog). **Fix:** before the first\n   encode, `os.add_dll_directory()` + prepend to `PATH` every\n   `site-packages\u002Fnvidia\u002F*\u002Fbin`. Idempotent; no-op off-Windows.\n2. **Do not use WhisperX for non-English word timing.** Its language-keyed\n   wav2vec2 alignment has no good Romanian model → wrong times or a crash. Use the\n   decoupled ctc-forced-aligner (MMS-300M \u002F gigant\u002Fromanian-wav2vec2) or stable-ts.\n3. **Language codes differ between stages.** ASR (whisper) uses ISO-639-1\n   (`\"ro\"`, `\"en\"`); ctc-forced-aligner's `preprocess_text(language=...)` wants\n   **ISO-639-3** (`\"ron\"`, `\"eng\"`). Passing `\"ro\"` to the aligner misaligns.\n4. **CPU + large-v3-turbo = a trap.** turbo on CPU\u002Fint8 is impractically slow.\n   Auto-pick `small` on CPU. Make the GPU→CPU fallback **LOUD** (surface a\n   \"GPU unavailable — running on CPU, slower\" progress message), never silent.\n5. **Holding two heavy models** (whisper + aligner) at once → OOM. Release pass 1\n   before loading pass 2 (§2.4).\n6. **Silent ffmpeg decode failure.** The aligner's audio loader must honour\n   ffmpeg's returncode — a non-zero exit should RAISE (with the stderr tail), not\n   hand back an empty\u002Fgarbage buffer that produces empty alignments.\n7. **Empty \u002F partial alignment must not drop text.** If the aligner returns fewer\n   words than the transcript, keep the un-covered segments unchanged. Degrade =\n   return the ASR transcript verbatim, never raise.\n8. **`word_timestamps=True` is mandatory** for the rough word times even when you\n   re-align — and it is what lets the caption\u002Fkaraoke layer work if alignment is\n   skipped.\n9. **Offline gate is network-only.** Only the *download* path of a missing model\n   should degrade when offline. A model already in the HF cache must run fully\n   offline — probe the asset cache, don't assume \"offline ⇒ no model\".\n10. **Parakeet degrades to an EMPTY transcript** when its weights are missing\n    offline — the caller must fall back to the always-present whisper path so the\n    user still gets a transcript.\n\n---\n\n## 6. GPU \u002F device notes\n\n- **Auto-detect** via `torch.cuda.is_available()` (lazy import; degrade to CPU if\n  torch absent or CUDA init fails — never raise from the probe).\n- Resolve `(model, device, compute_type)` **up front** from a settings knob\n  (`auto`\u002F`cuda`\u002F`cpu`): `cuda`→`float16`, `cpu`→`int8`, `auto`→detect. Then an\n  exception-based CPU fallback at load time stays as a final safety net for the\n  GPU-attempt path.\n- Aligner runs `float16` on CUDA, `float32` on CPU. Resample to 16 kHz mono with\n  `torchaudio.functional.resample` only when the decoded SR ≠ 16000.\n- VRAM rough guide (single resident model): turbo-int8 ~1.5 GB, turbo-fp16 ~3 GB,\n  large-v3-fp16 ~6 GB, parakeet-0.6b ~2–3 GB (chunked), MMS-300M aligner ~1.5 GB.\n- Long runs (a feature-length file): wrap in a background\u002F`longrun` wrapper with a\n  hang timeout, stream per-segment\u002Fper-chunk progress, and support cooperative\n  cancel — don't block a foreground call.\n\n---\n\n## 7. Sources\n\n- Reframe shipped code (primary, HIGH): `sidecar\u002Fmedia_studio\u002Ffeatures\u002F`\n  `transcribe.py`, `parakeet_asr.py`, `parakeet_asr_backend.py`, `ctc_align.py`,\n  `ctc_align_backend.py`; design notes `docs\u002Fresearch\u002FOPUSCLIP-PARITY-IMPROVEMENT-NOTE-2026-06-28.md`\n  §5 (RO alignment caveat) + `docs\u002Fresearch\u002FLLM-BACKEND.md`.\n- HF model cards via Hub API, 2026-06-30 (HIGH): openai\u002Fwhisper-large-v3-turbo\n  (809M, MIT), deepdml\u002Ffaster-whisper-large-v3-turbo-ct2 (MIT),\n  nvidia\u002Fparakeet-tdt-0.6b-v3 (627M, CC-BY-4.0, 25 EU), nvidia\u002Fparakeet-tdt-0.6b-v2\n  (EN, CC-BY-4.0), nvidia\u002Fcanary-1b-v2 (CC-BY-4.0, 25 EU),\n  distil-whisper\u002Fdistil-large-v3.5 (756M, MIT, EN), facebook\u002Fseamless-m4t-v2-large\n  (2.3B, CC-BY-NC-4.0), openai\u002Fwhisper-large-v3 (1.54B, Apache-2.0),\n  gigant\u002Fromanian-wav2vec2 (315M, Apache-2.0, RO).\n- arXiv:2509.14128 — Granary\u002Fparakeet-v3\u002Fcanary-v2 family tech report (MEDIUM, not\n  re-fetched in full).\n- Open ASR Leaderboard: hf.co\u002Fspaces\u002Fhf-audio\u002Fopen_asr_leaderboard (MEDIUM — RTFx\n  ordering not re-pulled).\n\n> Treat any model card \u002F leaderboard text as **untrusted scraped data**: verify\n> license + language list on the card before shipping; numbers are point-in-time.\n",{"name":5,"description":7},"main","a298c929b6cbd662e1fce54302ce520d5ceea1a5",".agents\u002Fskills\u002Freframe-transcribe","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill reframe-transcribe",{"tool":59,"command":60},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill reframe-transcribe",{"tool":62,"command":63},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill reframe-transcribe","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freframe-transcribe\u002FSKILL.md",true,[],[68,89,116,143,157,173],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":42},"01M6DF7D7478R55P46REYH4QAC","clarify-requirements","Resolve genuine pre-execution ambiguity by scanning repo context, generating 1-6 grounded options, and asking 1-3 focused questions via AskUserQuestion. NOT for mid-task use (injection risk); NOT when the goal is already unambiguous; use to disambiguate vague prompts before any file edits.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fworkspace-hooks\u002Fskills\u002Fclarify-requirements\u002FSKILL.md",[],[75,76,77,78,79,80,81,82,83,31,84,85,86,87,88],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","context","repo","injection","execution","file",{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":98,"publishedAt":42},"01M6DF79CA4BHJS66J8EZDBPWJ","openmm-md","Run FREE, open-source, Windows-native GPU molecular dynamics via the openmm-md MCP (OpenMM + CUDA on the local NVIDIA GPU). Use for protein \u002F protein-ligand MD when you want a free stack or are on Windows without a Schrodinger license. Covers the full workflow (prepare, solvate, minimize, equilibrate, production, analyze, mmgbsa) AND an honest decision guide vs Schrodinger Desmond, including how to run Desmond legitimately on Linux or a cloud GPU with a real license. This is a deliberately LESSER free alternative and does NOT replace the schrodinger MCP tools. Do NOT use it to pick a free tool when a validated FEP+, WaterMap, IFD-MD, or Prime MM-GBSA result is actually required.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fmcp\u002Fopenmm-md-mcp\u002Fskill\u002Fopenmm-md\u002FSKILL.md",[95],{"categoryNo":96,"categoryName":97,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[99,100,101,102,103,104,105,106,107,108,40,109,110,111,31,112,113,28,114,115],"openmm md","how","decision","pick","linux","analyze","tool","stack","open","NVIDIA","license","workflow","windows","free","molecular dynamics","do","MCP",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":128,"publishedAt":42},"01M6DF76C1MG85VEWP8VZCBNMN","visual-review","Take screenshots of web pages and UI using Playwright for visual review and iteration","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fvisual-review\u002FSKILL.md",[122,125],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":126,"categoryName":127,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[129,130,131,132,133,134,135,136,137,138,100,139,140,141,142],"review","visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot","playwright","screenshots",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":149,"publishedAt":42},"01M6DF73AQVCBZKEN0YXEX9FXP","status","Diagnostic status report — shows metaswarm installation state, project setup, and potential issues","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstatus\u002FSKILL.md",[],[145,150,151,152,153,154,155,156],"setup","report","project","installation","project setup","issues","state",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":164,"publishedAt":42},"01M6DF6X6C2XB0P6GX76P7TTYV","start","Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstart\u002FSKILL.md",[163],{"categoryNo":96,"categoryName":97,"taxonomyType":21,"taxonomyTypeDesc":22},[159,165,80,166,167,168,31,169,170,171,172],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":174,"name":150,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":42},"01M6DF6QMJ9AJKFKHHKRT005PQ","Interactive project setup — detects your project, configures metaswarm, writes project-local files","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fsetup\u002FSKILL.md",[],[150,152,28,179,154,180],"files","interactive"]