Added
vkit show <pipeline.yaml>: pretty-print a pipeline as an operator
chain with each stage's declarative field contract (reads / writes /
optional_reads / clears) inline — same data the pre-flight uses,
surfaced so users can see what a pipeline does without scanning raw
YAML. Distinguishes "operator not importable here" from "operator
declares no static contract" so the visualisation reads as
intentional.vkit initnow scaffolds a richer starter:data/.gitkeepso the
directory survivesgit add, inline comments in the default
pipeline.yamlexplaining each stage and pointing at
vkit operatorsfor discovery, a step-numbered "Next steps"
output that walks users throughshow → validate → docker run,
and a README listing the full iteration loop including
vkit cardandvkit datasets.vkit validate --tag <image>(andvkit docker run) now run an
op-vs-image pre-flight check: before launching a container they verify
every operator in the pipeline is actually present in the target image,
cross-checking the image's bakedop_env_map.json. A pipeline that
references an operator the image doesn't ship fails fast on the host with
an actionable message instead of deep inside the container. Pass
--no-preflightto skip.
Changed
-
vkit inspect cuts: empty / directory paths now produce a friendly
error with a hint instead of a Python traceback. Previously
Path("")collapsed toPath(".")whose.exists()returned True
but isn't a valid gzip stream, so the loader crashed. -
vkit validate: Pydantic config errors are rendered as a short
bullet list rather than the rawerrors.pydantic.devmulti-line
dump;extra_forbiddenrows get adid you meanhint via stdlib
difflibwhen one of the operator's known fields is close enough
(e.g.target_channel→target_channels). -
vkit doctor --expectnow accepts image tags as well as env-group
names:--expect slimis an alias for thecoregroup, matching the
published image tags users actually pull. -
vkit datasets: terminal browser for the dataset catalog —vkit datasets
(filterable table;--task/--language/--recipe-only/--querycompose),
vkit datasets show <id>(Rich panel with all fields + download hint when
recipe-backed),vkit datasets search <substring>(id/name/summary match).
load_catalog()now skips the repo-relative pipeline existence check in
installed (wheel) mode so the CLI works outside the source checkout. -
Weekly
extras-ciGitHub Actions workflow that installs the heavy operator
extras (asr/diarize/codec/tts-kokoro) the mainciworkflow
doesn't install, and runs the previously-SKIPPED tests against them. Surfaces
upstream version drift like the encodec EncodedFrame change that previously
hid for an unknown stretch. Matrix isfail-fast: falseso one broken
cluster doesn't block the others; alsoworkflow_dispatch-triggerable. -
Four new ingest recipes (catalog count of recipe-backed datasets grows
9 → 13):libritts_r(LibriTTS-R, en, CC BY 4.0),hifitts(Hi-Fi TTS,
en multi-speaker, CC BY 4.0),thchs30(THCHS-30, zh, Apache-2.0),
thorsten_voice(Thorsten-Voice 2021.02 neutral, de, CC0-1.0). All four
are now downloadable viavkit docker download <name> --root <dir>and
parseable viavkit ingest --source recipe --recipe <name>. The matching
catalog entries flip frommanualtorecipe-backed; the docs index now
shows "Access: recipe" with the OpenSLR size range. -
vkit card <cuts.jsonl.gz>: generate a standalone, shareable HTML dataset
card (quality distributions, language/gender breakdowns, metrics summary, and
sample utterances) from a processed CutSet. Uses thevizextra.
Pass--catalog-id <id>to auto-fill title, description, and a Source section
(license, homepage, paper, recommendation) fromvoxkitchen/datasets/catalog.yaml. -
Third-party operator plugins: install a package exposing operators via the
voxkitchen.operatorsentry-point group and they are discovered, listed by
vkit operators/vkit doctor, and usable in pipelines. Added
OPERATOR_API_VERSION, a plugin authoring guide, and an example package
(examples/plugin-operator/). -
Dataset catalog (
docs/datasets/): a decision-support catalog of speech
datasets generated fromvoxkitchen/datasets/catalog.yaml, with per-dataset
recommendations, access links, and (where available) a download recipe and a
suggested processing pipeline. Searchable via the docs site; browse by task.
Now 60 entries — added (most recent batch) VoxCeleb1, TIMIT, MGB-2 (Arabic),
SEAME (zh-en code-switching), Earnings-21, MyST (children's speech), AVSpeech
(audio-visual), Opencpop (zh singing), DiPCo (far-field), SLUE (spoken
language understanding); previously THCHS-30, MagicData-RAMC, Shrutilipi,
AISHELL-2, JSUT, Thorsten-Voice, LibriTTS-R, MELD, MSP-IMPROV, IMDA NSC. -
Declarative field contracts (
reads/writes/optional_reads/clears) on
every operator, making data-flow dependencies machine-readable. -
Static pre-flight validation in
vkit validateand as a fail-fast gate before
everyvkit run/vkit docker run(and in--dry-run): broken operator
chains — a stage requiring a field no upstream stage produces, or a
quality_score_filtercondition referencing an absent metric — are reported
before the executor starts, not mid-run. Pass--no-preflighttovkit validate,vkit run, orvkit docker run(forwarded to the in-container
run) to skip the check. -
normalize_textoperator: strips model-specific markup (e.g. SenseVoice
emotion/language tags) and collapses whitespace (e.g. Paraformer
inter-character spaces) in ASR transcripts before downstream use. -
pack_jsonlnow exportsword_alignmentswhen present on a cut. -
Simplified Chinese README (
README.zh-CN.md), a full translation of
the top-level README. The English and Chinese READMEs cross-link each
other in the header; all deeper docs remain English-only. -
Both READMEs now show a collapsed "Example output" block under Quick
Start with the actualvkit docker run+vkit inspect runlogs for
the bundleddemo-no-asrpipeline. -
CITATION.cffand a "Citation" section in both READMEs, so GitHub
renders a "Cite this repository" entry for research use. -
scripts/release.sh <version> --docker-onlyskips the tag + git push
steps and goes straight to the Docker build/push loop. Useful when
PyPI publish already succeeded from an earlier run (or from a
different machine) and you only need to (re)build the GHCR images.
Mutually exclusive with--replace-unpublished. Pre-flight CHANGELOG
and CI checks still run because the Docker build bakes the current
source into the image.
Changed
- Dropped the "Pre-alpha" status banner from the README and bumped the
PyPIDevelopment Statusclassifier from2 - Pre-Alphato
4 - Betato match the current v0.3.x surface. vkit run --dry-run(andvkit docker run --dry-run) clarifies its
GPU reporting. Thegpus:header line is now labelled(requested),
and when any stage prefers the GPU executor the stage table is
followed by a note that the Device column shows the preferred
executor —gpustages run on GPU when one is available and fall back
to CPU otherwise. This removes the confusion where agpustage such
assilero_vadappeared to require a GPU even though it runs fine on
the CPU-onlyslimimage.
Fixed
tts-data-preptemplate now normalizes text and performs forced alignment as
its documentation claims; previously it declared word-level alignment but ran
neither step. The ASR stage no longer performs a redundant internal alignment
pass.- Capped
numpy<2.3in thedevoptional-dependency group.numba
(pulled in bylibrosavia thesegmentextra) supportsnumpy<=2.2,
so a freshpip install -e .[dev]on a host with a newer NumPy failed
to importlibrosaand broke local test collection. The core
numpy>=1.24runtime bound is unchanged. utmos_scorenow produces real scores. The operator imported
speechmos.utmos, a modulespeechmoshas never shipped (it provides
aecmos/dnsmos/plcmos only), so the import failed unconditionally. UTMOS22
is now loaded viatorch.hubfromtarepan/SpeechMOS:v1.2.0, which needs
onlytorch(present in every image, includingslim).tts_cosyvoicedefaultmodel_idis nowiic/CosyVoice2-0.5B. The old
defaultFunAudioLLM/CosyVoice2-0.5Bwas removed from ModelScope (404 on
both endpoints), so the operator failed at setup for anyone relying on the
default.tts_fish_speechno longer crashes with a dtype mismatch
(Input type (float) and bias type (c10::BFloat16) should be the same).
The float32 reference audio was fed to the bfloat16 DAC encoder; inference
is now wrapped intorch.autocastso the cast happens automatically.- TTS and forced-alignment operators no longer silently swallow per-cut
failures. They previously caught their own exceptions and dropped the cut,
hiding errors from the executor's per-cut fallback. Failures now propagate,
are recorded to<stage>/_errors.jsonl, and trigger a warning when a stage
drops 100% of its input cuts — so "pipeline complete, 0 cuts out" is no
longer silent. read_cutsnow warns when a manifest line is malformed or missing its
__type__marker instead of silently skipping it, so user-built manifests
that produced "0 cuts in" now explain why.speechbrain_langidnow writes a real language instead ofNonefor every
input. The VoxLingua107 model emits"<iso>: <name>"labels (e.g.
"en: English"); the operator passed the raw label tonormalize_language,
which couldn't parse it, so thelanguagefield was alwaysNone. It now
extracts the ISO code before normalizing.wenet_asris now installed reliably and is part of the guaranteedasr
image. wenet has no PyPI release and its repo's.gitmodulesreferences a
URL-less submodule, so the previousgit+httpsinstall failed
(git submodule update --initaborted) and the operator was silently
absent. It's now cloned without submodules at a pinned commit and installed
from the local checkout, with the asr constraint keeping torch at 2.4.1
(newer torch dropped a private re-export wenet imports). The default model
also moved fromchinesetowenetspeech— wenet removed the
chinese/englishhub aliases, so the old default failed with
train.yaml not found. (transcribe(engine="wenet")updated to match.)