From 7b1d4b09f20f295d8005c25df57a00289ce650c3 Mon Sep 17 00:00:00 2001 From: CJ Pais Date: Thu, 30 Jul 2026 01:51:56 -0700 Subject: [PATCH 1/3] generally working offline multitalker --- .../multitalker-parakeet-streaming-0.6b-v1.md | 84 ++- samples/multitalker-2spk-mix.wav | Bin 0 -> 448044 bytes scripts/compose-multitalker-bundle.py | 144 ++++ scripts/diar/ingest_ami_seglst.py | 154 ++++ scripts/diar/modal_multitalker_cpp.py | 139 ++++ scripts/diar/modal_multitalker_ref.py | 127 ++++ scripts/diar/run_cpp_multitalker.py | 118 +++ scripts/diar/score_cpwer.py | 126 ++++ scripts/dump_reference_multitalker_nemo.py | 320 ++++++++ scripts/envs/sortformer/pyproject.toml | 1 + scripts/envs/sortformer/uv.lock | 38 + scripts/gen_multitalker_oracle_audio.py | 112 +++ src/CMakeLists.txt | 1 + src/arch/parakeet/encoder.cpp | 106 ++- src/arch/parakeet/encoder.h | 36 +- src/arch/parakeet/model.cpp | 246 +++++- src/arch/parakeet/multitalker.cpp | 703 ++++++++++++++++++ src/arch/parakeet/parakeet.h | 89 +++ src/arch/sortformer/model.cpp | 382 ++++++---- src/arch/sortformer/sortformer.h | 111 ++- src/arch/sortformer/weights.cpp | 30 +- src/arch/sortformer/weights.h | 8 +- tests/CMakeLists.txt | 19 + .../golden/parakeet/multitalker-2spk-mix.rttm | 3 + tests/parakeet_multitalker_e2e_smoke.cpp | 169 +++++ 25 files changed, 3066 insertions(+), 200 deletions(-) create mode 100644 samples/multitalker-2spk-mix.wav create mode 100644 scripts/compose-multitalker-bundle.py create mode 100644 scripts/diar/ingest_ami_seglst.py create mode 100644 scripts/diar/modal_multitalker_cpp.py create mode 100644 scripts/diar/modal_multitalker_ref.py create mode 100644 scripts/diar/run_cpp_multitalker.py create mode 100644 scripts/diar/score_cpwer.py create mode 100644 scripts/dump_reference_multitalker_nemo.py create mode 100644 scripts/gen_multitalker_oracle_audio.py create mode 100644 src/arch/parakeet/multitalker.cpp create mode 100644 tests/golden/parakeet/multitalker-2spk-mix.rttm create mode 100644 tests/parakeet_multitalker_e2e_smoke.cpp diff --git a/docs/models/multitalker-parakeet-streaming-0.6b-v1.md b/docs/models/multitalker-parakeet-streaming-0.6b-v1.md index 44d1fc0c..25c8c67e 100644 --- a/docs/models/multitalker-parakeet-streaming-0.6b-v1.md +++ b/docs/models/multitalker-parakeet-streaming-0.6b-v1.md @@ -12,13 +12,15 @@ RNN-T decoding. Outputs cased, punctuated transcripts. Token- and word-level timestamps are available. Upstream this is a **multitalker (speaker-attributed)** checkpoint: it can -transcribe several overlapping speakers into per-speaker channels. That -path depends on machinery this port does **not** ship (see -[Known limitations](#known-limitations)). transcribe.cpp exposes only the -model's `single_speaker_mode` ASR path, which disables the multitalker -machinery and runs the checkpoint as a cache-aware streaming RNN-T with -the base model's frontend, encoder backbone, decoder, and tokenizer plus -the checkpoint's always-on layer-0 speaker-kernel injection. +transcribe several overlapping speakers into per-speaker channels. This +port ships that path too, via **bundle GGUFs** that embed the +[`nvidia/diar_streaming_sortformer_4spk-v2.1`](https://huggingface.co/nvidia/diar_streaming_sortformer_4spk-v2.1) +streaming diarizer alongside the ASR model. A plain (non-bundle) GGUF runs +the model's `single_speaker_mode` ASR path — a cache-aware streaming RNN-T +with the checkpoint's always-on layer-0 speaker-kernel injection. A bundle +GGUF with `--diarize` runs the full multitalker pipeline and emits a +speaker-tagged transcript (see +[Multitalker](#multitalker-speaker-attributed-asr)). This port runs the model in both **offline** and **cache-aware streaming** modes. @@ -165,20 +167,64 @@ CPU same-length tensor parity is bit-exact (max_abs 0.0) at batch=4 on `jfk.wav`, diverse-length flash tensor parity is bit-exact across arbitrary length mixes, and full test-clean batch-8 WER equals batch-1 (2.19%). +## Multitalker (speaker-attributed ASR) + +A **bundle GGUF** (composed by `scripts/compose-multitalker-bundle.py`) +embeds the streaming Sortformer diarizer. Running it with `--diarize` +produces a speaker-tagged transcript (speaker ids on segments/words; up to +4 speakers): the embedded diarizer streams over the clip at the reference +operating point (14-frame chunks, spkcache/FIFO 188), per-chunk cache +gating selects which speakers are active, and each active speaker gets a +private cache-aware streaming encoder+decoder instance fed only its active +chunks — memory is O(1) in clip length (~5 MB per speaker), so hour-scale +meetings run in bounded memory. + +Two supervision modes, selected via `TRANSCRIBE_MULTITALKER_MODE`: + +- **kernel** (default): trained speaker-kernel injection at conformer + layer 0 (`masked_asr=False` upstream). Audio is unmodified; the model + suppresses non-target speech. +- **masked**: mel feature masking (`masked_asr=True`, the NeMo example + default). Non-target frames are zero-masked before pre-encode. + +cpWER on ami-ihm-test (16 meetings, meeteval, refs from `edinburghcstr/ami` +segment transcripts; NeMo baseline = the pinned reference pipeline on +L40S, batch 1): + +| system | kernel | masked | +| --- | ---: | ---: | +| transcribe.cpp (CUDA F32) | **19.35%** | 23.73% | +| NeMo reference | 21.39% | 24.00% | +| NVIDIA self-reported | 21.26% | — | + +Kernel mode is the default because it wins on both implementations. The +C++ kernel number is *better* than the reference for a verified reason: +the reference harness has a background-slot indexing bug +(`get_active_speakers_info` builds `inactive_speaker_ids` from +`range(len(active))` minus a slot id), confirmed at tensor level from the +reference's own supervision dumps. With +`TRANSCRIBE_MULTITALKER_REF_BG_COMPAT=1` (parity tooling only) the port +reproduces that bug and scores 21.23% — matching the reference (and +NVIDIA's published 21.26%). Under matched configuration both modes are +transcript-exact vs the reference on CPU F32 (0 differing words on a +3-minute 4-speaker AMI slice); on long meetings a measured ~3e-5 F32 pred +drift eventually flips near-tie top-k picks inside the diarizer's +spkcache compression (a discontinuous selection both sides implement +bit-identically vs a neutral arbiter), after which trajectories diverge +benignly (~0.4 cpWER on the affected meeting). + +`TRANSCRIBE_MULTITALKER_OFFLINE=1` selects the older offline whole-clip +replay instead of the streaming pass (parity/dump tooling; attention +buffers grow quadratically with clip length — do not use on meetings +longer than ~15 minutes). + ## Known limitations -- **Single-speaker only. The multitalker / speaker-attributed ASR path is - not ported.** Upstream, this checkpoint transcribes several overlapping - speakers into per-speaker channels. That path requires (1) an external - streaming speaker-diarization model - ([`nvidia/diar_streaming_sortformer_4spk-v2.1`](https://huggingface.co/nvidia/diar_streaming_sortformer_4spk-v2.1), - a separate Sortformer checkpoint that this repo does not ship), (2) - per-frame speaker-kernel injection driven by that diarizer's supervision, - (3) one encoder+decoder instance per speaker (up to 4), and (4) a - speaker-tagged SegLST output contract. None of these exist in - transcribe.cpp today, so the port runs `single_speaker_mode` and produces - a single flat transcript. It does **not** separate speakers, diarize, or - emit speaker turns. +- **Multitalker is offline-API only.** `--diarize` on a bundle runs the + streaming pipeline internally, but the public streaming API + (`stream_feed`) still exposes single-speaker transcription only; a + per-speaker streaming text ABI is future work. `run_batch` on a bundle + warns and runs single-speaker. - **English only.** The model is English-only by training. - **No translation and no language detection.** diff --git a/samples/multitalker-2spk-mix.wav b/samples/multitalker-2spk-mix.wav new file mode 100644 index 0000000000000000000000000000000000000000..35ea11c48ae2ebde729158a2047e0e13c7af660b GIT binary patch literal 448044 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 z%0D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 w + stt.parakeet.diarizer.tensor_prefix = 'sortformer.' + stt.sortformer.* copied verbatim + The diarizer's frontend KVs are NOT copied: this pairing shares + one mel frontend (both are 128-mel, 16 kHz, hann/512/400/160, + normalize=none, same dither/pre-emphasis) and the compose step + VERIFIES that agreement instead of duplicating the keys. + tensors every ASR tensor verbatim, then every diarizer tensor renamed + with the 'sortformer.' prefix (the diarizer reuses Parakeet's + NEST encoder, so its enc.* names collide with the ASR's own + enc.* catalog without the prefix). + +The C++ parakeet loader materializes and uploads every tensor in the file +and resolves its catalog by name, so a bundle loads and runs the shipped +single-speaker path unchanged even before the multitalker composition code +exists; the sortformer.* tensors ride along for it to claim. + +Dtype policy mirrors the shipped matrices: the ASR half may be any shipped +quant; the diarizer half should be F32/F16/Q8_0 only (sortformer k-quants +are withdrawn). Pick the diarizer file explicitly per bundle tier. + +Usage (any env with gguf, e.g. the moonshine or sortformer env): + uv run --project scripts/envs/moonshine scripts/compose-multitalker-bundle.py \ + models/multitalker-parakeet-streaming-0.6b-v1/multitalker-parakeet-streaming-0.6b-v1-F32.gguf \ + models/diar_streaming_sortformer_4spk-v2.1/diar_streaming_sortformer_4spk-v2.1-F32.gguf \ + -o models/multitalker-parakeet-streaming-0.6b-v1/bundle/multitalker-parakeet-streaming-0.6b-v1-F32.gguf +""" + +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + +from gguf import GGUFReader, GGUFValueType + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from lib.gguf_common import gguf_writer # noqa: E402 + +DIAR_TENSOR_PREFIX = "sortformer." + +# KVs the two halves must agree on for the bundle to share one mel frontend. +FRONTEND_AGREEMENT_KEYS = [ + "stt.frontend.sample_rate", + "stt.frontend.num_mels", + "stt.frontend.n_fft", + "stt.frontend.hop_length", + "stt.frontend.win_length", + "stt.frontend.window", + "stt.frontend.normalize", + "stt.frontend.pre_emphasis", + "stt.frontend.dither", +] + +# Keys the GGUFReader synthesizes (virtual) or the writer emits itself. +SKIP_COPY_KEYS = {"general.architecture"} + + +def copy_kv(writer, field) -> None: + vtype = field.types[0] + sub_type = field.types[-1] if vtype == GGUFValueType.ARRAY else None + writer.add_key_value(field.name, field.contents(), vtype, sub_type=sub_type) + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("asr_gguf", help="multitalker Parakeet GGUF (any shipped quant)") + ap.add_argument("diar_gguf", help="Sortformer diarizer GGUF (F32/F16/Q8_0)") + ap.add_argument("-o", "--out", required=True, help="output bundle path") + args = ap.parse_args() + + asr = GGUFReader(args.asr_gguf) + diar = GGUFReader(args.diar_gguf) + + asr_arch = asr.fields["general.architecture"].contents() + diar_arch = diar.fields["general.architecture"].contents() + if asr_arch != "parakeet": + print(f"error: ASR input arch is '{asr_arch}', expected 'parakeet'", file=sys.stderr) + return 1 + if diar_arch != "sortformer": + print(f"error: diarizer input arch is '{diar_arch}', expected 'sortformer'", file=sys.stderr) + return 1 + if "stt.parakeet.encoder.spk_kernel_layers" not in asr.fields: + print("error: ASR input has no speaker-kernel tensors; not a multitalker checkpoint", file=sys.stderr) + return 1 + + # The bundle carries a single stt.frontend.* block (the ASR's). Refuse to + # compose a pairing whose diarizer disagrees with it rather than silently + # feeding the diarizer the wrong mel geometry. + for key in FRONTEND_AGREEMENT_KEYS: + a = asr.fields[key].contents() if key in asr.fields else None + d = diar.fields[key].contents() if key in diar.fields else None + if a != d: + print(f"error: frontend mismatch on {key}: asr={a!r} diar={d!r}", file=sys.stderr) + return 1 + + out_path = Path(args.out) + out_path.parent.mkdir(parents=True, exist_ok=True) + writer = gguf_writer(str(out_path), "parakeet") + + for name, field in asr.fields.items(): + if name.startswith("GGUF.") or name in SKIP_COPY_KEYS: + continue + copy_kv(writer, field) + + writer.add_bool("stt.parakeet.diarizer.embedded", True) + writer.add_string("stt.parakeet.diarizer.variant", diar.fields["stt.variant"].contents()) + writer.add_string("stt.parakeet.diarizer.tensor_prefix", DIAR_TENSOR_PREFIX) + for name, field in diar.fields.items(): + if name.startswith("stt.sortformer."): + copy_kv(writer, field) + + for t in asr.tensors: + writer.add_tensor(t.name, t.data, raw_dtype=t.tensor_type) + for t in diar.tensors: + writer.add_tensor(DIAR_TENSOR_PREFIX + t.name, t.data, raw_dtype=t.tensor_type) + + writer.write_header_to_file() + writer.write_kv_data_to_file() + writer.write_tensors_to_file() + writer.close() + + n_asr, n_diar = len(asr.tensors), len(diar.tensors) + print(f"wrote {out_path}: {n_asr} ASR + {n_diar} diarizer tensors ({n_asr + n_diar} total)") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/diar/ingest_ami_seglst.py b/scripts/diar/ingest_ami_seglst.py new file mode 100644 index 00000000..92b562d1 --- /dev/null +++ b/scripts/diar/ingest_ami_seglst.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python3 +""" +ingest_ami_seglst.py - build SegLST reference transcripts for the AMI +acceptance manifest. + +cpWER needs speaker-attributed reference TRANSCRIPTS; the +diarizers-community/ami dataset behind ingest_ami.py ships only RTTM +(speaker turns, no words). This pulls the per-segment manual transcripts +of edinburghcstr/ami via the HF datasets-server rows API (JSON, text +columns only — the parquet shards embed segmented audio and would cost +tens of GB of cache), groups them by meeting, and writes one SegLST JSON +per meeting, plus a manifest joining audio + rttm + seglst. + +Reads samples/diar/ami--.manifest.jsonl (ingest_ami.py) +Writes samples/diar/ami---seglst/.seglst.json + samples/diar/ami---mt.manifest.jsonl + +Usage: + uv run scripts/diar/ingest_ami_seglst.py --config ihm --split test +""" + +from __future__ import annotations + +import argparse +import json +import sys +import time +import urllib.parse +import urllib.request +from collections import defaultdict +from pathlib import Path + +REPO = Path(__file__).resolve().parent.parent.parent +API = "https://datasets-server.huggingface.co/rows" +PAGE = 100 + + +def hf_token() -> str | None: + import os + + tok = os.environ.get("HF_TOKEN") + if tok: + return tok + p = Path.home() / ".cache" / "huggingface" / "token" + return p.read_text().strip() if p.exists() else None + + +def fetch_page(config: str, split: str, offset: int, cache_dir: Path, token: str | None) -> dict: + cache = cache_dir / f"{config}-{split}-{offset}.json" + if cache.exists(): + return json.loads(cache.read_text()) + q = urllib.parse.urlencode( + {"dataset": "edinburghcstr/ami", "config": config, "split": split, + "offset": offset, "length": PAGE} + ) + req = urllib.request.Request(f"{API}?{q}") + if token: + req.add_header("Authorization", f"Bearer {token}") + for attempt in range(10): + try: + with urllib.request.urlopen(req, timeout=60) as r: + payload = json.load(r) + cache.write_text(json.dumps(payload)) + return payload + except urllib.error.HTTPError as exc: + if attempt == 9: + raise + retry_after = exc.headers.get("Retry-After") if exc.headers else None + wait = float(retry_after) if retry_after else min(60.0, 2.0 ** attempt) + print(f"HTTP {exc.code} offset={offset}, waiting {wait:.0f}s", file=sys.stderr) + time.sleep(wait) + except Exception as exc: + if attempt == 9: + raise + time.sleep(min(60.0, 2.0 ** attempt)) + print(f"retry offset={offset}: {exc}", file=sys.stderr) + raise RuntimeError("unreachable") + + +def fetch_rows(config: str, split: str, cache_dir: Path): + token = hf_token() + offset = 0 + while True: + payload = fetch_page(config, split, offset, cache_dir, token) + rows = payload.get("rows", []) + if not rows: + return + for r in rows: + yield r["row"] + offset += len(rows) + if offset >= payload.get("num_rows_total", 0): + return + time.sleep(0.75) + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("--config", default="ihm", choices=["ihm", "sdm"]) + ap.add_argument("--split", default="test") + args = ap.parse_args() + + base = REPO / "samples" / "diar" + src_manifest = base / f"ami-{args.config}-{args.split}.manifest.jsonl" + if not src_manifest.exists(): + print(f"error: {src_manifest} missing (run ingest_ami.py first)", file=sys.stderr) + return 1 + entries = [json.loads(l) for l in src_manifest.read_text().splitlines() if l.strip()] + meetings = {e["id"].split(".")[0]: e for e in entries} + + cache_dir = base / ".rows-cache" + cache_dir.mkdir(parents=True, exist_ok=True) + per_meeting: dict[str, list[dict]] = defaultdict(list) + n_rows = 0 + for row in fetch_rows(args.config, args.split, cache_dir): + mid = row.get("meeting_id") + text = (row.get("text") or "").strip() + if mid not in meetings or not text: + continue + per_meeting[mid].append( + { + "session_id": mid, + "speaker": row["speaker_id"], + "start_time": float(row["begin_time"]), + "end_time": float(row["end_time"]), + "words": text, + } + ) + n_rows += 1 + if n_rows % 2000 == 0: + print(f"...{n_rows} segments", file=sys.stderr) + + missing = sorted(set(meetings) - set(per_meeting)) + if missing: + print(f"warning: no transcript rows for {missing}", file=sys.stderr) + + out_dir = base / f"ami-{args.config}-{args.split}-seglst" + out_dir.mkdir(parents=True, exist_ok=True) + out_manifest = base / f"ami-{args.config}-{args.split}-mt.manifest.jsonl" + with out_manifest.open("w") as mf: + for mid, entry in sorted(meetings.items()): + segs = sorted(per_meeting.get(mid, []), key=lambda s: s["start_time"]) + seglst_path = out_dir / f"{mid}.seglst.json" + seglst_path.write_text(json.dumps(segs, indent=1) + "\n") + row = dict(entry) + row["seglst"] = str(seglst_path.relative_to(REPO)) + mf.write(json.dumps(row) + "\n") + print(f"{mid}: {len(segs)} reference segments") + + print(f"wrote {out_manifest} ({len(meetings)} meetings, {n_rows} segments total)") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/diar/modal_multitalker_cpp.py b/scripts/diar/modal_multitalker_cpp.py new file mode 100644 index 00000000..09ce3de6 --- /dev/null +++ b/scripts/diar/modal_multitalker_cpp.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +""" +modal_multitalker_cpp.py - run the C++ multitalker bundle over the AMI +acceptance manifest on Modal CUDA and emit SegLST hypotheses. + +The long AMI meetings need more attention-buffer memory than the local +16 GB M4 can give (a ~50-min meeting wants a ~5.5 GB F32 mask; a local +attempt hard-crashed the machine), so the C++ side runs on an L40S with +a CUDA build. The image bakes a TRANSCRIBE_CUDA=ON build of the repo +source; bundle GGUF + audio come from the `transcribe-ami-cpp` volume: + + modal volume create transcribe-ami-cpp + modal volume put transcribe-ami-cpp \ + models/multitalker-parakeet-streaming-0.6b-v1/bundle/multitalker-parakeet-streaming-0.6b-v1-F32.gguf \ + /model/bundle-F32.gguf + modal volume put transcribe-ami-cpp samples/diar/ami-ihm-test /audio + +One container per (meeting, mode) cell, batch size 1 (multitalker is a +transcribe_run path). Mode is selected via TRANSCRIBE_MULTITALKER_MODE, +same contract as run_cpp_multitalker.py. Hypotheses land in +reports/cpwer/cpp-/.seglst.json for score_cpwer.py. + +Usage: + modal run scripts/diar/modal_multitalker_cpp.py --modes both + modal run scripts/diar/modal_multitalker_cpp.py --modes kernel --meetings IS1009a +""" + +from __future__ import annotations + +import json +import os +import subprocess +from pathlib import Path + +import modal + +REPO = Path(__file__).resolve().parent.parent.parent + +app = modal.App("transcribe-multitalker-cpp") +vol = modal.Volume.from_name("transcribe-ami-cpp") + +image = ( + modal.Image.from_registry("nvidia/cuda:12.4.1-devel-ubuntu22.04", add_python="3.11") + .apt_install("build-essential", "git", "ninja-build") + .pip_install("cmake") + .add_local_file(REPO / "CMakeLists.txt", "/repo/CMakeLists.txt", copy=True) + .add_local_dir(REPO / "include", "/repo/include", copy=True) + .add_local_dir(REPO / "cmake", "/repo/cmake", copy=True) + .add_local_dir(REPO / "ggml", "/repo/ggml", copy=True) + .add_local_dir(REPO / "src", "/repo/src", copy=True) + .add_local_dir(REPO / "examples", "/repo/examples", copy=True) + .run_commands( + "cmake -S /repo -B /repo/build -G Ninja -DCMAKE_BUILD_TYPE=Release " + "-DTRANSCRIBE_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=89 " + "-DTRANSCRIBE_BUILD_TESTS=OFF -DTRANSCRIBE_BUILD_EXAMPLES=ON", + "cmake --build /repo/build -j 16 --target transcribe-cli", + ) +) + + +@app.function(image=image, gpu="L40S", volumes={"/data": vol}, timeout=3600) +def run_meeting(meeting_wav: str, mode: str, ref_bg_compat: bool = False) -> dict: + mid = Path(meeting_wav).name.split(".")[0] + batch_list = "/tmp/batch.list" + Path(batch_list).write_text(f"/data/audio/{meeting_wav}\n") + + env = dict(os.environ) + if ref_bg_compat: + env["TRANSCRIBE_MULTITALKER_REF_BG_COMPAT"] = "1" + env["TRANSCRIBE_MULTITALKER_MODE"] = mode + + cmd = [ + "/repo/build/bin/transcribe-cli", "-q", "--diarize", "--backend", "cuda", + "--batch", batch_list, "--batch-jsonl", + "-m", "/data/model/bundle-F32.gguf", + ] + proc = subprocess.run(cmd, capture_output=True, text=True, env=env) + if proc.returncode != 0: + return {"id": mid, "mode": mode, "error": f"exit {proc.returncode}: {proc.stderr[-2000:]}"} + + row = None + for line in proc.stdout.splitlines(): + line = line.strip() + if line.startswith("{"): + try: + cand = json.loads(line) + except json.JSONDecodeError: + continue + if cand.get("segments"): + row = cand + if row is None: + return {"id": mid, "mode": mode, "error": "no JSONL row with segments"} + + seglst = [] + for seg in row["segments"]: + text = (seg.get("text") or "").strip() + if not text or seg.get("speaker_id", 0) <= 0: + continue + seglst.append( + { + "session_id": mid, + "speaker": f"S{seg['speaker_id']}", + "start_time": seg["t0_ms"] / 1000.0, + "end_time": seg["t1_ms"] / 1000.0, + "words": text, + } + ) + return {"id": mid, "mode": mode, "seglst": seglst} + + +@app.local_entrypoint() +def main(modes: str = "both", meetings: str = "", ref_bg_compat: bool = False): + manifest = REPO / "samples" / "diar" / "ami-ihm-test.manifest.jsonl" + entries = [json.loads(l) for l in manifest.read_text().splitlines() if l.strip()] + want = {m.strip() for m in meetings.split(",") if m.strip()} + mode_list = ["masked", "kernel"] if modes == "both" else [modes] + + cells = [] + for e in entries: + mid = e["id"].split(".")[0] + if want and mid not in want: + continue + for mode in mode_list: + cells.append((Path(e["audio"]).name, mode, ref_bg_compat)) + + n_ok = 0 + for res in run_meeting.starmap(cells, order_outputs=False): + if res.get("error"): + print(f"FAIL {res['id']} [{res['mode']}]: {res['error']}") + continue + suffix = "-refbug" if ref_bg_compat else "" + out_dir = REPO / "reports" / "cpwer" / f"cpp-{res['mode']}{suffix}" + out_dir.mkdir(parents=True, exist_ok=True) + out = out_dir / f"{res['id']}.seglst.json" + out.write_text(json.dumps(res["seglst"], indent=1) + "\n") + n_ok += 1 + print(f"ok {res['id']} [{res['mode']}]: {len(res['seglst'])} segments -> {out.relative_to(REPO)}") + + print(f"{n_ok}/{len(cells)} cells succeeded") diff --git a/scripts/diar/modal_multitalker_ref.py b/scripts/diar/modal_multitalker_ref.py new file mode 100644 index 00000000..b375d6ce --- /dev/null +++ b/scripts/diar/modal_multitalker_ref.py @@ -0,0 +1,127 @@ +""" +modal_multitalker_ref.py - NeMo multitalker baseline (ASR + streaming +Sortformer) on Modal L40S for the AMI-IHM cpWER acceptance run. + +Fans out one container per (meeting, supervision-mode) cell, each running +scripts/dump_reference_multitalker_nemo.py (--device cuda --light) over +one staged AMI meeting, and collects the SegLST hypotheses locally under +reports/cpwer/nemo-/.seglst.json for scoring with +scripts/diar/score_cpwer.py. + +Batch size is 1 by design: one meeting per container, the pipeline's +audio_file mode. + +Usage (from the repo root): + # smoke: one meeting, both modes + modal run scripts/diar/modal_multitalker_ref.py --meetings ES2004a --modes both + + # full acceptance sweep (meetings from the staged manifest) + modal run scripts/diar/modal_multitalker_ref.py --modes both +""" + +from __future__ import annotations + +import json +import pathlib + +import modal + +REPO = pathlib.Path(__file__).resolve().parent.parent.parent +NEMO_REV = "6967f48fda2a776a68bbaed6a71d7fea78ccc3f6" + +app = modal.App("transcribe-multitalker-cpwer") + +image = ( + modal.Image.from_registry( + "nvidia/cuda:12.4.1-runtime-ubuntu22.04", + add_python="3.11", + ) + .apt_install("git", "ca-certificates", "ffmpeg", "libsndfile1", "build-essential") + .pip_install("Cython", "packaging", "huggingface_hub") + .pip_install(f"nemo_toolkit[asr] @ git+https://github.com/NVIDIA-NeMo/NeMo.git@{NEMO_REV}") + .add_local_file( + REPO / "scripts" / "dump_reference_multitalker_nemo.py", + "/src/dump_reference_multitalker_nemo.py", + ) + .add_local_dir(REPO / "samples" / "diar" / "ami-ihm-test", "/ami") +) + +hf_vol = modal.Volume.from_name("hf-cache", create_if_missing=True) + + +@app.function( + image=image, + gpu="L40S", + timeout=4 * 3600, + volumes={"/root/.cache/huggingface": hf_vol}, + secrets=[modal.Secret.from_name("huggingface-secret")], +) +def run_meeting(meeting: str, masked: bool, strict_fp32: bool = False) -> dict: + import subprocess + + from huggingface_hub import hf_hub_download + + asr = hf_hub_download( + "nvidia/multitalker-parakeet-streaming-0.6b-v1", + "multitalker-parakeet-streaming-0.6b-v1.nemo", + ) + diar = hf_hub_download( + "nvidia/diar_streaming_sortformer_4spk-v2.1", + "diar_streaming_sortformer_4spk-v2.1.nemo", + ) + hf_vol.commit() + + wav = f"/ami/{meeting}.Mix-Headset.wav" + out = f"/tmp/out/{meeting}" + mode = "true" if masked else "false" + cmd = [ + "python", "/src/dump_reference_multitalker_nemo.py", + "--audio", wav, + "--asr-model", asr, + "--diar-model", diar, + "--masked-asr", mode, + "--device", "cuda", + "--light", + "--out", out, + ] + if strict_fp32: + cmd.append("--strict-fp32") + proc = subprocess.run(cmd, capture_output=True, text=True) + tail = "\n".join((proc.stdout + "\n" + proc.stderr).splitlines()[-30:]) + if proc.returncode != 0: + return {"meeting": meeting, "masked": masked, "ok": False, "log": tail} + seglst = json.loads(pathlib.Path(out, "seglst.json").read_text()) + return {"meeting": meeting, "masked": masked, "ok": True, "seglst": seglst, "log": tail} + + +@app.local_entrypoint() +def main(meetings: str = "", modes: str = "both", strict_fp32: bool = False): + if meetings: + ids = [m.strip() for m in meetings.split(",") if m.strip()] + else: + manifest = REPO / "samples" / "diar" / "ami-ihm-test.manifest.jsonl" + ids = sorted( + {json.loads(l)["id"].split(".")[0] for l in manifest.read_text().splitlines() if l.strip()} + ) + mode_list = [True, False] if modes == "both" else [modes == "masked"] + + cells = [(m, masked, strict_fp32) for m in ids for masked in mode_list] + print(f"dispatching {len(cells)} cells ({len(ids)} meetings x {len(mode_list)} modes) on L40S") + + n_ok = 0 + for res in run_meeting.starmap(cells, return_exceptions=True): + if isinstance(res, Exception): + print(f"FAIL (exception): {res}") + continue + mode_name = "masked" if res["masked"] else "kernel" + if not res["ok"]: + print(f"FAIL {res['meeting']} [{mode_name}]:\n{res['log']}") + continue + suffix = "-fp32" if strict_fp32 else "" + out_dir = REPO / "reports" / "cpwer" / f"nemo-{mode_name}{suffix}" + out_dir.mkdir(parents=True, exist_ok=True) + out_path = out_dir / f"{res['meeting']}.seglst.json" + out_path.write_text(json.dumps(res["seglst"], indent=1) + "\n") + n_ok += 1 + print(f"ok {res['meeting']} [{mode_name}]: {len(res['seglst'])} segments -> {out_path.relative_to(REPO)}") + print(f"{n_ok}/{len(cells)} cells succeeded") diff --git a/scripts/diar/run_cpp_multitalker.py b/scripts/diar/run_cpp_multitalker.py new file mode 100644 index 00000000..485361ae --- /dev/null +++ b/scripts/diar/run_cpp_multitalker.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +""" +run_cpp_multitalker.py - drive the C++ multitalker bundle over an AMI +manifest and emit SegLST hypotheses for cpWER scoring. + +One transcribe-cli invocation per meeting (batch size 1: multitalker is a +transcribe_run path), diarize=ON, --batch-jsonl output parsed into +/.seglst.json. Supervision mode is selected via +TRANSCRIBE_MULTITALKER_MODE (masked default | kernel), forwarded from +--mode. + +Usage: + uv run scripts/diar/run_cpp_multitalker.py \ + --model models/multitalker-parakeet-streaming-0.6b-v1/bundle/multitalker-parakeet-streaming-0.6b-v1-F32.gguf \ + --manifest samples/diar/ami-ihm-test.manifest.jsonl \ + --mode kernel \ + --out-dir reports/cpwer/cpp-kernel \ + [--meetings IS1009a,ES2004a] [--backend cpu|metal|cuda] [--cli PATH] +""" + +from __future__ import annotations + +import argparse +import json +import os +import subprocess +import sys +import tempfile +import time +from pathlib import Path + +REPO = Path(__file__).resolve().parent.parent.parent + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("--model", required=True) + ap.add_argument("--manifest", required=True) + ap.add_argument("--out-dir", required=True) + ap.add_argument("--mode", choices=["masked", "kernel"], default="masked") + ap.add_argument("--backend", default="auto") + ap.add_argument("--cli", default=str(REPO / "build" / "bin" / "transcribe-cli")) + ap.add_argument("--meetings", default="", help="comma-separated meeting-id filter") + args = ap.parse_args() + + out_dir = Path(args.out_dir) + out_dir.mkdir(parents=True, exist_ok=True) + want = {m.strip() for m in args.meetings.split(",") if m.strip()} + + env = dict(os.environ) + if args.mode == "kernel": + env["TRANSCRIBE_MULTITALKER_MODE"] = "kernel" + else: + env.pop("TRANSCRIBE_MULTITALKER_MODE", None) + + entries = [json.loads(l) for l in Path(args.manifest).read_text().splitlines() if l.strip()] + n_ok = 0 + for e in entries: + mid = e["id"].split(".")[0] + if want and mid not in want: + continue + audio = e["audio"] + if not Path(audio).is_absolute(): + audio = str(REPO / audio) + + with tempfile.NamedTemporaryFile("w", suffix=".list", delete=False) as bf: + bf.write(audio + "\n") + batch_list = bf.name + cmd = [ + args.cli, "-q", "--diarize", "--backend", args.backend, + "--batch", batch_list, "--batch-jsonl", + "-m", args.model, + ] + t0 = time.time() + proc = subprocess.run(cmd, capture_output=True, text=True, env=env) + os.unlink(batch_list) + if proc.returncode != 0: + print(f"FAIL {mid}: exit {proc.returncode}\n{proc.stderr[-2000:]}", file=sys.stderr) + continue + + row = None + for line in proc.stdout.splitlines(): + line = line.strip() + if line.startswith("{"): + try: + cand = json.loads(line) + except json.JSONDecodeError: + continue + if cand.get("segments"): + row = cand + if row is None: + print(f"FAIL {mid}: no JSONL row with segments in CLI output", file=sys.stderr) + continue + + seglst = [] + for seg in row["segments"]: + text = (seg.get("text") or "").strip() + if not text or seg.get("speaker_id", 0) <= 0: + continue + seglst.append( + { + "session_id": mid, + "speaker": f"S{seg['speaker_id']}", + "start_time": seg["t0_ms"] / 1000.0, + "end_time": seg["t1_ms"] / 1000.0, + "words": text, + } + ) + (out_dir / f"{mid}.seglst.json").write_text(json.dumps(seglst, indent=1) + "\n") + n_ok += 1 + print(f"ok {mid}: {len(seglst)} segments in {time.time() - t0:.0f}s") + + print(f"{n_ok} meetings -> {out_dir}") + return 0 if n_ok > 0 else 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/diar/score_cpwer.py b/scripts/diar/score_cpwer.py new file mode 100644 index 00000000..bf852902 --- /dev/null +++ b/scripts/diar/score_cpwer.py @@ -0,0 +1,126 @@ +#!/usr/bin/env -S uv run --script +# /// script +# requires-python = ">=3.11" +# dependencies = ["meeteval>=0.4"] +# /// +""" +score_cpwer.py - cpWER for speaker-attributed multitalker hypotheses. + +Scores hypothesis SegLST files against the reference SegLSTs from +ingest_ami_seglst.py using meeteval's cpwer (concatenated +minimum-permutation WER — the metric NVIDIA reports for the multitalker +parakeet models). Text is normalized with a whisper-style English +normalizer to match the repo's WER convention. + +Inputs: a -mt manifest (audio + rttm + seglst columns) and a hypothesis +directory containing .seglst.json files (from the C++ or NeMo +multitalker runners). + +Usage: + uv run scripts/diar/score_cpwer.py \ + --manifest samples/diar/ami-ihm-test-mt.manifest.jsonl \ + --hyp-dir reports/cpwer// \ + --out reports/cpwer/.score.json +""" + +from __future__ import annotations + +import argparse +import json +import re +import sys +from pathlib import Path + +import meeteval.io +from meeteval.wer import cpwer + +REPO = Path(__file__).resolve().parent.parent.parent + +_norm_re = re.compile(r"[^a-z0-9' ]+") + + +def normalize(text: str) -> str: + # Lowercase, strip punctuation, collapse whitespace. Matches the + # de-PnC convention score.py applies before WER. + text = text.lower().replace("-", " ") + text = _norm_re.sub(" ", text) + return " ".join(text.split()) + + +def load_seglst(path: Path, session_id: str) -> meeteval.io.SegLST: + rows = json.loads(path.read_text()) + cleaned = [] + for r in rows: + words = normalize(r.get("words", "")) + if not words: + continue + cleaned.append( + { + "session_id": session_id, + "speaker": str(r["speaker"]), + "start_time": float(r.get("start_time", 0.0)), + "end_time": float(r.get("end_time", 0.0)), + "words": words, + } + ) + return meeteval.io.SegLST.new(cleaned) + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("--manifest", required=True) + ap.add_argument("--hyp-dir", required=True) + ap.add_argument("--out", required=True) + args = ap.parse_args() + + hyp_dir = Path(args.hyp_dir) + per_meeting = {} + tot_err = tot_len = 0 + for line in Path(args.manifest).read_text().splitlines(): + if not line.strip(): + continue + e = json.loads(line) + mid = e["id"].split(".")[0] + ref_path = REPO / e["seglst"] + hyp_path = hyp_dir / f"{mid}.seglst.json" + if not hyp_path.exists(): + print(f"warning: missing hyp for {mid}, skipping", file=sys.stderr) + continue + ref = load_seglst(ref_path, mid) + hyp = load_seglst(hyp_path, mid) + r = cpwer(ref, hyp)[mid] + per_meeting[mid] = { + "errors": r.errors, + "length": r.length, + "cpwer_pct": round(100.0 * r.error_rate, 3) if r.error_rate is not None else None, + "insertions": r.insertions, + "deletions": r.deletions, + "substitutions": r.substitutions, + "missed_speaker": r.missed_speaker, + "falarm_speaker": r.falarm_speaker, + "scored_speaker": r.scored_speaker, + } + tot_err += r.errors + tot_len += r.length + + if tot_len == 0: + print("error: nothing scored", file=sys.stderr) + return 1 + summary = { + "metric": "cpWER", + "cpwer_pct": round(100.0 * tot_err / tot_len, 3), + "errors": tot_err, + "length": tot_len, + "n_meetings": len(per_meeting), + "per_meeting": per_meeting, + } + out = Path(args.out) + out.parent.mkdir(parents=True, exist_ok=True) + out.write_text(json.dumps(summary, indent=2) + "\n") + print(f"cpWER: {summary['cpwer_pct']}% over {len(per_meeting)} meetings ({tot_err}/{tot_len})") + print(f"wrote {out}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/dump_reference_multitalker_nemo.py b/scripts/dump_reference_multitalker_nemo.py new file mode 100644 index 00000000..0a138a7e --- /dev/null +++ b/scripts/dump_reference_multitalker_nemo.py @@ -0,0 +1,320 @@ +#!/usr/bin/env python3 +""" +dump_reference_multitalker_nemo.py - NeMo reference dump for the multitalker +Parakeet + streaming Sortformer pipeline. + +Replicates the pinned NeMo example +(examples/asr/asr_cache_aware_streaming/speech_to_text_multitalker_streaming_infer.py +at rev 6967f48fda2a, single-audio-file mode, parallel speaker strategy) and +instruments it so the C++ port has an oracle for every hand-off: + + - per-step diar predictions (cumulative stream and per-chunk slice) + - per-step active-speaker selection (cache gating) + - per-step ASR supervision: feature masks (masked_asr=true) or + spk/bg speaker-kernel targets (masked_asr=false) + - final SegLST and per-speaker word streams + - the effective streaming configs actually in force (sortformer module + attrs, ASR streaming_cfg) so the C++ side mirrors reality, not defaults + +All defaults follow MultitalkerTranscriptionConfig at the pin; the only +deliberate overrides are CPU placement and use_amp=False (parity runs are +fp32 CPU, per the porting convention). + +Usage: + uv run --project scripts/envs/parakeet scripts/dump_reference_multitalker_nemo.py \ + --audio samples/multitalker-2spk-mix.wav \ + --asr-model ~/.cache/huggingface/.../multitalker-parakeet-streaming-0.6b-v1.nemo \ + --diar-model ~/.cache/huggingface/.../diar_streaming_sortformer_4spk-v2.1.nemo \ + --masked-asr true \ + --out build/validate/parakeet/multitalker-parakeet-streaming-0.6b-v1/multitalker/masked +""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +import numpy as np +import torch +from omegaconf import OmegaConf + + +def build_cfg(args) -> OmegaConf: + # Field-for-field mirror of MultitalkerTranscriptionConfig defaults at + # the pinned rev; overrides limited to input/output paths, CPU, no AMP, + # and the masked_asr toggle under test. + cfg = { + "diar_model": str(args.diar_model), + "diar_pretrained_name": None, + "max_num_of_spks": 4, + "parallel_speaker_strategy": True, + "masked_asr": args.masked_asr, + "mask_preencode": False, + "cache_gating": True, + "cache_gating_buffer_size": 2, + "single_speaker_mode": False, + "feat_len_sec": 0.01, + "session_len_sec": -1, + "num_workers": 0, + "random_seed": None, + "log": False, + "streaming_mode": True, + "spkcache_len": 188, + "spkcache_refresh_rate": 0, + "fifo_len": 188, + "chunk_len": 0, + "chunk_left_context": 0, + "chunk_right_context": 0, + "cuda": None, + "allow_mps": False, + "matmul_precision": "highest", + "asr_model": str(args.asr_model), + "device": "cpu", + "audio_file": str(args.audio), + "manifest_file": None, + "att_context_size": [70, 13], + "use_amp": False, + "debug_mode": False, + "deploy_mode": False, + "batch_size": 1, + "chunk_size": -1, + "shift_size": -1, + "left_chunks": 2, + "online_normalization": False, + "output_path": None, + "pad_and_drop_preencoded": False, + "generate_realtime_scripts": False, + "spk_supervision": "diar", + "binary_diar_preds": False, + "verbose": False, + "word_window": 50, + "sent_break_sec": 30.0, + "fix_prev_words_count": 5, + "update_prev_words_sentence": 5, + "left_frame_shift": -1, + "right_frame_shift": 0, + "min_sigmoid_val": 1e-2, + "discarded_frames": 8, + "print_time": False, + "print_sample_indices": [0], + "colored_text": False, + "real_time_mode": False, + "print_path": None, + "ignored_initial_frame_steps": 5, + "finetune_realtime_ratio": 0.01, + } + return OmegaConf.create(cfg) + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("--audio", required=True) + ap.add_argument("--asr-model", required=True, help="path to the multitalker .nemo") + ap.add_argument("--diar-model", required=True, help="path to the sortformer .nemo") + ap.add_argument("--masked-asr", choices=["true", "false"], required=True) + ap.add_argument("--out", required=True, help="output directory") + ap.add_argument("--device", choices=["cpu", "cuda"], default="cpu", + help="cpu (parity dumps) or cuda (long-form baseline runs)") + ap.add_argument("--dump-compress", action="store_true", + help="record per-call _compress_spkcache selection (compress-ref/ dumps)") + ap.add_argument("--strict-fp32", action="store_true", + help="disable TF32 everywhere (cudnn convs + cuda matmul); " + "isolates precision when comparing against true-F32 backends") + ap.add_argument("--light", action="store_true", + help="skip per-step instrumentation dumps (seglst + config echo only); " + "required for long meetings where per-chunk npz would be huge") + args = ap.parse_args() + args.masked_asr = args.masked_asr == "true" + + out_dir = Path(args.out) + out_dir.mkdir(parents=True, exist_ok=True) + + import nemo.collections.asr as nemo_asr + from nemo.collections.asr.models.sortformer_diar_models import SortformerEncLabelModel + from nemo.collections.asr.parts.utils.multispk_transcribe_utils import SpeakerTaggedASR + from nemo.collections.asr.parts.utils.streaming_utils import CacheAwareStreamingAudioBuffer + + cfg = build_cfg(args) + torch.set_float32_matmul_precision(cfg.matmul_precision) + if args.strict_fp32: + torch.backends.cudnn.allow_tf32 = False + torch.backends.cuda.matmul.allow_tf32 = False + device = torch.device(args.device) + + diar_model = SortformerEncLabelModel.restore_from(restore_path=cfg.diar_model, map_location=device) + diar_model = diar_model.eval().to(device) + compress_calls = None + if args.dump_compress: + import sys as _sys + from pathlib import Path as _P + _sys.path.insert(0, str(_P(__file__).resolve().parent)) + from dump_reference_sortformer_nemo import _install_compress_hooks, _write_compress_dump + compress_calls = _install_compress_hooks(diar_model) + diar_model.streaming_mode = cfg.streaming_mode + diar_model.sortformer_modules.chunk_len = cfg.chunk_len + diar_model.sortformer_modules.spkcache_len = cfg.spkcache_len + diar_model.sortformer_modules.chunk_left_context = cfg.chunk_left_context + diar_model.sortformer_modules.chunk_right_context = cfg.chunk_right_context + diar_model.sortformer_modules.fifo_len = cfg.fifo_len + diar_model.sortformer_modules.log = cfg.log + diar_model.sortformer_modules.spkcache_refresh_rate = cfg.spkcache_refresh_rate + + asr_model = nemo_asr.models.ASRModel.restore_from(restore_path=cfg.asr_model, map_location=device) + asr_model.encoder.set_default_att_context_size(att_context_size=list(cfg.att_context_size)) + asr_model = asr_model.to(device).eval() + + # ------------------------------------------------------------------ # + # Instrumentation: record every hand-off the C++ port must reproduce # + # ------------------------------------------------------------------ # + steps: list[dict] = [] + instrument = not args.light + + orig_fss = diar_model.forward_streaming_step + + def rec_fss(*a, **kw): + state, preds = orig_fss(*a, **kw) + steps.append({"kind": "diar_preds", "step": len([s for s in steps if s["kind"] == "diar_preds"]), + "total_preds": preds.detach().cpu().numpy().copy()}) + return state, preds + + if instrument: + diar_model.forward_streaming_step = rec_fss + + orig_sst = asr_model.set_speaker_targets + + def rec_sst(spk_targets=None, bg_spk_targets=None): + steps.append({"kind": "spk_targets", + "spk": None if spk_targets is None else spk_targets.detach().cpu().numpy().copy(), + "bg": None if bg_spk_targets is None else bg_spk_targets.detach().cpu().numpy().copy()}) + return orig_sst(spk_targets, bg_spk_targets) + + if instrument: + asr_model.set_speaker_targets = rec_sst + + streamer = SpeakerTaggedASR(cfg, asr_model, diar_model) + + orig_find = streamer._find_active_speakers + + def rec_find(diar_preds, n_active_speakers_per_stream): + res = orig_find(diar_preds, n_active_speakers_per_stream) + steps.append({"kind": "active_speakers", "active": [list(map(int, r)) for r in res]}) + return res + + if instrument: + streamer._find_active_speakers = rec_find + + orig_mask_feat = streamer.mask_features + + def rec_mask_feat(chunk_audio, mask, threshold=0.5, mask_value=-16.6355): + steps.append({"kind": "feature_mask", "mask": mask.detach().cpu().numpy().copy()}) + return orig_mask_feat(chunk_audio, mask, threshold, mask_value) + + if instrument: + streamer.mask_features = rec_mask_feat + + # ------------------------------------------------------------------ # + # Streaming loop (mirrors launch_parallel_streaming at the pin) # + # ------------------------------------------------------------------ # + streaming_buffer = CacheAwareStreamingAudioBuffer( + model=asr_model, + online_normalization=cfg.online_normalization, + pad_and_drop_preencoded=cfg.pad_and_drop_preencoded, + ) + streaming_buffer.append_audio_file(audio_filepath=cfg.audio_file, stream_id=-1) + + autocast = torch.amp.autocast("cpu", enabled=cfg.use_amp) + for step_num, (chunk_audio, chunk_lengths) in enumerate(iter(streaming_buffer)): + drop_extra_pre_encoded = ( + 0 if step_num == 0 and not cfg.pad_and_drop_preencoded + else asr_model.encoder.streaming_cfg.drop_extra_pre_encoded + ) + with torch.inference_mode(), autocast, torch.no_grad(): + streamer.perform_parallel_streaming_stt_spk( + step_num=step_num, + chunk_audio=chunk_audio, + chunk_lengths=chunk_lengths, + is_buffer_empty=streaming_buffer.is_buffer_empty(), + drop_extra_pre_encoded=drop_extra_pre_encoded, + ) + + samples = [{"audio_filepath": cfg.audio_file}] + seglst = streamer.generate_seglst_dicts_from_parallel_streaming(samples=samples) + + # ------------------------------------------------------------------ # + # Dump # + # ------------------------------------------------------------------ # + # Accumulated diar preds are tiny and always worth keeping (light + # mode included): they are the supervision ground truth for parity. + diar_states = streamer.instance_manager.diar_states + final_preds = diar_states.diar_pred_out_stream + np.save(out_dir / "diar_total_preds.npy", final_preds.detach().cpu().numpy()) + if compress_calls is not None: + _write_compress_dump(compress_calls, out_dir / "compress-ref") + + npz: dict[str, np.ndarray] = {} + counters: dict[str, int] = {} + step_index = [] + for s in steps: + i = counters.get(s["kind"], 0) + counters[s["kind"]] = i + 1 + if s["kind"] == "diar_preds": + npz[f"diar_preds_{i:03d}"] = s["total_preds"] + elif s["kind"] == "spk_targets": + if s["spk"] is not None: + npz[f"spk_targets_{i:03d}"] = s["spk"] + if s["bg"] is not None: + npz[f"bg_targets_{i:03d}"] = s["bg"] + elif s["kind"] == "feature_mask": + npz[f"feature_mask_{i:03d}"] = s["mask"] + elif s["kind"] == "active_speakers": + step_index.append(s["active"]) + np.savez(out_dir / "per_step.npz", **npz) + + scfg = asr_model.encoder.streaming_cfg + echo = { + "masked_asr": cfg.masked_asr, + "binary_diar_preds": cfg.binary_diar_preds, + "cache_gating": cfg.cache_gating, + "cache_gating_buffer_size": cfg.cache_gating_buffer_size, + "single_speaker_mode": cfg.single_speaker_mode, + "att_context_size": list(cfg.att_context_size), + "nframes_per_chunk": streamer._nframes_per_chunk, + "sent_break_sec": streamer._sent_break_sec, + "active_speakers_per_step": step_index, + "sortformer_modules": { + k: getattr(diar_model.sortformer_modules, k) + for k in ("chunk_len", "spkcache_len", "fifo_len", "chunk_left_context", + "chunk_right_context", "spkcache_refresh_rate") + }, + "asr_streaming_cfg": { + "chunk_size": list(scfg.chunk_size) if hasattr(scfg.chunk_size, "__len__") else scfg.chunk_size, + "shift_size": list(scfg.shift_size) if hasattr(scfg.shift_size, "__len__") else scfg.shift_size, + "pre_encode_cache_size": list(scfg.pre_encode_cache_size) + if hasattr(scfg.pre_encode_cache_size, "__len__") else scfg.pre_encode_cache_size, + "drop_extra_pre_encoded": scfg.drop_extra_pre_encoded, + "valid_out_len": scfg.valid_out_len, + }, + } + (out_dir / "config_echo.json").write_text(json.dumps(echo, indent=2, default=str) + "\n") + (out_dir / "seglst.json").write_text(json.dumps(seglst, indent=2) + "\n") + + per_speaker: dict[str, str] = {} + for seg in seglst: + per_speaker.setdefault(seg["speaker"], []) + for seg in sorted(seglst, key=lambda s: s["start_time"]): + per_speaker[seg["speaker"]] = per_speaker.get(seg["speaker"], []) + per_speaker[seg["speaker"]].append(seg["words"]) + per_speaker_text = {k: " ".join(v) for k, v in per_speaker.items()} + (out_dir / "per_speaker_text.json").write_text(json.dumps(per_speaker_text, indent=2) + "\n") + + print(f"steps recorded: {counters}") + print(f"seglst segments: {len(seglst)}") + for spk, text in per_speaker_text.items(): + print(f" {spk}: {text[:120]}") + print(f"wrote {out_dir}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/envs/sortformer/pyproject.toml b/scripts/envs/sortformer/pyproject.toml index 0e402747..7d16c7aa 100644 --- a/scripts/envs/sortformer/pyproject.toml +++ b/scripts/envs/sortformer/pyproject.toml @@ -14,6 +14,7 @@ dependencies = [ "numpy>=1.26", "sentencepiece>=0.2", "gguf>=0.10.0", + "meeteval>=0.4.3", ] # NeMo main maps torch by platform: darwin->pypi (CPU), linux->cu129, diff --git a/scripts/envs/sortformer/uv.lock b/scripts/envs/sortformer/uv.lock index 80608bd5..b41cb9ce 100644 --- a/scripts/envs/sortformer/uv.lock +++ b/scripts/envs/sortformer/uv.lock @@ -406,6 +406,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, ] +[[package]] +name = "cython" +version = "3.2.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/de/db48b8870e766cfea809986cc50c1e986c663a9ab7bafd0ac1a2512c4a26/cython-3.2.9.tar.gz", hash = "sha256:d249c9022ab13286b17bd66f30609e800c5f95efeecb06168990c7a66cecde6c", size = 3293493, upload-time = "2026-07-24T06:21:21.867Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/97/2f477d30fc6ca0ff333552233aa6dee0e57323a55913f84f24da9cac26fc/cython-3.2.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e8ec2d5a7b798c84d6779e7ca5318fd928b8fe9dd021106d714dc2e77cdc7555", size = 2992696, upload-time = "2026-07-24T06:21:44.931Z" }, + { url = "https://files.pythonhosted.org/packages/0a/bf/0f280f7960c129957d2ce650e7fd7dec8e706c26d61a428e93927f4c9904/cython-3.2.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cac792b0bde1c86d8f832e513cd061b7e682181cc5a6d843d487e6c8ae9d5fcb", size = 3307656, upload-time = "2026-07-24T06:21:46.649Z" }, + { url = "https://files.pythonhosted.org/packages/ac/cd/6d7c35a1065f1a07c9fa5ec784ee562f32f36a8fd05748e5f10694887eb7/cython-3.2.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8c843dd85857cd0d0da055489f448d032866120cfb094ce16205a1ff54d06353", size = 3459259, upload-time = "2026-07-24T06:21:48.881Z" }, + { url = "https://files.pythonhosted.org/packages/fd/37/c74d842306c8fe381c415b37460d5e3086a820fac72b8ff5cb48513ccfcd/cython-3.2.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:114b2dee0fa1daa48a59574d848da0ff1b6bdb725a755e9b92fad14962e1ff8d", size = 3009571, upload-time = "2026-07-24T06:21:52.534Z" }, + { url = "https://files.pythonhosted.org/packages/15/c0/f7c42b161edd585e3ae556fd62a2c72cd80a6ed527a9907f0c5c6fb060de/cython-3.2.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5cd9c5f138cb052130b40ad3b6976d2180c35348410995812678f4636bd8f94", size = 3183562, upload-time = "2026-07-24T06:21:54.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/1b/c04520ac7f3157aa12a69b632c16261170dac9fab6c48608cc004b8f1b17/cython-3.2.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23e80bc885c599e72072e18d0746df82d394b73100c1e153cda7359e6e59fe09", size = 3354811, upload-time = "2026-07-24T06:21:56.72Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4a/342312c5fe021c8e0c386e1915d138e0902c48ae179b0374ab04773a8831/cython-3.2.9-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:944dc8747f640b3527649c566a5fc75ee0c15e80642ea2fdae4fe6378e1a9d4a", size = 2899729, upload-time = "2026-07-24T06:22:24.877Z" }, + { url = "https://files.pythonhosted.org/packages/f0/62/ea919ee426cb4d435ec8155e1ee6bcbb46b20d8f070527191b59769d4e7f/cython-3.2.9-cp39-abi3-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4b871ad97dd7fb1cbf56f6238c54423febd310afc1d9d9bc70c69c89b7ce57fc", size = 3226650, upload-time = "2026-07-24T06:22:26.947Z" }, + { url = "https://files.pythonhosted.org/packages/18/02/057b4f63e2ced8c3cf217c4e9fb544bfe48145f493347c7ca3f51607526c/cython-3.2.9-cp39-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9b6ebc6c74b4318eaa4e51e520dc8b95ebc7b262953c3ecb24131104681f14e", size = 2881919, upload-time = "2026-07-24T06:22:29.318Z" }, + { url = "https://files.pythonhosted.org/packages/64/e4/e158793ee3de7e4417ba17e7ff1015d6e2cf557cb485ad270b2446c9d1c7/cython-3.2.9-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:92989da161a7d18a7ad4baebc49289b2b77556d5a94916f90140ba26aecf6892", size = 3004702, upload-time = "2026-07-24T06:22:31.535Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c0/d5bbbd743ab4feddb24a7e823b34c3ec4ebab91ff503d16743a4e7ce106b/cython-3.2.9-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:e75ec625d8f8781ced690b7a2f5c2d138067711cf24bb8fb68c872c30c2fefe5", size = 2902695, upload-time = "2026-07-24T06:22:33.525Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/80850817395985259f135baa510d9186d3a325df81cd1862060bba977029/cython-3.2.9-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:2b1756ddc3bc0cd4341a515fc420c3e25e13c249f5537159b3fb0bff8d19e55c", size = 3241554, upload-time = "2026-07-24T06:22:35.667Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ce/6be776814f6cb81751f3da737ed537385738148e1ea99f89fb4637799198/cython-3.2.9-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7d41baea51ea00f9237f75af498577827493bca5e9b45bbd4e351543727e589a", size = 3124337, upload-time = "2026-07-24T06:22:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/00/ec/e61deec9bcfbb0e1b36f8b5ba75cb44644419b4bfd0fdd666bffd21d9579/cython-3.2.9-py3-none-any.whl", hash = "sha256:a2b0e87f6b80790c929308ca0831d686f7a180feab684fe8cd4a4380bd96aaca", size = 1259272, upload-time = "2026-07-24T06:21:18.95Z" }, +] + [[package]] name = "cytoolz" version = "1.1.0" @@ -1286,6 +1308,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e3/a0/0d55c59ea8a5f1b13b3eb931e1c0eab9c2a07322cad79cb51a596d2d2a5c/mediapy-1.1.6-py3-none-any.whl", hash = "sha256:c74370808b445666f95272bfdf0eb5707a43b7e05e5527f2dd0830e6892f976f", size = 24955, upload-time = "2023-02-24T13:08:40.53Z" }, ] +[[package]] +name = "meeteval" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cython", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "kaldialign", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.12' and sys_platform == 'darwin') or (python_full_version < '3.12' and sys_platform == 'linux')" }, + { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and sys_platform == 'darwin') or (python_full_version >= '3.12' and sys_platform == 'linux')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/13/10edb36a8881b24690e27213bfb2395e8857a70eeef61d241a463cb5522c/meeteval-0.4.3.tar.gz", hash = "sha256:02d3a359f375d39c67dfb8fe1c061e7dac19d6fc1fb89ee72d793a5813dafeb2", size = 843558, upload-time = "2025-09-08T11:57:30.158Z" } + [[package]] name = "ml-dtypes" version = "0.5.4" @@ -2886,6 +2922,7 @@ source = { virtual = "." } dependencies = [ { name = "gguf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "huggingface-hub", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "meeteval", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "nemo-toolkit", extra = ["asr"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "sentencepiece", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2898,6 +2935,7 @@ dependencies = [ requires-dist = [ { name = "gguf", specifier = ">=0.10.0" }, { name = "huggingface-hub", specifier = ">=0.20" }, + { name = "meeteval", specifier = ">=0.4.3" }, { name = "nemo-toolkit", extras = ["asr"], git = "https://github.com/NVIDIA-NeMo/NeMo.git?rev=6967f48fda2a" }, { name = "numpy", specifier = ">=1.26" }, { name = "sentencepiece", specifier = ">=0.2" }, diff --git a/scripts/gen_multitalker_oracle_audio.py b/scripts/gen_multitalker_oracle_audio.py new file mode 100644 index 00000000..563a032f --- /dev/null +++ b/scripts/gen_multitalker_oracle_audio.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +"""Deterministically synthesize a 2-speaker ENGLISH multitalker oracle clip. + +The multitalker Parakeet + Sortformer pipeline needs an English +multi-speaker fixture (the sortformer 2spk mix is cross-language, which is +right for a diarizer oracle but wrong for scoring English ASR hyps). This +builds a reproducible 2-speaker English mixture from two committed clips +with distinct voices, plus a ground-truth RTTM for the authored timeline. + +Speaker A: samples/jfk.wav (JFK, 1961) +Speaker B: samples/whole-earth.wav (different male voice) + +Timeline: mostly turn-taking with one authored 0.5 s overlap at +[5.0, 5.5] s so the overlap path is exercised without dominating the clip. + +Outputs (16 kHz mono, deterministic): + samples/multitalker-2spk-mix.wav + tests/golden/parakeet/multitalker-2spk-mix.rttm + +Run: + uv run scripts/gen_multitalker_oracle_audio.py +""" + +from __future__ import annotations + +import subprocess +import sys +from pathlib import Path + +import numpy as np +import soundfile as sf + +SR = 16000 +REPO = Path(__file__).resolve().parent.parent +SPK_A_SRC = REPO / "samples" / "jfk.wav" +SPK_B_SRC = REPO / "samples" / "whole-earth.wav" +OUT_WAV = REPO / "samples" / "multitalker-2spk-mix.wav" +OUT_RTTM = REPO / "tests" / "golden" / "parakeet" / "multitalker-2spk-mix.rttm" +CLIP_ID = "multitalker-2spk-mix" + +# Authored timeline in seconds. Each speaker's source audio is consumed +# sequentially into that speaker's windows, so window boundaries cut the +# source mid-sentence — fine for parity fixtures (we compare hyps against +# the NeMo reference, not against a ground-truth transcript). +SPK_A_WINDOWS = [(0.0, 5.5), (9.5, 14.0)] +SPK_B_WINDOWS = [(5.0, 9.5)] +TOTAL_SEC = 14.0 + + +def _load_mono_16k(path: Path) -> np.ndarray: + audio, sr = sf.read(str(path), dtype="float32", always_2d=False) + if audio.ndim > 1: + audio = audio.mean(axis=1) + if sr != SR: + n_out = int(round(len(audio) * SR / sr)) + x_old = np.linspace(0.0, 1.0, num=len(audio), endpoint=False) + x_new = np.linspace(0.0, 1.0, num=n_out, endpoint=False) + audio = np.interp(x_new, x_old, audio).astype(np.float32) + peak = float(np.max(np.abs(audio))) or 1.0 + return (audio / peak * 0.9).astype(np.float32) + + +def _lay_windows_sequential(src: np.ndarray, windows: list[tuple[float, float]], total_n: int) -> np.ndarray: + """Consume src sequentially into each window (no tiling restart per + window), so speech flows naturally across a speaker's turns.""" + track = np.zeros(total_n, dtype=np.float32) + cursor = 0 + for start, end in windows: + i0 = int(round(start * SR)) + i1 = int(round(end * SR)) + n = i1 - i0 + seg = src[cursor : cursor + n] + if len(seg) < n: # source exhausted: wrap deterministically + reps = int(np.ceil(n / max(1, len(src)))) + seg = np.concatenate([seg, np.tile(src, reps)])[:n] + track[i0:i1] = seg + cursor += n + return track + + +def main() -> int: + for p in (SPK_A_SRC, SPK_B_SRC): + if not p.exists(): + print(f"error: missing source clip {p}", file=sys.stderr) + return 1 + total_n = int(round(TOTAL_SEC * SR)) + a = _lay_windows_sequential(_load_mono_16k(SPK_A_SRC), SPK_A_WINDOWS, total_n) + b = _lay_windows_sequential(_load_mono_16k(SPK_B_SRC), SPK_B_WINDOWS, total_n) + mix = a + b + peak = float(np.max(np.abs(mix))) or 1.0 + mix = (mix / peak * 0.9).astype(np.float32) + + OUT_WAV.parent.mkdir(parents=True, exist_ok=True) + OUT_RTTM.parent.mkdir(parents=True, exist_ok=True) + sf.write(str(OUT_WAV), mix, SR, subtype="PCM_16") + + lines = [] + for spk, windows in (("spk_A", SPK_A_WINDOWS), ("spk_B", SPK_B_WINDOWS)): + for start, end in windows: + lines.append(f"SPEAKER {CLIP_ID} 1 {start:.3f} {end - start:.3f} {spk} ") + OUT_RTTM.write_text("\n".join(lines) + "\n") + + dur = len(mix) / SR + print(f"wrote {OUT_WAV.relative_to(REPO)} ({dur:.2f}s, 16kHz mono)") + print(f"wrote {OUT_RTTM.relative_to(REPO)} ({len(lines)} turns, 2 speakers, overlap [5.0,5.5]s)") + sha = subprocess.run(["shasum", "-a", "256", str(OUT_WAV)], capture_output=True, text=True) + print("sha256:", sha.stdout.split()[0] if sha.returncode == 0 else "n/a") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 87fcbfc1..5e4a7e92 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -34,6 +34,7 @@ add_library(transcribe causal_lm/causal_lm.cpp granite_conformer/shaw_attn.cpp arch/parakeet/model.cpp + arch/parakeet/multitalker.cpp arch/parakeet/capabilities.cpp arch/parakeet/weights.cpp arch/parakeet/encoder.cpp diff --git a/src/arch/parakeet/encoder.cpp b/src/arch/parakeet/encoder.cpp index 16db9d62..a26af118 100644 --- a/src/arch/parakeet/encoder.cpp +++ b/src/arch/parakeet/encoder.cpp @@ -258,13 +258,26 @@ ggml_tensor * build_spk_kernel_ff(ggml_context * ctx, ggml_tensor * x, const Par return y; } -// Single-speaker mode applies the speaker kernel to x and the background -// kernel to zeros. The latter reduces to a per-channel constant broadcast -// over time. +// Speaker-kernel layer-0 injection (NeMo SpeakerKernelMixin pre-layer hook). +// +// Single-speaker mode (spk_mask == nullptr) mirrors spk_targets=None: +// the speaker kernel sees x unmasked (mask defaults to all-ones) and the +// background kernel sees zeros (bg default_value=0.0), which reduces to a +// per-channel constant broadcast over time. This path is byte-identical +// to the shipped single-speaker graph. +// +// Multitalker mode (spk_mask/bg_mask ne=[1, T] f32) mirrors +// mask_with_speaker_targets: x_spk = FF_spk(x * m_spk) added to x, then +// x_bg = FF_bg(x' * m_bg) added on the UPDATED x' (NeMo applies the bg +// kernel after the spk residual), with m_spk the target speaker's raw +// per-frame sigmoids and m_bg the binarized union of the other active +// speakers. ggml_tensor * apply_spk_kernel_injection(ggml_context * ctx, ggml_tensor * x, const ParakeetWeights & w, - const ParakeetHParams & hp) { + const ParakeetHParams & hp, + ggml_tensor * spk_mask = nullptr, + ggml_tensor * bg_mask = nullptr) { if (!hp.has_spk_kernel) { return x; } @@ -272,14 +285,23 @@ ggml_tensor * apply_spk_kernel_injection(ggml_context * ctx, if (kernel.layer != 0) { continue; // loader rejects non-zero layers; defensive } - ggml_tensor * x_spk = build_spk_kernel_ff(ctx, x, kernel.spk); - x = ggml_add(ctx, x, x_spk); - if (kernel.has_bg) { - // W3_bg * relu(b0_bg) + b3_bg is broadcast over time. - ggml_tensor * hb = ggml_relu(ctx, kernel.bg.lin0_b); - ggml_tensor * c_bg = ggml_mul_mat(ctx, kernel.bg.lin3_w, hb); - c_bg = ggml_add(ctx, c_bg, kernel.bg.lin3_b); - x = ggml_add(ctx, x, c_bg); + if (spk_mask == nullptr) { + ggml_tensor * x_spk = build_spk_kernel_ff(ctx, x, kernel.spk); + x = ggml_add(ctx, x, x_spk); + if (kernel.has_bg) { + // W3_bg * relu(b0_bg) + b3_bg is broadcast over time. + ggml_tensor * hb = ggml_relu(ctx, kernel.bg.lin0_b); + ggml_tensor * c_bg = ggml_mul_mat(ctx, kernel.bg.lin3_w, hb); + c_bg = ggml_add(ctx, c_bg, kernel.bg.lin3_b); + x = ggml_add(ctx, x, c_bg); + } + } else { + ggml_tensor * x_spk = build_spk_kernel_ff(ctx, ggml_mul(ctx, x, spk_mask), kernel.spk); + x = ggml_add(ctx, x, x_spk); + if (kernel.has_bg && bg_mask != nullptr) { + ggml_tensor * x_bg = build_spk_kernel_ff(ctx, ggml_mul(ctx, x, bg_mask), kernel.bg); + x = ggml_add(ctx, x, x_bg); + } } } return x; @@ -295,7 +317,9 @@ EncoderBuild build_encoder_graph(ggml_context * ctx, const char * backend_name, const BufferedStreamMaskOverride * buf_mask, int n_batch, - bool batch_var_len) { + bool batch_var_len, + bool spk_supervision, + int mt_keep_frames) { if (n_batch < 1) { n_batch = 1; } @@ -386,9 +410,40 @@ EncoderBuild build_encoder_graph(ggml_context * ctx, x = conf::named(x, "enc.pre_encode.xscaled"); } - // NeMo applies the optional layer-0 injection after xscaling. + // NeMo applies the optional layer-0 injection after xscaling. With + // spk_supervision (multitalker bundle, n_batch == 1), the per-frame + // speaker/background masks become graph inputs the driver fills from + // the embedded diarizer's predictions. + // Kernel-mode chunk gating: keep only the target speaker's active + // chunks (reference cache_gating — inactive chunks never reach that + // speaker's conformer/decoder, and its attention context spans its + // own kept history, matching the per-speaker streaming caches). + // Applied after the continuous pre_encode + xscaling, before the + // layer-0 injection, exactly where the reference gathers instances. + if (spk_supervision && n_batch == 1 && mt_keep_frames > 0) { + ggml_tensor * keep = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, mt_keep_frames); + ggml_set_name(keep, "mt_keep.in"); + ggml_set_input(keep); + eb.mt_keep_in = keep; + x = ggml_get_rows(ctx, x, keep); + x = conf::named(x, "enc.pre_encode.mt_gathered"); + } + if (hp.has_spk_kernel) { - x = apply_spk_kernel_injection(ctx, x, w, hp); + ggml_tensor * spk_mask = nullptr; + ggml_tensor * bg_mask = nullptr; + if (spk_supervision && n_batch == 1) { + const int64_t T_inj = x->ne[1]; + spk_mask = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 1, T_inj); + ggml_set_name(spk_mask, "spk_mask.in"); + ggml_set_input(spk_mask); + bg_mask = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 1, T_inj); + ggml_set_name(bg_mask, "bg_mask.in"); + ggml_set_input(bg_mask); + eb.spk_mask_in = spk_mask; + eb.bg_mask_in = bg_mask; + } + x = apply_spk_kernel_injection(ctx, x, w, hp, spk_mask, bg_mask); x = conf::named(x, "enc.pre_encode.spk_injected"); } @@ -644,7 +699,8 @@ EncoderBuild build_encoder_graph_streaming(ggml_context * ctx, int drop_extra_pre_encoded, StreamingEncoderCacheIO & cache_io, ggml_type kv_type, - const char * backend_name) { + const char * backend_name, + bool spk_supervision) { conf::ConvPolicy policy{}; policy.direct_pw = conf::detect_direct_pw(backend_name); policy.direct_dw_in_block = detect_direct_dw_in_block(backend_name); @@ -722,8 +778,24 @@ EncoderBuild build_encoder_graph_streaming(ggml_context * ctx, } // Apply the same optional layer-0 injection to each streaming chunk. + // With spk_supervision (multitalker streaming pass), the per-chunk + // speaker/background masks become graph inputs the driver fills from + // the diarizer predictions for this chunk's frames. if (hp.has_spk_kernel) { - x = apply_spk_kernel_injection(ctx, x, w, hp); + ggml_tensor * spk_mask = nullptr; + ggml_tensor * bg_mask = nullptr; + if (spk_supervision) { + const int64_t T_inj = x->ne[1]; + spk_mask = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 1, T_inj); + ggml_set_name(spk_mask, "stream.spk_mask.in"); + ggml_set_input(spk_mask); + bg_mask = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 1, T_inj); + ggml_set_name(bg_mask, "stream.bg_mask.in"); + ggml_set_input(bg_mask); + eb.spk_mask_in = spk_mask; + eb.bg_mask_in = bg_mask; + } + x = apply_spk_kernel_injection(ctx, x, w, hp, spk_mask, bg_mask); } const int64_t T_q_new = x->ne[1]; diff --git a/src/arch/parakeet/encoder.h b/src/arch/parakeet/encoder.h index 23f94270..dbe42f5e 100644 --- a/src/arch/parakeet/encoder.h +++ b/src/arch/parakeet/encoder.h @@ -134,6 +134,22 @@ struct EncoderBuild { ggml_tensor * pre_encode_mask_s2_in = nullptr; // after relu3 ggml_tensor * pre_encode_mask_s3_in = nullptr; // after relu6 + // Multitalker speaker-kernel supervision inputs, ne=[1, T_enc] f32 + // each. Null unless build_encoder_graph was called with + // spk_supervision on a speaker-kernel variant (n_batch == 1). The + // driver fills spk_mask_in with the target speaker's per-frame + // activity (raw diarizer sigmoids) and bg_mask_in with the binarized + // union of the other active speakers, both aligned to encoder frames. + ggml_tensor * spk_mask_in = nullptr; + ggml_tensor * bg_mask_in = nullptr; + + // Kernel-mode chunk gating (multitalker): I32 ne=[T_keep] gather + // indices into the pre_encode output, filled by the driver with the + // target speaker's active-chunk encoder frames. Null unless + // build_encoder_graph was called with mt_keep_frames > 0. When + // present, spk_mask_in/bg_mask_in/out are sized T_keep, not T_enc. + ggml_tensor * mt_keep_in = nullptr; + // Encoder forward output, ne=[d_model, T_enc, 1, 1] f32. Equal // to dumps.final_out; provided as a separate field so callers // that don't care about intermediates can ignore the dumps @@ -198,7 +214,18 @@ EncoderBuild build_encoder_graph(ggml_context * compute_ctx, // + conv_pad_mask_in sized for the batch) and // wire them into every conformer block. The // driver fills them from per-utterance lengths. - bool batch_var_len = false); + bool batch_var_len = false, + // Multitalker bundle (n_batch == 1 only): expose + // per-frame speaker/background supervision masks + // as graph inputs (EncoderBuild::spk_mask_in / + // bg_mask_in) consumed by the layer-0 + // speaker-kernel injection. + bool spk_supervision = false, + // Kernel-mode chunk gating: > 0 gathers that many + // pre_encode frames (driver-filled indices in + // EncoderBuild::mt_keep_in) before injection and + // the conformer blocks. 0 = no gather. + int mt_keep_frames = 0); // Per-layer streaming cache I/O for the streaming encoder graph. // The inputs are persistent backend tensors (allocated outside the @@ -270,6 +297,11 @@ EncoderBuild build_encoder_graph_streaming(ggml_context * compute_ctx int drop_extra_pre_encoded, StreamingEncoderCacheIO & cache_io, ggml_type kv_type = GGML_TYPE_COUNT, - const char * backend_name = ""); + const char * backend_name = "", + // Multitalker streaming pass: expose the + // per-chunk speaker/background supervision + // masks (ne=[1, T_q_new]) as graph inputs + // for the layer-0 kernel injection. + bool spk_supervision = false); } // namespace transcribe::parakeet diff --git a/src/arch/parakeet/model.cpp b/src/arch/parakeet/model.cpp index 793efd7c..ba22b4b1 100644 --- a/src/arch/parakeet/model.cpp +++ b/src/arch/parakeet/model.cpp @@ -118,6 +118,15 @@ ParakeetModel::~ParakeetModel() { safe_buffer_free(conv_pw_f32_buffer); conv_pw_f32_buffer = nullptr; } + // Embedded-diarizer fused BN (multitalker bundle only). + if (diar_bn_ctx != nullptr) { + ggml_free(diar_bn_ctx); + diar_bn_ctx = nullptr; + } + if (diar_bn_buffer != nullptr) { + safe_buffer_free(diar_bn_buffer); + diar_bn_buffer = nullptr; + } if (ctx_meta != nullptr) { ggml_free(ctx_meta); ctx_meta = nullptr; @@ -276,6 +285,8 @@ transcribe_status promote_conv_pw_to_f32_on_cpu(ParakeetModel & m) { // Default variant string when the GGUF did not carry stt.variant. constexpr const char k_default_variant[] = "tdt-0.6b-v2"; +} // namespace + // Allocate the streaming encoder caches (cache_last_channel, // cache_last_time), lazily on the first stream_begin for ChunkedLimited // variants. Layout matches NeMo's get_initial_cache_state (see @@ -382,6 +393,8 @@ void reset_streaming_decoder_state(ParakeetSession * pc, const ParakeetModel * p pc->stream_dec_state.initialized = true; } +namespace { + // Forward declarations for the Arch trait below. extern transcribe_status load(Loader &, const transcribe_model_load_params *, transcribe_model **); extern transcribe_status init_context(transcribe_model *, const transcribe_session_params *, transcribe_session **); @@ -542,6 +555,27 @@ transcribe_status load(Loader & loader, const transcribe_model_load_params * par return st; } + // Multitalker bundle: claim the embedded Sortformer diarizer. The + // bundle GGUF (scripts/compose-multitalker-bundle.py) carries the + // diarizer's tensors under a name prefix next to the ASR's own, plus + // the stt.sortformer.* hparams. Weight resolution needs gguf_data (KVs) + // + ctx_meta (tensors), so it runs before gguf_free; the BN fusion + // below needs uploaded tensor DATA, so it runs after this point too. + { + const int64_t k_embedded = gguf_find_key(gguf_data, "stt.parakeet.diarizer.embedded"); + if (k_embedded >= 0 && gguf_get_val_bool(gguf_data, k_embedded)) { + const int64_t k_prefix = gguf_find_key(gguf_data, "stt.parakeet.diarizer.tensor_prefix"); + const char * prefix = (k_prefix >= 0) ? gguf_get_val_str(gguf_data, k_prefix) : "sortformer."; + m->diar = std::make_unique(); + if (const transcribe_status st = + transcribe::sortformer::init_embedded_diarizer(gguf_data, m->ctx_meta, prefix, *m->diar); + st != TRANSCRIBE_OK) { + gguf_free(gguf_data); + return st; + } + } + } + gguf_free(gguf_data); // Fuse BatchNorm into scale + bias (replaces 4 elementwise ops per @@ -565,6 +599,31 @@ transcribe_status load(Loader & loader, const transcribe_model_load_params * par return st; } + // Multitalker bundle post-load: fuse the diarizer conformer's BN (needs + // uploaded data), build its ceil-framed mel frontend, and publish the + // DIARIZATION capability — for a bundle it is a property of the file. + if (m->diar != nullptr) { + if (const transcribe_status st = transcribe::sortformer::fuse_embedded_diar_bn( + *m->diar, m->plan.scheduler_list.back(), &m->diar_bn_ctx, &m->diar_bn_buffer); + st != TRANSCRIBE_OK) { + return st; + } + { + transcribe::MelConfig cfg{}; + cfg.sample_rate = m->diar->hp.fe_sample_rate; + cfg.num_mels = m->diar->hp.fe_num_mels; + cfg.n_fft = m->diar->hp.fe_n_fft; + cfg.win_length = m->diar->hp.fe_win_length; + cfg.hop_length = m->diar->hp.fe_hop_length; + cfg.pre_emphasis = m->diar->hp.fe_pre_emphasis; + cfg.normalize = m->diar->hp.fe_normalize; + cfg.pad_mode = "constant"; + cfg.nemo_seq_len_ceil = true; // sortformer port framing + m->diar_mel.emplace(cfg); + } + transcribe::set_feature(m.get(), TRANSCRIBE_FEATURE_DIARIZATION, true); + } + m->t_load_us = ggml_time_us() - t_load_start; // The caller now owns the model and must call transcribe_model_free. @@ -717,9 +776,19 @@ static transcribe_status decode_and_populate(ParakeetSession * pc, } } pc->t_decode_us = ggml_time_us() - t_dec_start; + return build_result_from_raw_tokens(pc, pm, params); +} - // ----- Build the public result hierarchy ----- - // +} // namespace + +// ----- Build the public result hierarchy from pc->raw_tokens ----- +// +// External linkage: the multitalker streaming pass accumulates raw +// tokens per speaker (with absolute-frame step_at_emit) and reuses this +// to materialize tokens/words/segments/text. +transcribe_status build_result_from_raw_tokens(ParakeetSession * pc, + ParakeetModel * pm, + const transcribe_run_params * params) { // step_at_emit is an encoder frame index; one frame is // subsampling_factor * hop_length / sample_rate seconds (80 ms on // v2/v3). Shared with the streaming builder. @@ -896,11 +965,14 @@ static transcribe_status decode_and_populate(ParakeetSession * pc, return TRANSCRIBE_OK; } -static transcribe_status run_one_shot_inner(ParakeetSession * pc, - ParakeetModel * pm, - const float * pcm, - int n_samples, - const transcribe_run_params * params) { +// External linkage: also driven per speaker by run_multitalker +// (multitalker.cpp) with a supervision pass. +transcribe_status run_one_shot_inner(ParakeetSession * pc, + ParakeetModel * pm, + const float * pcm, + int n_samples, + const transcribe_run_params * params, + const MultitalkerPass * mt) { // Pre-run abort check (the single observation point on this path). if (pc->poll_abort()) { return TRANSCRIBE_ERR_ABORTED; @@ -925,6 +997,29 @@ static transcribe_status run_one_shot_inner(ParakeetSession * pc, } pc->t_mel_us = ggml_time_us() - t_mel_start; + // Multitalker masked mode (NeMo mask_features): binarize the target + // speaker's per-diar-frame activity, expand 8x to feature frames from + // t=0, multiply the mel; feature frames past the supervision (or with + // an inactive target) zero out, and original exact-zero features take + // the log-floor mask_value. Mirrors the reference quirk exactly. + if (mt != nullptr && !mt->use_kernel) { + const int sub = pm->hparams.enc_subsampling_factor > 0 ? pm->hparams.enc_subsampling_factor : 8; + const size_t T_diar = mt->spk.size(); + for (int m = 0; m < mel_n_mels; ++m) { + float * row = pc->mel_buf.data() + static_cast(m) * mel_n_frames; + for (int f = 0; f < mel_n_frames; ++f) { + const size_t d = static_cast(f / sub); + const bool active = d < T_diar && mt->spk[d] > mt->threshold; + const float v = row[f]; + if (v == 0.0f) { + row[f] = mt->mask_value; + } else if (!active) { + row[f] = 0.0f; + } + } + } + } + // ----- Reset per-call compute state ----- // Free the previous run's compute_ctx; encoder_out is invalidated. if (pc->compute_ctx != nullptr) { @@ -959,11 +1054,35 @@ static transcribe_status run_one_shot_inner(ParakeetSession * pc, resolved_kv = GGML_TYPE_F16; } - EncoderBuild eb = - build_encoder_graph(pc->compute_ctx, pm->weights, pm->hparams, mel_n_frames, resolved_kv, pm->backend.c_str()); + const bool spk_supervision = (mt != nullptr && mt->use_kernel); + // Kernel-mode chunk gating: sanitize the orchestrator's keep list + // against the actual pre_encode output length (the orchestrator + // builds its chunk grid from the diar frame count, which can trail + // the encoder length by a frame at the clip tail). + std::vector mt_keep; + if (spk_supervision && !mt->keep_enc_frames.empty()) { + const bool causal = + (pm->hparams.enc_att_context_style == ParakeetHParams::AttContextStyle::ChunkedLimited); + const int T_pred = pre_encode_time_out( + pre_encode_time_out(pre_encode_time_out(mel_n_frames, causal), causal), causal); + mt_keep.reserve(mt->keep_enc_frames.size()); + for (const int32_t i : mt->keep_enc_frames) { + if (i >= 0 && i < T_pred) { + mt_keep.push_back(i); + } + } + } + const int mt_keep_frames = static_cast(mt_keep.size()); + EncoderBuild eb = build_encoder_graph(pc->compute_ctx, pm->weights, pm->hparams, mel_n_frames, resolved_kv, + pm->backend.c_str(), /*buf_mask=*/nullptr, /*n_batch=*/1, + /*batch_var_len=*/false, spk_supervision, mt_keep_frames); if (eb.mel_in == nullptr || eb.out == nullptr || eb.graph == nullptr) { return TRANSCRIBE_ERR_GGUF; // build_encoder_graph logged } + if (spk_supervision && (eb.spk_mask_in == nullptr || eb.bg_mask_in == nullptr)) { + log_msg(TRANSCRIBE_LOG_LEVEL_ERROR, "parakeet run: speaker supervision requested but model has no spk kernel"); + return TRANSCRIBE_ERR_INVALID_ARG; + } // ----- Allocate compute tensors via the multi-backend scheduler. // Created lazily, persists across calls. ----- @@ -988,6 +1107,48 @@ static transcribe_status run_one_shot_inner(ParakeetSession * pc, transcribe::debug::dump_tensor("enc.mel.in", eb.mel_in, "encoder.mel"); + // Multitalker kernel-mode supervision upload. Length alignment mirrors + // NeMo's solve_length_mismatch: pad LEFT with the default value (1.0 + // for the target-speaker mask, 0.0 for background) when the + // supervision is short, keep the LAST T frames when it is long. + if (eb.spk_mask_in != nullptr && mt != nullptr) { + // Ungated encoder length (pre-gather); the injection masks are + // sized to the gathered length when chunk gating is active. + const int T_full = static_cast(eb.dumps.pre_encode_out->ne[1]); + const int T_inj = static_cast(eb.spk_mask_in->ne[1]); + auto align_full = [&](const std::vector & src, float default_value) { + std::vector buf(static_cast(T_full), default_value); + const int n = static_cast(src.size()); + if (n >= T_full) { + std::copy(src.end() - T_full, src.end(), buf.begin()); + } else { + std::copy(src.begin(), src.end(), buf.begin() + (T_full - n)); + } + return buf; + }; + auto fill_mask = [&](ggml_tensor * dst, const std::vector & src, float default_value) { + std::vector full = align_full(src, default_value); + if (mt_keep_frames > 0) { + std::vector gathered(static_cast(T_inj), default_value); + for (int g = 0; g < T_inj && g < mt_keep_frames; ++g) { + const int32_t i = mt_keep[static_cast(g)]; + if (i >= 0 && i < T_full) { + gathered[static_cast(g)] = full[static_cast(i)]; + } + } + ggml_backend_tensor_set(dst, gathered.data(), 0, gathered.size() * sizeof(float)); + } else { + ggml_backend_tensor_set(dst, full.data(), 0, full.size() * sizeof(float)); + } + }; + fill_mask(eb.spk_mask_in, mt->spk, 1.0f); + fill_mask(eb.bg_mask_in, mt->bg, 0.0f); + if (eb.mt_keep_in != nullptr) { + ggml_backend_tensor_set(eb.mt_keep_in, mt_keep.data(), 0, + mt_keep.size() * sizeof(int32_t)); + } + } + // Prompt one-hot input (multilingual variants only): fill // prompt_one_hot_in with the resolved language's one-hot replicated // across T_enc frames (see resolve_prompt_id). @@ -1185,6 +1346,8 @@ static transcribe_status run_one_shot_inner(ParakeetSession * pc, return decode_and_populate(pc, pm, params, pc->enc_host.data(), T_enc, d_enc, /*utt_index=*/-1, enc_dump_name); } +namespace { + // One-shot entry point. Validates session/pm, clears the previous result // snapshot, then forwards to the shared inference helper (also reused by // the streaming hooks). @@ -1206,6 +1369,15 @@ transcribe_status run(transcribe_session * session, } pc->clear_result(); + + // Multitalker bundle: diarize=ON routes through the embedded-sortformer + // orchestrator (per-speaker passes + merged speaker-tagged result). + // Without an embedded diarizer the dispatcher has already WARNed and we + // proceed single-speaker, preserving the shipped behavior. + if (params != nullptr && params->diarize == TRANSCRIBE_DIARIZE_MODE_ON && pm->diar != nullptr) { + return run_multitalker(pc, pm, pcm, n_samples, params); + } + return run_one_shot_inner(pc, pm, pcm, n_samples, params); } @@ -1486,6 +1658,15 @@ transcribe_status run_batch(transcribe_session * session, } transcribe::debug::init(); + // Multitalker is a transcribe_run concern for now: batch keeps the + // shipped single-speaker semantics even on a bundle model. Warn so a + // diarize=ON batch caller isn't silently downgraded. + if (params != nullptr && params->diarize == TRANSCRIBE_DIARIZE_MODE_ON && pm->diar != nullptr) { + log_msg(TRANSCRIBE_LOG_LEVEL_WARN, + "parakeet: diarize=ON is not yet supported in transcribe_run_batch; " + "utterances are decoded single-speaker (use transcribe_run for multitalker)"); + } + // Compute each utterance's mel in parallel (pure host, no // cross-utterance state). A malformed utterance falls the whole call // back to the per-utterance path (keeps the batch tensor rectangular). @@ -1763,8 +1944,6 @@ void compute_chunked_limited_with_rc_mask(float * out_buf, } } -namespace { - // Build, run, and post-process a single streaming encoder chunk. // // mel_chunk_data row-major [n_mels, n_mel_chunk_frames] f32. @@ -1774,14 +1953,23 @@ namespace { // mel_frames_advance mel frames this chunk consumes from the input // (NOT n_mel_chunk_frames when a cache prepend // is in play). +// mt_spk / mt_bg / mt_mask_len optional multitalker per-chunk +// supervision (kernel injection masks over the +// chunk's new encoder frames); both null for +// the single-speaker paths. // On success, appends TdtTokens to pc->raw_tokens and advances the cache -// + decoder state. +// + decoder state. External linkage: the multitalker streaming pass in +// multitalker.cpp drives this per active speaker with swapped-in +// per-speaker cache/decoder state. transcribe_status emit_streaming_chunk(ParakeetSession * pc, ParakeetModel * pm, const float * mel_chunk_data, int n_mel_chunk_frames, int drop_extra_pre_encoded, - int mel_frames_advance) { + int mel_frames_advance, + const float * mt_spk, + const float * mt_bg, + int mt_mask_len) { const auto & hp = pm->hparams; const int n_layers = static_cast(pm->weights.blocks.size()); @@ -1853,8 +2041,10 @@ transcribe_status emit_streaming_chunk(ParakeetSession * pc, cache_io.pos_proj = pc->stream_caches.pos_proj; cache_io.pos_proj_len = pc->stream_caches.pos_proj_len; + const bool mt_supervised = (mt_spk != nullptr && mt_bg != nullptr); EncoderBuild eb = build_encoder_graph_streaming(pc->compute_ctx, pm->weights, hp, n_mel_chunk_frames, - drop_extra_pre_encoded, cache_io, resolved_kv, pm->backend.c_str()); + drop_extra_pre_encoded, cache_io, resolved_kv, pm->backend.c_str(), + /*spk_supervision=*/mt_supervised); if (eb.out == nullptr || eb.graph == nullptr) { return TRANSCRIBE_ERR_GGUF; } @@ -1884,6 +2074,23 @@ transcribe_status emit_streaming_chunk(ParakeetSession * pc, const int T_cache = hp.enc_att_context_left; const int T_q_new = T_virtual - T_cache; + // Multitalker per-chunk supervision upload (kernel mode). Values + // cover this chunk's new encoder frames; pad with the mask defaults + // (spk 1.0 / bg 0.0) when the chunk's frame count trails the + // supplied length at the clip tail. + if (mt_supervised && eb.spk_mask_in != nullptr) { + const int T_inj = static_cast(eb.spk_mask_in->ne[1]); + auto fill = [&](ggml_tensor * dst, const float * src, float default_value) { + std::vector buf(static_cast(T_inj), default_value); + for (int t = 0; t < T_inj && t < mt_mask_len; ++t) { + buf[static_cast(t)] = src[t]; + } + ggml_backend_tensor_set(dst, buf.data(), 0, buf.size() * sizeof(float)); + }; + fill(eb.spk_mask_in, mt_spk, 1.0f); + fill(eb.bg_mask_in, mt_bg, 0.0f); + } + // Build & upload pos_emb. The zero-offset row sits at T_virtual - 1. // Null when every block consumes the memoized rel-pos projection. if (eb.pos_emb_in != nullptr) { @@ -2031,6 +2238,8 @@ transcribe_status emit_streaming_chunk(ParakeetSession * pc, return TRANSCRIBE_OK; } +namespace { + // Rebuild the public result vectors (tokens, full_text) from the // committed raw_tokens; idempotent. Words/segments are NOT populated // during streaming (deferred to finalize). result_kind is TOKEN whenever @@ -2685,6 +2894,15 @@ transcribe_status stream_begin(transcribe_session * session, // or a back-to-back stream_begin carries tokens. pc->stream_run_params = *run_params; + // Multitalker is a transcribe_run concern for now: the incremental + // streaming API keeps the shipped single-speaker semantics even on a + // bundle model. Warn so a diarize=ON stream isn't silently downgraded. + if (run_params->diarize == TRANSCRIBE_DIARIZE_MODE_ON && pm->diar != nullptr) { + log_msg(TRANSCRIBE_LOG_LEVEL_WARN, + "parakeet: diarize=ON is not yet supported on the streaming API; " + "the stream is decoded single-speaker (use transcribe_run for multitalker)"); + } + // Allocate streaming caches on first stream_begin (idempotent); zero // contents and reset cursors on every begin. if (const transcribe_status st = init_streaming_caches(pc, pm); st != TRANSCRIBE_OK) { diff --git a/src/arch/parakeet/multitalker.cpp b/src/arch/parakeet/multitalker.cpp new file mode 100644 index 00000000..946be1b3 --- /dev/null +++ b/src/arch/parakeet/multitalker.cpp @@ -0,0 +1,703 @@ +// arch/parakeet/multitalker.cpp - multitalker orchestration for bundle +// GGUFs (multitalker Parakeet + embedded streaming Sortformer). +// +// Mirrors NeMo's SpeakerTaggedASR parallel streaming pipeline +// (speech_to_text_multitalker_streaming_infer.py at the pinned rev), +// replayed offline inside one transcribe_run: +// +// 1. The embedded Sortformer runs its streaming AOSC/FIFO forward over +// the whole clip at the multitalker operating point (chunk = ASR +// chunk cadence att_context_right+1 = 14 diar frames, lc/rc = 0, +// spkcache 188, fifo 188, update period 188 — the example's config +// on the v2.1 checkpoint defaults). The accumulated per-chunk preds +// equal the causal per-chunk supervision the reference loop feeds +// each ASR instance. +// 2. Active speakers = columns whose activity exceeds 0.5 anywhere +// (the offline analog of the reference's per-chunk cache gating, +// which tops-k by max over the last 2 chunks). +// 3. One ASR decode pass per active speaker over the same audio, with +// that speaker's supervision: masked mode (NeMo masked_asr=True +// default) masks mel features; kernel mode (masked_asr=False, +// TRANSCRIBE_MULTITALKER_MODE=kernel) drives the layer-0 +// speaker-kernel injection. +// 4. Per-speaker results merge into one speaker-tagged result: segments +// ordered by start time with speaker_id set, words/tokens re-indexed +// under them, full_text joined in segment order (SegLST rendering), +// and the transcript-independent speaker_segment rows emitted from +// the diarizer preds. +// +// Deliberate deviation from the reference (documented in the family doc): +// the ASR pass is the validated OFFLINE chunked-attention graph over the +// whole clip, not a replay of the cache-aware streaming loop, so encoder +// state at chunk boundaries can differ at numerical (not transcript) +// scale. The streaming API multitalker path will be chunk-faithful by +// construction. + +#include "../sortformer/sortformer.h" +#include "ggml-backend.h" +#include "ggml.h" +#include "parakeet.h" +#include "transcribe-debug.h" +#include "transcribe-log.h" + +#include +#include +#include +#include +#include +#include + +namespace transcribe::parakeet { + +namespace sf = transcribe::sortformer; + +namespace { + +struct SpeakerDecode { + int speaker = 0; // 0-based diar column + std::vector tokens; + std::vector words; + std::vector segments; + std::string full_text; + std::string raw_text; +}; + +} // namespace + +// ---- Streaming multitalker passes (bounded memory) ---- +// +// Chunk-faithful mirror of the reference loop (conformer_stream_step + +// instance manager): one global 14-enc-frame chunk grid; per active +// speaker a private streaming cache + decoder-state instance that only +// advances on chunks where cache-gating selects that speaker. Memory is +// O(1) in clip length (~5 MB per speaker + one chunk graph), unlike the +// offline replay whose attention buffers grow quadratically. The +// per-speaker instances are swapped into the session around each +// emit_streaming_chunk call so the single-speaker streaming driver runs +// unchanged. +static transcribe_status run_streaming_passes(ParakeetSession * pc, + ParakeetModel * pm, + const float * pcm, + int n_samples, + const transcribe_run_params * params, + const std::vector & probs, + int T_diar, + int n_spk, + const std::vector & active, + bool use_kernel, + std::vector & per_spk, + int64_t & mel_us, + int64_t & enc_us, + int64_t & dec_us) { + const auto & hp = pm->hparams; + + // ASR mel over the whole clip (row-major [n_mels, n_frames]; each + // mel row contiguous over frames). ~170 MB at 55 min — bounded. + const int64_t t_mel_start = ggml_time_us(); + std::vector mel; + int n_mels = 0, n_frames = 0; + if (const transcribe_status st = pm->mel->compute(pcm, static_cast(n_samples), mel, n_mels, n_frames); + st != TRANSCRIBE_OK) { + return st; + } + mel_us += ggml_time_us() - t_mel_start; + + const int chunk_enc = hp.enc_att_context_right + 1; // 14 + const int sub = hp.enc_subsampling_factor; // 8 + const int mel_first = hp.enc_stream_sampling_frames_first + sub * hp.enc_att_context_right; // 105 + const int mel_chunk = chunk_enc * sub; // 112 + const int mel_cache = hp.enc_stream_pre_encode_cache_size; // 9 + const int drop_sub = hp.enc_stream_drop_extra_pre_encoded; // 2 + + // Reference cache_gating: speaker s is active in chunk k iff the max + // of its accumulated preds over the last 2 chunks (incl. current) + // exceeds 0.5. Applies to BOTH supervision modes (the reference + // instance selection is mode-independent). + auto chunk_active = [&](int s, int k) { + const int begin = std::max(0, (k - 1) * chunk_enc); + const int end = std::min((k + 1) * chunk_enc, T_diar); + float mx = 0.0f; + for (int t = begin; t < end; ++t) { + mx = std::max(mx, probs[static_cast(t) * n_spk + s]); + } + return mx > 0.5f; + }; + + struct Inst { + ParakeetStreamingCaches caches; + ParakeetStreamingDecoderState dec; + std::vector raw; + std::vector fed; // absolute enc frame per gathered frame + std::vector spk; // [T_diar] supervision values + std::vector bg; + bool started = false; + }; + std::vector inst(active.size()); + + auto swap_in = [&](Inst & I) { + std::swap(pc->stream_caches, I.caches); + std::swap(pc->stream_dec_state, I.dec); + std::swap(pc->raw_tokens, I.raw); + }; + auto free_inst = [&](Inst & I) { + if (I.caches.buffer != nullptr) { + ggml_backend_buffer_free(I.caches.buffer); + I.caches.buffer = nullptr; + } + if (I.caches.ctx != nullptr) { + ggml_free(I.caches.ctx); + I.caches.ctx = nullptr; + } + if (I.caches.pos_proj_buf != nullptr) { + ggml_backend_buffer_free(I.caches.pos_proj_buf); + I.caches.pos_proj_buf = nullptr; + } + if (I.caches.pos_proj_ctx != nullptr) { + ggml_free(I.caches.pos_proj_ctx); + I.caches.pos_proj_ctx = nullptr; + } + }; + + // Per-speaker supervision value arrays (same construction as the + // offline pass: raw sigmoids for the target, binarized union of the + // other active speakers for the background). + for (size_t i = 0; i < active.size(); ++i) { + const int s = active[i]; + inst[i].spk.resize(static_cast(T_diar)); + inst[i].bg.assign(static_cast(T_diar), 0.0f); + for (int t = 0; t < T_diar; ++t) { + inst[i].spk[static_cast(t)] = probs[static_cast(t) * n_spk + s]; + } + for (const int o : active) { + if (o == s) { + continue; + } + for (int t = 0; t < T_diar; ++t) { + if (probs[static_cast(t) * n_spk + o] > 0.5f) { + inst[i].bg[static_cast(t)] = 1.0f; + } + } + } + } + + const int64_t t_enc_start = ggml_time_us(); + std::vector chunk_buf; + transcribe_status st = TRANSCRIBE_OK; + + for (int k = 0;; ++k) { + const int c0_new = (k == 0) ? 0 : mel_first + (k - 1) * mel_chunk; // first NEW mel col + if (c0_new >= n_frames) { + break; + } + const int c0 = (k == 0) ? 0 : c0_new - mel_cache; // history prepend + const int c1 = std::min(c0_new + ((k == 0) ? mel_first : mel_chunk), n_frames); + const int n_feed = c1 - c0; + const int advance = c1 - c0_new; + if (n_feed <= 0 || advance <= 0) { + break; + } + + for (size_t i = 0; i < active.size() && st == TRANSCRIBE_OK; ++i) { + const int s = active[i]; + if (!chunk_active(s, k)) { + continue; + } + Inst & I = inst[i]; + + // Slice this chunk's mel columns (shared grid; the 9-column + // history prepend reproduces the continuous pre_encode). + chunk_buf.resize(static_cast(n_mels) * static_cast(n_feed)); + for (int m = 0; m < n_mels; ++m) { + std::memcpy(chunk_buf.data() + static_cast(m) * n_feed, + mel.data() + static_cast(m) * n_frames + c0, + static_cast(n_feed) * sizeof(float)); + } + + // Masked mode: reference mask_features semantics — + // masked = mel * mask (masked columns -> 0.0, NOT the + // log-silence value); cells whose ORIGINAL mel was exactly + // 0 -> mask_value; the upsampled mask is left-aligned to + // the chunk's NEW columns (col j -> chunk frame j/8) and + // the short side is left-PADDED WITH 0, so the history + // prepend columns are always masked. + if (!use_kernel) { + const int hist = c0_new - c0; // 9 (0 for the first chunk) + for (int c = 0; c < n_feed; ++c) { + bool keep = false; + if (c >= hist) { + const int f = k * chunk_enc + (c - hist) / sub; + keep = f < T_diar && I.spk[static_cast(f)] > 0.5f; + } + for (int m = 0; m < n_mels; ++m) { + float & v = chunk_buf[static_cast(m) * n_feed + c]; + if (v == 0.0f) { + v = -16.6355f; + } else if (!keep) { + v = 0.0f; + } + } + } + } + + // Kernel mode: per-chunk supervision over the NEW enc frames. + const int t_enc0 = k * chunk_enc; + const int mask_len = std::max(0, std::min(chunk_enc, T_diar - t_enc0)); + const float * spk_ptr = nullptr; + const float * bg_ptr = nullptr; + std::vector bg_compat; + if (use_kernel && mask_len > 0) { + spk_ptr = I.spk.data() + t_enc0; + bg_ptr = I.bg.data() + t_enc0; + // TRANSCRIBE_MULTITALKER_REF_BG_COMPAT=1 reproduces the + // reference harness's background-slot indexing bug + // (multispk_transcribe_utils.get_active_speakers_info + // takes range(len(active)) minus the SLOT id, so with + // active slots like [0,2] speaker 0's background tracks + // the silent slot 1 instead of slot 2). Verified against + // the reference's own bg_targets dumps. Parity tooling + // only — the default is the intended union of the other + // ACTIVE slots. + static const bool ref_bg_compat = + (std::getenv("TRANSCRIBE_MULTITALKER_REF_BG_COMPAT") != nullptr); + if (ref_bg_compat) { + std::vector act_k; + for (const int o : active) { + if (chunk_active(o, k)) { + act_k.push_back(o); + } + } + bg_compat.assign(static_cast(mask_len), 0.0f); + for (int slot = 0; slot < static_cast(act_k.size()); ++slot) { + if (slot == s) { + continue; // reference compares POSITION to SLOT id + } + for (int t = 0; t < mask_len; ++t) { + if (probs[static_cast(t_enc0 + t) * n_spk + slot] > 0.5f) { + bg_compat[static_cast(t)] = 1.0f; + } + } + } + bg_ptr = bg_compat.data(); + } + } + + swap_in(I); + if (!I.started) { + // (fields now live on pc after the swap) + if ((st = init_streaming_caches(pc, pm)) == TRANSCRIBE_OK) { + reset_streaming_decoder_state(pc, pm); + pc->stream_caches.att_context_left = hp.enc_att_context_left; + pc->stream_caches.att_context_right = hp.enc_att_context_right; + pc->stream_caches.channel_len = 0; + pc->stream_caches.chunk_step = 0; + } + } + if (st == TRANSCRIBE_OK) { + const int64_t off_before = pc->stream_dec_state.frame_offset; + st = emit_streaming_chunk(pc, pm, chunk_buf.data(), n_feed, + (k == 0) ? 0 : drop_sub, advance, + spk_ptr, bg_ptr, use_kernel ? mask_len : 0); + if (st == TRANSCRIBE_OK) { + const int n_new = static_cast(pc->stream_dec_state.frame_offset - off_before); + for (int f = 0; f < n_new; ++f) { + I.fed.push_back(t_enc0 + f); + } + } + } + swap_in(I); // swap back + I.started = true; + } + if (st != TRANSCRIBE_OK) { + break; + } + } + enc_us += ggml_time_us() - t_enc_start; + + // Build per-speaker results from the accumulated raw tokens, with + // step_at_emit remapped from the gathered timeline to absolute + // encoder frames through the fed-chunk list. + const int64_t t_dec_start = ggml_time_us(); + for (size_t i = 0; i < active.size(); ++i) { + Inst & I = inst[i]; + if (st == TRANSCRIBE_OK && !I.raw.empty()) { + for (auto & rt : I.raw) { + const size_t f = std::min(static_cast(std::max(rt.step_at_emit, 0)), I.fed.size() - 1); + rt.step_at_emit = I.fed[f]; + } + transcribe_run_params sp = *params; + sp.timestamps = TRANSCRIBE_TIMESTAMPS_AUTO; + pc->clear_result(); + pc->raw_tokens = std::move(I.raw); + const transcribe_status bst = build_result_from_raw_tokens(pc, pm, &sp); + if (bst != TRANSCRIBE_OK) { + st = bst; + } else { + SpeakerDecode r; + r.speaker = active[i]; + r.tokens = std::move(pc->tokens); + r.words = std::move(pc->words); + r.segments = std::move(pc->segments); + r.full_text = std::move(pc->full_text); + r.raw_text = std::move(pc->raw_text); + per_spk.push_back(std::move(r)); + } + } + free_inst(I); + } + dec_us += ggml_time_us() - t_dec_start; + return st; +} + +transcribe_status run_multitalker(ParakeetSession * pc, + ParakeetModel * pm, + const float * pcm, + int n_samples, + const transcribe_run_params * params) { + if (pm->diar == nullptr || !pm->diar_mel.has_value() || !pm->mel.has_value()) { + return TRANSCRIBE_ERR_INVALID_ARG; + } + if (pc->poll_abort()) { + return TRANSCRIBE_ERR_ABORTED; + } + transcribe::debug::init(); + + // Supervision mode. Default is the checkpoint's trained speaker-kernel + // path: on ami-ihm-test it scores 19.35% cpWER vs masked's 24.61% + // (and vs the NeMo reference's own 21.39% kernel / 24.00% masked). + // TRANSCRIBE_MULTITALKER_MODE=masked selects mel feature masking + // (the NeMo example default) until the family run-ext grows a knob. + bool use_kernel = true; + if (const char * mode = std::getenv("TRANSCRIBE_MULTITALKER_MODE")) { + use_kernel = (std::strcmp(mode, "masked") != 0); + } + + const sf::SortformerEmbedded & diar = *pm->diar; + + // ---- 1. Embedded diarizer streaming forward ---- + std::vector diar_mel; + int dm_mels = 0, dm_frames = 0; + if (const transcribe_status st = + pm->diar_mel->compute(pcm, static_cast(n_samples), diar_mel, dm_mels, dm_frames); + st != TRANSCRIBE_OK) { + return st; + } + + if (pc->sched == nullptr) { + pc->sched = ggml_backend_sched_new(pm->plan.scheduler_list.data(), nullptr, + static_cast(pm->plan.scheduler_list.size()), + /*graph_size=*/8192, /*parallel=*/false, /*op_offload=*/true); + if (pc->sched == nullptr) { + log_msg(TRANSCRIBE_LOG_LEVEL_ERROR, "parakeet multitalker: ggml_backend_sched_new failed"); + return TRANSCRIBE_ERR_GGUF; + } + } + + sf::SortformerStreamParams P = sf::resolve_stream_params(diar.hp, TRANSCRIBE_SORTFORMER_PRESET_DEFAULT); + P.chunk_len = pm->hparams.enc_att_context_right + 1; // ASR chunk cadence (14 at [70,13]) + P.chunk_left_context = 0; + P.chunk_right_context = 0; + P.spkcache_len = 188; + P.fifo_len = 188; + P.spkcache_update_period = 188; + // Reference-exact windowing: the NeMo loop feeds the diarizer the + // ASR streaming buffer's chunks (chunk_size_first = sampling_frames + + // sub * R mel frames first, then pre_encode_cache-frame overlapped + // windows with drop_extra_pre_encoded outputs discarded). + P.feat_first_chunk = pm->hparams.enc_stream_sampling_frames_first + + pm->hparams.enc_subsampling_factor * pm->hparams.enc_att_context_right; + P.feat_cache = pm->hparams.enc_stream_pre_encode_cache_size; + P.drop_pre_encode = pm->hparams.enc_stream_drop_extra_pre_encoded; + + const int64_t t_diar_start = ggml_time_us(); + transcribe::debug::push_name_prefix("mt.diar"); + const transcribe_status dst = + sf::run_diar_streaming_core(pc->diar_scratch, diar.hp, diar.conformer_hp, diar.conformer, diar.weights, + pm->backend.c_str(), pc->sched, pc->n_threads, P, diar_mel.data(), dm_mels, + dm_frames, pc); + transcribe::debug::pop_name_prefix(); + if (dst != TRANSCRIBE_OK) { + return dst; + } + const int64_t t_diar_us = ggml_time_us() - t_diar_start; + + const int sub = diar.hp.enc_subsampling_factor > 0 ? diar.hp.enc_subsampling_factor : 8; + const int n_spk = diar.hp.max_speakers; + const int T_diar = std::min(pc->diar_scratch.stream.total_n, (dm_frames + sub - 1) / sub); + const std::vector & probs = pc->diar_scratch.stream.total_preds; // row-major [total_n, n_spk] + + if (transcribe::debug::enabled()) { + const long long shape[2] = { T_diar, n_spk }; + transcribe::debug::dump_host_f32("mt.diar.probs", probs.data(), static_cast(T_diar) * n_spk, shape, + 2, "diarize"); + } + + // ---- 2. Active speakers ---- + std::vector active; + for (int s = 0; s < n_spk; ++s) { + float mx = 0.0f; + for (int t = 0; t < T_diar; ++t) { + mx = std::max(mx, probs[static_cast(t) * n_spk + s]); + } + if (mx > 0.5f) { + active.push_back(s); + } + } + + const double diar_ms_per_frame = + 1000.0 * static_cast(diar.hp.frame_hop) / static_cast(diar.hp.fe_sample_rate); + + if (active.empty()) { + // No speech activity detected anywhere (reference behavior: every + // chunk skipped). Empty-but-valid result. + pc->t_mel_us = 0; + pc->t_encode_us = t_diar_us; + pc->t_decode_us = 0; + pc->result_kind = TRANSCRIBE_TIMESTAMPS_NONE; + pc->has_result = true; + return TRANSCRIBE_OK; + } + + // ---- 3. Per-speaker decode passes ---- + // + // Default is the bounded-memory streaming pass (chunk-faithful to the + // reference loop). TRANSCRIBE_MULTITALKER_OFFLINE=1 selects the + // offline whole-clip replay (O(T^2) attention buffers; parity/dump + // tooling only). + std::vector per_spk; + per_spk.reserve(active.size()); + int64_t mel_us = 0, enc_us = 0, dec_us = 0; + + const bool offline_replay = (std::getenv("TRANSCRIBE_MULTITALKER_OFFLINE") != nullptr); + if (!offline_replay) { + if (const transcribe_status st = run_streaming_passes(pc, pm, pcm, n_samples, params, probs, T_diar, n_spk, + active, use_kernel, per_spk, mel_us, enc_us, dec_us); + st != TRANSCRIBE_OK) { + return st; + } + } else + for (const int s : active) { + MultitalkerPass pass; + pass.use_kernel = use_kernel; + pass.spk.resize(static_cast(T_diar)); + pass.bg.assign(static_cast(T_diar), 0.0f); + for (int t = 0; t < T_diar; ++t) { + pass.spk[static_cast(t)] = probs[static_cast(t) * n_spk + s]; + } + for (const int o : active) { + if (o == s) { + continue; + } + for (int t = 0; t < T_diar; ++t) { + if (probs[static_cast(t) * n_spk + o] > 0.5f) { + pass.bg[static_cast(t)] = 1.0f; + } + } + } + + // Kernel-mode chunk gating (reference cache_gating=true, + // cache_gating_buffer_size=2): a speaker's conformer/decoder only + // ever sees chunks where _find_active_speakers selected it — max + // of the accumulated preds over the last 2 chunks (incl. current) + // > 0.5. Without this, a mostly-inactive speaker's pass + // transcribes everyone else's speech (the trained kernels only + // ever saw gated chunks). Masked mode hard-silences non-target + // features instead, so it stays ungated here. + if (use_kernel) { + const int chunk = P.chunk_len; // 14 = nframes_per_chunk + const int n_chunks = (T_diar + chunk - 1) / chunk; + // +1 covers the encoder length trailing the diar frame count + // at the tail; run_one_shot_inner clamps to the true length. + pass.keep_enc_frames.reserve(static_cast(T_diar) + 1); + for (int k = 0; k < n_chunks; ++k) { + const int end = std::min((k + 1) * chunk, T_diar); + const int begin = std::max(0, (k - 1) * chunk); // 2-chunk window + float mx = 0.0f; + for (int t = begin; t < end; ++t) { + mx = std::max(mx, probs[static_cast(t) * n_spk + s]); + } + if (mx > 0.5f) { + const int enc_end = (k == n_chunks - 1) ? end + 1 : end; + for (int t = k * chunk; t < enc_end; ++t) { + pass.keep_enc_frames.push_back(t); + } + } + } + if (pass.keep_enc_frames.empty()) { + continue; // globally active but never chunk-selected + } + } + + // Decode at full timestamp resolution; the merged result is elided + // to the caller's request at the end. + transcribe_run_params sp = *params; + sp.timestamps = TRANSCRIBE_TIMESTAMPS_AUTO; + + pc->clear_result(); + char prefix[32]; + std::snprintf(prefix, sizeof(prefix), "mt.spk%d", s); + transcribe::debug::push_name_prefix(prefix); + const transcribe_status st = run_one_shot_inner(pc, pm, pcm, n_samples, &sp, &pass); + transcribe::debug::pop_name_prefix(); + if (st != TRANSCRIBE_OK) { + return st; + } + mel_us += pc->t_mel_us; + enc_us += pc->t_encode_us; + dec_us += pc->t_decode_us; + + SpeakerDecode r; + r.speaker = s; + r.tokens = std::move(pc->tokens); + r.words = std::move(pc->words); + r.segments = std::move(pc->segments); + r.full_text = std::move(pc->full_text); + r.raw_text = std::move(pc->raw_text); + + // Gated pass timestamps are in the gathered timeline; map each + // frame back through the keep list to absolute clip time. + if (!pass.keep_enc_frames.empty()) { + const auto & keep = pass.keep_enc_frames; + const double f_ms = diar_ms_per_frame; // 80 ms encoder cadence + auto remap_t0 = [&](int64_t t_ms) { + size_t f = static_cast(std::max(0, t_ms) / static_cast(f_ms)); + f = std::min(f, keep.size() - 1); + return static_cast(keep[f]) * static_cast(f_ms); + }; + auto remap_t1 = [&](int64_t t_ms) { + size_t f = static_cast(std::max(0, t_ms - 1) / static_cast(f_ms)); + f = std::min(f, keep.size() - 1); + return static_cast(keep[f] + 1) * static_cast(f_ms); + }; + for (auto & tk : r.tokens) { + tk.t0_ms = remap_t0(tk.t0_ms); + tk.t1_ms = remap_t1(tk.t1_ms); + } + for (auto & wd : r.words) { + wd.t0_ms = remap_t0(wd.t0_ms); + wd.t1_ms = remap_t1(wd.t1_ms); + } + for (auto & sg : r.segments) { + sg.t0_ms = remap_t0(sg.t0_ms); + sg.t1_ms = remap_t1(sg.t1_ms); + } + } + per_spk.push_back(std::move(r)); + } + + // ---- 4. Merge into one speaker-tagged result ---- + pc->clear_result(); + + struct SegRef { + const SpeakerDecode * r; + int seg_idx; + }; + + std::vector order; + for (const SpeakerDecode & r : per_spk) { + for (size_t i = 0; i < r.segments.size(); ++i) { + order.push_back({ &r, static_cast(i) }); + } + } + std::stable_sort(order.begin(), order.end(), + [](const SegRef & a, const SegRef & b) { + return a.r->segments[static_cast(a.seg_idx)].t0_ms < + b.r->segments[static_cast(b.seg_idx)].t0_ms; + }); + + std::string merged_text; + std::string merged_raw; + for (const SegRef & ref : order) { + const SpeakerDecode & r = *ref.r; + const transcribe_session::SegmentEntry & src = r.segments[static_cast(ref.seg_idx)]; + + const int new_seg_idx = static_cast(pc->segments.size()); + const int word_base = static_cast(pc->words.size()); + const int token_base = static_cast(pc->tokens.size()); + + for (int j = 0; j < src.n_tokens; ++j) { + transcribe_session::TokenEntry te = r.tokens[static_cast(src.first_token + j)]; + te.seg_index = new_seg_idx; + te.word_index = te.word_index - src.first_word + word_base; + pc->tokens.push_back(std::move(te)); + } + for (int j = 0; j < src.n_words; ++j) { + transcribe_session::WordEntry we = r.words[static_cast(src.first_word + j)]; + we.seg_index = new_seg_idx; + we.first_token = we.first_token - src.first_token + token_base; + pc->words.push_back(std::move(we)); + } + + transcribe_session::SegmentEntry seg = src; + seg.first_word = word_base; + seg.first_token = token_base; + seg.speaker_id = r.speaker + 1; // 1-based + pc->segments.push_back(std::move(seg)); + + if (!src.text.empty()) { + if (!merged_text.empty()) { + merged_text += ' '; + } + merged_text += src.text; + } + // One raw-text contribution per speaker, in first-segment order. + if (ref.seg_idx == 0 && !r.raw_text.empty()) { + if (!merged_raw.empty()) { + merged_raw += ' '; + } + merged_raw += r.raw_text; + } + } + pc->full_text = std::move(merged_text); + pc->raw_text = std::move(merged_raw); + + // Transcript-independent "who spoke when" rows from the diarizer preds + // (same emission as the standalone sortformer family). + sf::probs_to_speaker_segments(pc, probs, T_diar, n_spk, diar_ms_per_frame, /*threshold=*/0.5f); + + // ---- Elide to the caller's requested granularity (same convention + // as decode_and_populate). ---- + transcribe_timestamp_kind eff = params->timestamps; + if (eff == TRANSCRIBE_TIMESTAMPS_AUTO) { + eff = pm->caps.max_timestamp_kind; // TOKEN for parakeet + } + if (eff == TRANSCRIBE_TIMESTAMPS_NONE) { + pc->tokens.clear(); + pc->words.clear(); + for (auto & s : pc->segments) { + s.t0_ms = 0; + s.t1_ms = 0; + s.first_word = 0; + s.n_words = 0; + s.first_token = 0; + s.n_tokens = 0; + } + } else if (eff == TRANSCRIBE_TIMESTAMPS_SEGMENT) { + pc->tokens.clear(); + pc->words.clear(); + for (auto & s : pc->segments) { + s.first_word = 0; + s.n_words = 0; + s.first_token = 0; + s.n_tokens = 0; + } + } else if (eff == TRANSCRIBE_TIMESTAMPS_WORD) { + pc->tokens.clear(); + for (auto & w : pc->words) { + w.first_token = 0; + w.n_tokens = 0; + } + for (auto & s : pc->segments) { + s.first_token = 0; + s.n_tokens = 0; + } + } + + pc->t_mel_us = mel_us; + pc->t_encode_us = enc_us + t_diar_us; + pc->t_decode_us = dec_us; + pc->result_kind = eff; + pc->has_result = true; + return TRANSCRIBE_OK; +} + +} // namespace transcribe::parakeet diff --git a/src/arch/parakeet/parakeet.h b/src/arch/parakeet/parakeet.h index 0574e544..4b149e3d 100644 --- a/src/arch/parakeet/parakeet.h +++ b/src/arch/parakeet/parakeet.h @@ -7,6 +7,7 @@ #pragma once +#include "../sortformer/sortformer.h" // embedded diarizer (multitalker bundle) #include "decoder.h" #include "transcribe-backend.h" #include "transcribe-mel.h" @@ -16,6 +17,7 @@ #include "weights.h" #include +#include #include #include #include @@ -112,6 +114,21 @@ struct ParakeetModel final : public transcribe_model { // without a per-run backend readback. HostDecoderWeights host_decoder; + // Embedded Sortformer diarizer (multitalker bundle GGUFs). Present iff + // stt.parakeet.diarizer.embedded = true in the GGUF. The weight slots + // are borrowed views into this model's ctx_meta (resolved under the + // bundle's tensor prefix); the diarizer conformer's fused-BN params + // live in their own ctx + buffer, freed in the dtor. + std::unique_ptr diar; + ggml_context * diar_bn_ctx = nullptr; + ggml_backend_buffer_t diar_bn_buffer = nullptr; + + // Diarizer mel front-end. Same acoustic settings as the ASR frontend + // (the compose step enforces agreement) but with the sortformer port's + // ceil framing, so the embedded forward sees exactly what the + // standalone sortformer port validated against. + std::optional diar_mel; + ParakeetModel() = default; ~ParakeetModel() override; @@ -239,6 +256,10 @@ struct ParakeetSession final : public transcribe_session { std::vector enc_host; std::vector raw_tokens; + // Multitalker bundle scratch: streaming-diarizer AOSC/FIFO state for + // the embedded sortformer forward (diarize=ON runs only). + transcribe::sortformer::DiarStreamScratch diar_scratch; + // Per-call timings and the TDT decode result (tokens / words / // segments / full_text / result_kind / has_result) live on the base // transcribe_session; no per-family copies here. @@ -298,4 +319,72 @@ struct ParakeetSession final : public transcribe_session { ~ParakeetSession() override; }; +// ---- Multitalker (bundle) internals ----------------------------------- // + +// Per-speaker supervision for one multitalker decode pass, at the diar +// frame rate (80 ms). Mirrors NeMo's SpeakerTaggedASR hand-off: +// masked mode (use_kernel=false, the NeMo example default): the mel is +// masked per feature frame with the 8x-expanded binarized target +// activity (mask_features: masked = mel * mask; original-zero +// features -> mask_value). +// kernel mode (use_kernel=true): spk (raw sigmoids) and bg (binarized +// union of other actives) drive the layer-0 speaker-kernel injection +// as graph inputs (set_speaker_targets path). +struct MultitalkerPass { + bool use_kernel = false; + float threshold = 0.5f; + float mask_value = -16.6355f; + std::vector spk; // [T_diar] target-speaker activity + std::vector bg; // [T_diar] binarized union of other actives + // Kernel-mode chunk gating (reference cache_gating): encoder-frame + // indices of this speaker's ACTIVE 14-frame chunks, in order. The + // conformer + decoder see only these frames (gathered after the + // continuous pre_encode), mirroring the reference per-speaker cache + // that only advances on active chunks. Empty = no gating (masked + // mode / single-speaker). + std::vector keep_enc_frames; +}; + +// Shared one-utterance inference helper (mel -> encoder -> host decode -> +// result build on pc). Defined in model.cpp; also driven per speaker by +// the multitalker orchestrator with a supervision pass. +transcribe_status run_one_shot_inner(ParakeetSession * pc, + ParakeetModel * pm, + const float * pcm, + int n_samples, + const transcribe_run_params * params, + const MultitalkerPass * mt = nullptr); + +// Build tokens/words/segments/full_text on pc from pc->raw_tokens +// (defined in model.cpp; shared by the offline decode and the +// multitalker streaming pass). +transcribe_status build_result_from_raw_tokens(ParakeetSession * pc, + ParakeetModel * pm, + const transcribe_run_params * params); + +// Streaming primitives (defined in model.cpp) shared with the +// multitalker streaming pass, which drives one cache/decoder-state +// instance per speaker by swapping it into pc around each call. +transcribe_status init_streaming_caches(ParakeetSession * pc, ParakeetModel * pm); +void reset_streaming_decoder_state(ParakeetSession * pc, const ParakeetModel * pm); +transcribe_status emit_streaming_chunk(ParakeetSession * pc, + ParakeetModel * pm, + const float * mel_chunk_data, + int n_mel_chunk_frames, + int drop_extra_pre_encoded, + int mel_frames_advance, + const float * mt_spk = nullptr, + const float * mt_bg = nullptr, + int mt_mask_len = 0); + +// Multitalker offline run (diarize=ON on a bundle model): embedded +// sortformer streaming forward -> active-speaker selection -> one decode +// pass per active speaker -> merged speaker-tagged result. Defined in +// multitalker.cpp. +transcribe_status run_multitalker(ParakeetSession * pc, + ParakeetModel * pm, + const float * pcm, + int n_samples, + const transcribe_run_params * params); + } // namespace transcribe::parakeet diff --git a/src/arch/sortformer/model.cpp b/src/arch/sortformer/model.cpp index e59c746b..5ad59390 100644 --- a/src/arch/sortformer/model.cpp +++ b/src/arch/sortformer/model.cpp @@ -64,6 +64,12 @@ SortformerModel::~SortformerModel() { plan.primary = nullptr; } +DiarStreamScratch::~DiarStreamScratch() { + if (compute_ctx != nullptr) { + ggml_free(compute_ctx); + } +} + SortformerSession::~SortformerSession() { if (sched != nullptr) { transcribe::safe_sched_free(sched); @@ -111,12 +117,20 @@ void fill_conformer_hp(const SortformerHParams & s, pk::ParakeetHParams & p) { // Populate ONLY the pre_encode + block slots of a ParakeetWeights from the // GGUF (the conformer). Predictor / joint / head stay empty. Mirrors the // encoder portion of build_parakeet_weights (identical tensor names). -transcribe_status load_conformer_weights(ggml_context * ctx, const pk::ParakeetHParams & hp, pk::ParakeetWeights & w) { - char name[128]; - auto get = [&](const char * nm) -> ggml_tensor * { - ggml_tensor * t = ggml_get_tensor(ctx, nm); +// `prefix` (nullable, standalone default "") namespaces every tensor name +// for the multitalker bundle case. +transcribe_status load_conformer_weights(ggml_context * ctx, + const pk::ParakeetHParams & hp, + pk::ParakeetWeights & w, + const char * prefix = nullptr) { + const char * pfx = (prefix != nullptr) ? prefix : ""; + char name[160]; + auto get = [&](const char * nm) -> ggml_tensor * { + char full[192]; + std::snprintf(full, sizeof(full), "%s%s", pfx, nm); + ggml_tensor * t = ggml_get_tensor(ctx, full); if (t == nullptr) { - log_msg(TRANSCRIBE_LOG_LEVEL_ERROR, "sortformer: missing conformer tensor %s", nm); + log_msg(TRANSCRIBE_LOG_LEVEL_ERROR, "sortformer: missing conformer tensor %s", full); } return t; }; @@ -197,32 +211,37 @@ transcribe_status load_conformer_weights(ggml_context * ctx, const pk::ParakeetH // Fuse the conformer BatchNorm into scale + bias tensors (parakeet's // build_encoder_graph consumes conv_bn_fused_scale/bias, not the raw BN). -transcribe_status fuse_conformer_bn(SortformerModel & m) { - const size_t n_blocks = m.conformer.blocks.size(); +// The fused tensors are allocated on `alloc_backend`; the caller owns and +// frees *out_ctx / *out_buffer. Must run AFTER tensor data is uploaded. +transcribe_status fuse_conformer_bn_core(std::vector & blocks, + int64_t d, + ggml_backend_t alloc_backend, + ggml_context ** out_ctx, + ggml_backend_buffer_t * out_buffer) { + const size_t n_blocks = blocks.size(); if (n_blocks == 0) { return TRANSCRIBE_OK; } - const int64_t d = m.conformer_hp.enc_d_model; - const size_t tensor_bytes = static_cast(d) * sizeof(float); + const size_t tensor_bytes = static_cast(d) * sizeof(float); const size_t ctx_size = n_blocks * 2 * ggml_tensor_overhead() + 256; ggml_init_params params = { ctx_size, nullptr, /*no_alloc=*/true }; - m.bn_fused_ctx = ggml_init(params); - if (m.bn_fused_ctx == nullptr) { + *out_ctx = ggml_init(params); + if (*out_ctx == nullptr) { return TRANSCRIBE_ERR_BACKEND; } for (size_t i = 0; i < n_blocks; ++i) { - auto & b = m.conformer.blocks[i]; - b.conv_bn_fused_scale = ggml_new_tensor_1d(m.bn_fused_ctx, GGML_TYPE_F32, d); - b.conv_bn_fused_bias = ggml_new_tensor_1d(m.bn_fused_ctx, GGML_TYPE_F32, d); + auto & b = blocks[i]; + b.conv_bn_fused_scale = ggml_new_tensor_1d(*out_ctx, GGML_TYPE_F32, d); + b.conv_bn_fused_bias = ggml_new_tensor_1d(*out_ctx, GGML_TYPE_F32, d); } - m.bn_fused_buffer = ggml_backend_alloc_ctx_tensors(m.bn_fused_ctx, m.plan.scheduler_list.back()); - if (m.bn_fused_buffer == nullptr) { + *out_buffer = ggml_backend_alloc_ctx_tensors(*out_ctx, alloc_backend); + if (*out_buffer == nullptr) { return TRANSCRIBE_ERR_BACKEND; } std::vector bn_w(d), bn_b(d), rm(d), rv(d), fused_s(d), fused_b(d); for (size_t i = 0; i < n_blocks; ++i) { - auto & b = m.conformer.blocks[i]; + auto & b = blocks[i]; ggml_backend_tensor_get(b.conv_bn_w, bn_w.data(), 0, tensor_bytes); ggml_backend_tensor_get(b.conv_bn_b, bn_b.data(), 0, tensor_bytes); ggml_backend_tensor_get(b.conv_bn_rm, rm.data(), 0, tensor_bytes); @@ -238,6 +257,11 @@ transcribe_status fuse_conformer_bn(SortformerModel & m) { return TRANSCRIBE_OK; } +transcribe_status fuse_conformer_bn(SortformerModel & m) { + return fuse_conformer_bn_core(m.conformer.blocks, m.conformer_hp.enc_d_model, m.plan.scheduler_list.back(), + &m.bn_fused_ctx, &m.bn_fused_buffer); +} + // ---- diar-head graph helpers ---- ggml_tensor * layer_norm(ggml_context * ctx, ggml_tensor * x, ggml_tensor * w, ggml_tensor * b) { @@ -412,15 +436,19 @@ struct PreEncodeBuild { ggml_tensor * out = nullptr; }; -PreEncodeBuild build_pre_encode_graph(ggml_context * ctx, SortformerModel & m, int M) { +PreEncodeBuild build_pre_encode_graph(ggml_context * ctx, + const pk::ParakeetHParams & chp, + const pk::ParakeetPreEncode & pe, + const char * backend, + int M) { PreEncodeBuild b{}; - const int n_mels = m.conformer_hp.fe_num_mels; + const int n_mels = chp.fe_num_mels; ggml_tensor * mel_in = ggml_new_tensor_4d(ctx, GGML_TYPE_F32, M, n_mels, 1, 1); ggml_set_name(mel_in, "chunk.mel.in"); ggml_set_input(mel_in); - const conf::ConvPolicy policy = sf_conv_policy(m.backend.c_str()); - ggml_tensor * out = conf::build_pre_encode(ctx, sf_pre_view(m.conformer.pre_encode), mel_in, policy, - /*name_prefix=*/"chunk.pre_encode", /*error_tag=*/"sortformer", nullptr); + const conf::ConvPolicy policy = sf_conv_policy(backend); + ggml_tensor * out = conf::build_pre_encode(ctx, sf_pre_view(pe), mel_in, policy, + /*name_prefix=*/"chunk.pre_encode", /*error_tag=*/"sortformer", nullptr); if (out == nullptr) { return b; } @@ -441,9 +469,15 @@ struct StreamInferBuild { ggml_tensor * preds = nullptr; }; -StreamInferBuild build_stream_infer_graph(ggml_context * ctx, SortformerModel & m, int T_concat) { +StreamInferBuild build_stream_infer_graph(ggml_context * ctx, + const SortformerHParams & hp, + const pk::ParakeetHParams & chp, + const pk::ParakeetWeights & conformer, + const SortformerWeights & w, + const char * backend, + int T_concat) { StreamInferBuild b{}; - const int ed = m.conformer_hp.enc_d_model; + const int ed = chp.enc_d_model; ggml_tensor * concat_in = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, ed, T_concat); ggml_set_name(concat_in, "stream.concat.in"); ggml_set_input(concat_in); @@ -458,13 +492,13 @@ StreamInferBuild build_stream_infer_graph(ggml_context * ctx, SortformerModel & conf::BlockParams bp{}; bp.d_model = ed; - bp.n_head = m.conformer_hp.enc_n_heads; - bp.conv_kernel = m.conformer_hp.enc_conv_kernel; + bp.n_head = chp.enc_n_heads; + bp.conv_kernel = chp.enc_conv_kernel; bp.kv_type = GGML_TYPE_F32; bool enc_use_flash = true, dec_use_flash = false; transcribe::flash::apply_env_overrides(enc_use_flash, dec_use_flash); bp.use_flash = enc_use_flash; - bp.policy = sf_conv_policy(m.backend.c_str()); + bp.policy = sf_conv_policy(backend); bp.att_context_left = -1; // full (offline) attention over the concat bp.att_context_right = -1; bp.att_context_style = conf::BlockParams::AttContextStyle::Regular; @@ -472,24 +506,24 @@ StreamInferBuild build_stream_infer_graph(ggml_context * ctx, SortformerModel & bp.conv_context_right = -1; bp.conv_norm_type = conf::BlockParams::ConvNormType::BatchNorm; - for (int i = 0; i < m.conformer_hp.enc_n_layers; ++i) { - x = conf::build_conformer_block(ctx, x, pos_emb_in, sf_block_view(m.conformer.blocks[static_cast(i)]), + for (int i = 0; i < chp.enc_n_layers; ++i) { + x = conf::build_conformer_block(ctx, x, pos_emb_in, sf_block_view(conformer.blocks[static_cast(i)]), bp); } // encoder_proj (enc_d_model -> tf_d_model) then 18x post-LN transformer. - ggml_tensor * t = linear(ctx, m.weights.enc_proj_w, x, m.weights.enc_proj_b); - const int d = m.hparams.tf_d_model; - for (int i = 0; i < m.hparams.tf_n_layers; ++i) { - t = tf_block(ctx, m.weights.tf_blocks[static_cast(i)], t, d, m.hparams.tf_n_heads, T_concat); + ggml_tensor * t = linear(ctx, w.enc_proj_w, x, w.enc_proj_b); + const int d = hp.tf_d_model; + for (int i = 0; i < hp.tf_n_layers; ++i) { + t = tf_block(ctx, w.tf_blocks[static_cast(i)], t, d, hp.tf_n_heads, T_concat); } // Diar head (forward_speaker_sigmoids). All frames valid in sync mode, so // the encoder_mask multiply is a no-op. ggml_tensor * h = ggml_relu(ctx, t); - h = linear(ctx, m.weights.fc1_w, h, m.weights.fc1_b); + h = linear(ctx, w.fc1_w, h, w.fc1_b); h = ggml_relu(ctx, h); - ggml_tensor * s = linear(ctx, m.weights.single_spk_head_w, h, m.weights.single_spk_head_b); + ggml_tensor * s = linear(ctx, w.single_spk_head_w, h, w.single_spk_head_b); ggml_tensor * preds = ggml_sigmoid(ctx, s); // [n_spk, T_concat] ggml_cgraph * graph = ggml_new_graph_custom(ctx, 8192, false); @@ -602,6 +636,33 @@ transcribe_status load(Loader & loader, const transcribe_model_load_params * par return TRANSCRIBE_OK; } +// ---- Embedded-diarizer surface (multitalker bundle; see sortformer.h) ---- + +transcribe_status init_embedded_diarizer(const gguf_context * gguf, + ggml_context * ctx_meta, + const char * tensor_prefix, + SortformerEmbedded & out) { + if (gguf == nullptr || ctx_meta == nullptr) { + return TRANSCRIBE_ERR_INVALID_ARG; + } + if (const transcribe_status st = read_sortformer_hparams(gguf, out.hp); st != TRANSCRIBE_OK) { + return st; + } + fill_conformer_hp(out.hp, out.conformer_hp); + if (const transcribe_status st = load_conformer_weights(ctx_meta, out.conformer_hp, out.conformer, tensor_prefix); + st != TRANSCRIBE_OK) { + return st; + } + return build_sortformer_weights(ctx_meta, out.hp, out.weights, tensor_prefix); +} + +transcribe_status fuse_embedded_diar_bn(SortformerEmbedded & e, + ggml_backend_t backend, + ggml_context ** out_ctx, + ggml_backend_buffer_t * out_buffer) { + return fuse_conformer_bn_core(e.conformer.blocks, e.conformer_hp.enc_d_model, backend, out_ctx, out_buffer); +} + transcribe_status init_context(transcribe_model * model, const transcribe_session_params * params, transcribe_session ** out_ctx) { @@ -619,13 +680,14 @@ transcribe_status init_context(transcribe_model * model, // Threshold-based probs -> speaker segments (simple offline segmentation; // the DER-grade dihard3 post-processing is a later, streaming-checkpoint // concern). probs is row-major [T, n_spk]. Emits one contiguous run per -// speaker as a speaker_segment row. -static void probs_to_speaker_segments(transcribe_session * pc, - const std::vector & probs, - int T, - int n_spk, - double ms_per_frame, - float threshold) { +// speaker as a speaker_segment row. Non-static: the parakeet multitalker +// bundle path emits its transcript-independent view through this too. +void probs_to_speaker_segments(transcribe_session * pc, + const std::vector & probs, + int T, + int n_spk, + double ms_per_frame, + float threshold) { for (int s = 0; s < n_spk; ++s) { int run_start = -1; for (int t = 0; t <= T; ++t) { @@ -720,8 +782,9 @@ static transcribe_status run_offline_forward(SortformerSession * pc, SortformerM if (eb.pos_emb_in != nullptr) { const int d_model = pm->conformer_hp.enc_d_model; const int pos_len = static_cast(eb.pos_emb_in->ne[1]); - fill_rel_pos_emb(pc->pos_buf, pc->pos_div_term, pos_len, d_model); - ggml_backend_tensor_set(eb.pos_emb_in, pc->pos_buf.data(), 0, pc->pos_buf.size() * sizeof(float)); + fill_rel_pos_emb(pc->scratch.pos_buf, pc->scratch.pos_div_term, pos_len, d_model); + ggml_backend_tensor_set(eb.pos_emb_in, pc->scratch.pos_buf.data(), 0, + pc->scratch.pos_buf.size() * sizeof(float)); } transcribe::configure_sched_n_threads(pc->sched, pc->n_threads); @@ -737,155 +800,222 @@ static transcribe_status run_offline_forward(SortformerSession * pc, SortformerM return TRANSCRIBE_OK; } -// Streaming AOSC/FIFO forward (the product path). Chunks the mel per NeMo's -// streaming_feat_loader, runs Graph A (pre_encode) then Graph B (blocks + -// proj + transformer + head) over the [spkcache|fifo|chunk] concat, and drives -// the host streaming_update_sync / _compress_spkcache state machine. Emits the -// accumulated T x n_spk probs as diar.probs and the speaker segments. -static transcribe_status run_streaming(SortformerSession * pc, - SortformerModel * pm, - int mel_n_mels, - int mel_n_frames, - double ms_per_frame, - transcribe_sortformer_preset preset) { - const SortformerStreamParams P = resolve_stream_params(pm->hparams, preset); - const int ed = pm->conformer_hp.enc_d_model; - const int n_spk = pm->hparams.max_speakers; - const int sub = pm->hparams.enc_subsampling_factor; - const int feat_len = mel_n_frames; - - if (sub <= 0 || P.chunk_len <= 0) { +// Streaming AOSC/FIFO forward core (the product path). Chunks the mel per +// NeMo's streaming_feat_loader, runs Graph A (pre_encode) then Graph B +// (blocks + proj + transformer + head) over the [spkcache|fifo|chunk] +// concat, and drives the host streaming_update_sync / _compress_spkcache +// state machine. Accumulates the T x n_spk probs in sc.stream.total_preds. +// Family-agnostic: also driven by the parakeet multitalker bundle path. +transcribe_status run_diar_streaming_core(DiarStreamScratch & sc, + const SortformerHParams & hp, + const pk::ParakeetHParams & chp, + const pk::ParakeetWeights & conformer, + const SortformerWeights & w, + const char * backend, + ggml_backend_sched_t sched, + int n_threads, + const SortformerStreamParams & P, + const float * mel_buf, + int mel_n_mels, + int mel_n_frames, + transcribe_session * abort_session) { + const int ed = chp.enc_d_model; + const int n_spk = hp.max_speakers; + const int sub = hp.enc_subsampling_factor; + const int feat_len = mel_n_frames; + + if (sub <= 0 || P.chunk_len <= 0 || sched == nullptr || mel_buf == nullptr) { return TRANSCRIBE_ERR_INVALID_ARG; } - pc->stream.reset(ed); - if (const transcribe_status st = ensure_sched(pc, pm); st != TRANSCRIBE_OK) { - return st; + sc.stream.reset(ed); + + const bool external_cadence = P.feat_first_chunk > 0; + if (external_cadence && (P.chunk_left_context != 0 || P.chunk_right_context != 0)) { + return TRANSCRIBE_ERR_INVALID_ARG; } - const int64_t t_stream_start = ggml_time_us(); - int stt = 0, end = 0, chunk_idx = 0; + int stt = 0, end = 0, chunk_idx = 0; while (end < feat_len) { - if (pc->poll_abort()) { + if (abort_session != nullptr && abort_session->poll_abort()) { return TRANSCRIBE_ERR_ABORTED; } - const int left_offset = std::min(P.chunk_left_context * sub, stt); - end = std::min(stt + P.chunk_len * sub, feat_len); - const int right_offset = std::min(P.chunk_right_context * sub, feat_len - end); - const int win_lo = stt - left_offset; - const int win_hi = end + right_offset; - const int M = win_hi - win_lo; - // Diar-frame context: left_offset is a multiple of sub -> round is - // exact; right_offset may be short on the final chunk -> ceil. - const int lc = (left_offset + sub / 2) / sub; - const int rc = (right_offset + sub - 1) / sub; - - if (pc->compute_ctx != nullptr) { - ggml_free(pc->compute_ctx); - pc->compute_ctx = nullptr; + int win_lo = 0, win_hi = 0, lc = 0, rc = 0, drop = 0; + if (external_cadence) { + // NeMo CacheAwareStreamingAudioBuffer windows: first chunk is + // feat_first_chunk fresh frames; later chunks prepend + // feat_cache frames of real left context to chunk_len*sub new + // frames and drop the duplicated pre-encode outputs below. + if (chunk_idx == 0) { + end = std::min(P.feat_first_chunk, feat_len); + win_lo = 0; + } else { + end = std::min(stt + P.chunk_len * sub, feat_len); + win_lo = std::max(0, stt - P.feat_cache); + drop = P.drop_pre_encode; + } + win_hi = end; + } else { + const int left_offset = std::min(P.chunk_left_context * sub, stt); + end = std::min(stt + P.chunk_len * sub, feat_len); + const int right_offset = std::min(P.chunk_right_context * sub, feat_len - end); + win_lo = stt - left_offset; + win_hi = end + right_offset; + // Diar-frame context: left_offset is a multiple of sub -> round + // is exact; right_offset may be short on the final chunk -> ceil. + lc = (left_offset + sub / 2) / sub; + rc = (right_offset + sub - 1) / sub; + } + const int M = win_hi - win_lo; + + if (sc.compute_ctx != nullptr) { + ggml_free(sc.compute_ctx); + sc.compute_ctx = nullptr; } { ggml_init_params ip{}; - ip.mem_size = 32 * 1024 * 1024; - ip.mem_buffer = nullptr; - ip.no_alloc = true; - pc->compute_ctx = ggml_init(ip); - if (pc->compute_ctx == nullptr) { + ip.mem_size = 32 * 1024 * 1024; + ip.mem_buffer = nullptr; + ip.no_alloc = true; + sc.compute_ctx = ggml_init(ip); + if (sc.compute_ctx == nullptr) { return TRANSCRIBE_ERR_GGUF; } } - ggml_context * ctx = pc->compute_ctx; + ggml_context * ctx = sc.compute_ctx; transcribe::debug::push_name_prefix("stream.chunk"); // ---- Graph A: pre_encode over the mel window ---- - PreEncodeBuild A = build_pre_encode_graph(ctx, *pm, M); + PreEncodeBuild A = build_pre_encode_graph(ctx, chp, conformer.pre_encode, backend, M); if (A.graph == nullptr) { transcribe::debug::pop_name_prefix(); return TRANSCRIBE_ERR_GGUF; } - const int T_diar = static_cast(A.out->ne[1]); + int T_diar = static_cast(A.out->ne[1]); // Mel window [n_mels, M] from full mel [n_mels, feat_len], cols // [win_lo, win_hi). ggml ne=[M, n_mels] -> offset mel*M + col. - pc->chunk_mel_buf.resize(static_cast(mel_n_mels) * M); + sc.chunk_mel_buf.resize(static_cast(mel_n_mels) * M); for (int mel = 0; mel < mel_n_mels; ++mel) { - const float * src = pc->mel_buf.data() + static_cast(mel) * feat_len + win_lo; - std::copy(src, src + M, pc->chunk_mel_buf.data() + static_cast(mel) * M); + const float * src = mel_buf + static_cast(mel) * feat_len + win_lo; + std::copy(src, src + M, sc.chunk_mel_buf.data() + static_cast(mel) * M); } - ggml_backend_sched_reset(pc->sched); - if (!ggml_backend_sched_alloc_graph(pc->sched, A.graph)) { + ggml_backend_sched_reset(sched); + if (!ggml_backend_sched_alloc_graph(sched, A.graph)) { transcribe::debug::pop_name_prefix(); return TRANSCRIBE_ERR_GGUF; } - ggml_backend_tensor_set(A.mel_in, pc->chunk_mel_buf.data(), 0, pc->chunk_mel_buf.size() * sizeof(float)); - transcribe::configure_sched_n_threads(pc->sched, pc->n_threads); - if (ggml_backend_sched_graph_compute(pc->sched, A.graph) != GGML_STATUS_SUCCESS) { + ggml_backend_tensor_set(A.mel_in, sc.chunk_mel_buf.data(), 0, sc.chunk_mel_buf.size() * sizeof(float)); + transcribe::configure_sched_n_threads(sched, n_threads); + if (ggml_backend_sched_graph_compute(sched, A.graph) != GGML_STATUS_SUCCESS) { log_msg(TRANSCRIBE_LOG_LEVEL_ERROR, "sortformer streaming: pre_encode compute failed"); transcribe::debug::pop_name_prefix(); return TRANSCRIBE_ERR_GGUF; } - pc->chunk_embs_host.resize(static_cast(T_diar) * ed); - ggml_backend_tensor_get(A.out, pc->chunk_embs_host.data(), 0, pc->chunk_embs_host.size() * sizeof(float)); + sc.chunk_embs_host.resize(static_cast(T_diar) * ed); + ggml_backend_tensor_get(A.out, sc.chunk_embs_host.data(), 0, sc.chunk_embs_host.size() * sizeof(float)); + + // External cadence: discard the duplicated / partially-contexted + // pre-encode outputs (NeMo drop_extra_pre_encoded, applied right + // after pre_encode and before the encoder). + if (drop > 0) { + if (T_diar <= drop) { + // Degenerate tail chunk: nothing valid to append. + transcribe::debug::pop_name_prefix(); + stt = end; + ++chunk_idx; + continue; + } + sc.chunk_embs_host.erase(sc.chunk_embs_host.begin(), + sc.chunk_embs_host.begin() + static_cast(drop) * ed); + T_diar -= drop; + } // ---- host concat [spkcache | fifo | chunk_embs] ---- - const int S = pc->stream.spkcache_n; - const int F = pc->stream.fifo_n; + const int S = sc.stream.spkcache_n; + const int F = sc.stream.fifo_n; const int T_concat = S + F + T_diar; - pc->concat_host.resize(static_cast(T_concat) * ed); - std::copy(pc->stream.spkcache.begin(), pc->stream.spkcache.begin() + static_cast(S) * ed, - pc->concat_host.begin()); - std::copy(pc->stream.fifo.begin(), pc->stream.fifo.begin() + static_cast(F) * ed, - pc->concat_host.begin() + static_cast(S) * ed); - std::copy(pc->chunk_embs_host.begin(), pc->chunk_embs_host.end(), - pc->concat_host.begin() + static_cast(S + F) * ed); + sc.concat_host.resize(static_cast(T_concat) * ed); + std::copy(sc.stream.spkcache.begin(), sc.stream.spkcache.begin() + static_cast(S) * ed, + sc.concat_host.begin()); + std::copy(sc.stream.fifo.begin(), sc.stream.fifo.begin() + static_cast(F) * ed, + sc.concat_host.begin() + static_cast(S) * ed); + std::copy(sc.chunk_embs_host.begin(), sc.chunk_embs_host.end(), + sc.concat_host.begin() + static_cast(S + F) * ed); // ---- Graph B: xscale + 17 blocks + proj + 18 tf + head ---- - StreamInferBuild B = build_stream_infer_graph(ctx, *pm, T_concat); + StreamInferBuild B = build_stream_infer_graph(ctx, hp, chp, conformer, w, backend, T_concat); if (B.graph == nullptr) { transcribe::debug::pop_name_prefix(); return TRANSCRIBE_ERR_GGUF; } - fill_rel_pos_emb(pc->pos_buf, pc->pos_div_term, 2 * T_concat - 1, ed); + fill_rel_pos_emb(sc.pos_buf, sc.pos_div_term, 2 * T_concat - 1, ed); - ggml_backend_sched_reset(pc->sched); - if (!ggml_backend_sched_alloc_graph(pc->sched, B.graph)) { + ggml_backend_sched_reset(sched); + if (!ggml_backend_sched_alloc_graph(sched, B.graph)) { transcribe::debug::pop_name_prefix(); return TRANSCRIBE_ERR_GGUF; } - ggml_backend_tensor_set(B.concat_in, pc->concat_host.data(), 0, pc->concat_host.size() * sizeof(float)); - ggml_backend_tensor_set(B.pos_emb_in, pc->pos_buf.data(), 0, pc->pos_buf.size() * sizeof(float)); - transcribe::configure_sched_n_threads(pc->sched, pc->n_threads); - if (ggml_backend_sched_graph_compute(pc->sched, B.graph) != GGML_STATUS_SUCCESS) { + ggml_backend_tensor_set(B.concat_in, sc.concat_host.data(), 0, sc.concat_host.size() * sizeof(float)); + ggml_backend_tensor_set(B.pos_emb_in, sc.pos_buf.data(), 0, sc.pos_buf.size() * sizeof(float)); + transcribe::configure_sched_n_threads(sched, n_threads); + if (ggml_backend_sched_graph_compute(sched, B.graph) != GGML_STATUS_SUCCESS) { log_msg(TRANSCRIBE_LOG_LEVEL_ERROR, "sortformer streaming: infer compute failed"); transcribe::debug::pop_name_prefix(); return TRANSCRIBE_ERR_GGUF; } - pc->stream_preds_host.resize(static_cast(T_concat) * n_spk); - ggml_backend_tensor_get(B.preds, pc->stream_preds_host.data(), 0, pc->stream_preds_host.size() * sizeof(float)); + sc.stream_preds_host.resize(static_cast(T_concat) * n_spk); + ggml_backend_tensor_get(B.preds, sc.stream_preds_host.data(), 0, sc.stream_preds_host.size() * sizeof(float)); transcribe::debug::pop_name_prefix(); // ---- host streaming update (FIFO + AOSC compress) ---- - streaming_update_sync(pc->stream, P, n_spk, ed, pc->chunk_embs_host, T_diar, pc->stream_preds_host, T_concat, - lc, rc); + streaming_update_sync(sc.stream, P, n_spk, ed, sc.chunk_embs_host, T_diar, sc.stream_preds_host, T_concat, lc, + rc); stt = end; ++chunk_idx; } + (void) chunk_idx; + return TRANSCRIBE_OK; +} + +// Family wrapper: resolve the operating point, run the core, trim, dump, +// and emit speaker segments on the session. +static transcribe_status run_streaming(SortformerSession * pc, + SortformerModel * pm, + int mel_n_mels, + int mel_n_frames, + double ms_per_frame, + transcribe_sortformer_preset preset) { + const SortformerStreamParams P = resolve_stream_params(pm->hparams, preset); + if (const transcribe_status st = ensure_sched(pc, pm); st != TRANSCRIBE_OK) { + return st; + } + + const int64_t t_stream_start = ggml_time_us(); + const transcribe_status st = + run_diar_streaming_core(pc->scratch, pm->hparams, pm->conformer_hp, pm->conformer, pm->weights, + pm->backend.c_str(), pc->sched, pc->n_threads, P, pc->mel_buf.data(), mel_n_mels, + mel_n_frames, pc); + if (st != TRANSCRIBE_OK) { + return st; + } pc->t_encode_us = ggml_time_us() - t_stream_start; // Trim padding tail: NeMo total_preds[:, :ceil(feat_len/sub)]. - const int n_frames = (feat_len + sub - 1) / sub; - const int used_n = std::min(pc->stream.total_n, n_frames); + const int sub = pm->hparams.enc_subsampling_factor; + const int n_spk = pm->hparams.max_speakers; + const int n_frames = (mel_n_frames + sub - 1) / sub; + const int used_n = std::min(pc->scratch.stream.total_n, n_frames); if (transcribe::debug::enabled()) { const long long shape[2] = { used_n, n_spk }; - transcribe::debug::dump_host_f32("diar.probs", pc->stream.total_preds.data(), + transcribe::debug::dump_host_f32("diar.probs", pc->scratch.stream.total_preds.data(), static_cast(used_n) * n_spk, shape, 2, "diarize"); } - probs_to_speaker_segments(pc, pc->stream.total_preds, used_n, n_spk, ms_per_frame, /*threshold=*/0.5f); - (void) chunk_idx; + probs_to_speaker_segments(pc, pc->scratch.stream.total_preds, used_n, n_spk, ms_per_frame, /*threshold=*/0.5f); return TRANSCRIBE_OK; } diff --git a/src/arch/sortformer/sortformer.h b/src/arch/sortformer/sortformer.h index 9d044c34..3edcd749 100644 --- a/src/arch/sortformer/sortformer.h +++ b/src/arch/sortformer/sortformer.h @@ -27,8 +27,11 @@ struct ggml_context; struct ggml_tensor; +struct ggml_backend; struct ggml_backend_buffer; struct ggml_backend_sched; +struct gguf_context; +typedef struct ggml_backend * ggml_backend_t; typedef struct ggml_backend_buffer * ggml_backend_buffer_t; typedef struct ggml_backend_sched * ggml_backend_sched_t; @@ -90,6 +93,19 @@ struct SortformerStreamParams { float weak_boost_rate = 1.5f; float min_pos_scores_rate = 0.5f; int max_index = 99999; + + // External-cadence chunking (multitalker bundle only; 0 = off, the + // standalone uniform-window path). When feat_first_chunk > 0 the core + // mirrors NeMo's CacheAwareStreamingAudioBuffer windows instead of the + // uniform streaming_feat_loader ones: the first chunk consumes + // feat_first_chunk mel frames, each later chunk consumes + // chunk_len*sub new frames with feat_cache frames of real left + // context prepended, and drop_pre_encode pre-encode output frames are + // discarded per later chunk (the duplicated / partially-contexted + // outputs). chunk_left/right_context must be 0 in this mode. + int feat_first_chunk = 0; + int feat_cache = 0; + int drop_pre_encode = 0; }; // Host-side streaming state (AOSC speaker cache + FIFO), mirroring NeMo's @@ -150,17 +166,14 @@ void streaming_update_sync(SortformerStreamState & st, // spkcache_len frames, matching sortformer_modules._compress_spkcache. void compress_spkcache(SortformerStreamState & st, const SortformerStreamParams & p, int n_spk, int emb_dim); -// Concrete context. Owns a per-call compute context and a persistent -// multi-backend scheduler. -struct SortformerSession final : public transcribe_session { - ggml_context * compute_ctx = nullptr; - ggml_backend_sched_t sched = nullptr; - - // Per-context scratch reused across runs. - std::vector mel_buf; +// Scratch for one streaming diarization forward, owned by whichever session +// drives it: the sortformer session (standalone family) or the parakeet +// session (multitalker bundle). compute_ctx is (re)created per chunk by +// run_diar_streaming_core and freed by the destructor. +struct DiarStreamScratch { + ggml_context * compute_ctx = nullptr; std::vector pos_buf; std::vector pos_div_term; - std::vector probs_host; // [n_spk * T], read back from diar.preds // Streaming scratch (AOSC/FIFO path). SortformerStreamState stream; @@ -169,8 +182,88 @@ struct SortformerSession final : public transcribe_session { std::vector concat_host; // [T_concat * enc_d_model] Graph B input std::vector stream_preds_host; // [T_concat * n_spk] Graph B readback + DiarStreamScratch() = default; + ~DiarStreamScratch(); +}; + +// Concrete context. Owns a per-call compute context and a persistent +// multi-backend scheduler. +struct SortformerSession final : public transcribe_session { + ggml_context * compute_ctx = nullptr; // offline-forward graph ctx + ggml_backend_sched_t sched = nullptr; + + // Per-context scratch reused across runs. + std::vector mel_buf; + std::vector probs_host; // [n_spk * T], read back from diar.preds + + // Streaming scratch (AOSC/FIFO path + rel-pos tables, shared with the + // offline forward's pos_emb fill). + DiarStreamScratch scratch; + SortformerSession() = default; ~SortformerSession() override; }; +// ---- Embedded-diarizer surface (multitalker bundle) -------------------- // +// +// A multitalker Parakeet bundle GGUF carries this diarizer's tensors under +// a name prefix (stt.parakeet.diarizer.tensor_prefix, "sortformer.") next +// to the ASR's own tensors, and its hparams under the usual +// stt.sortformer.* KVs. The host family owns the storage (its ctx_meta / +// backend buffers); this surface only resolves borrowed tensor pointers +// and runs the forward on the host's scheduler. + +// Weight + hparam core of a diarizer embedded in another family's GGUF. +struct SortformerEmbedded { + SortformerHParams hp; + transcribe::parakeet::ParakeetHParams conformer_hp; + transcribe::parakeet::ParakeetWeights conformer; // pre_encode + blocks only + SortformerWeights weights; +}; + +// Read stt.sortformer.* hparams from `gguf` and resolve every diarizer +// tensor (conformer + sortformer-specific) in `ctx_meta` under +// `tensor_prefix`. Defined in model.cpp. +transcribe_status init_embedded_diarizer(const gguf_context * gguf, + ggml_context * ctx_meta, + const char * tensor_prefix, + SortformerEmbedded & out); + +// Fuse the embedded conformer's BatchNorm into scale/bias tensors allocated +// on `backend` (must run AFTER tensor data is uploaded). The caller owns and +// frees *out_ctx / *out_buffer. Defined in model.cpp. +transcribe_status fuse_embedded_diar_bn(SortformerEmbedded & e, + ggml_backend_t backend, + ggml_context ** out_ctx, + ggml_backend_buffer_t * out_buffer); + +// Full streaming AOSC/FIFO diarization forward over a precomputed mel +// buffer (row-major [n_mels, n_frames]), on the caller's scheduler. On +// success sc.stream.total_preds holds the accumulated row-major +// [total_n, n_spk] probs (trim to ceil(n_frames / subsampling) frames; +// see run_streaming in model.cpp). abort_session is polled per chunk when +// non-null. Defined in model.cpp. +transcribe_status run_diar_streaming_core(DiarStreamScratch & sc, + const SortformerHParams & hp, + const transcribe::parakeet::ParakeetHParams & chp, + const transcribe::parakeet::ParakeetWeights & conformer, + const SortformerWeights & w, + const char * backend, + ggml_backend_sched_t sched, + int n_threads, + const SortformerStreamParams & P, + const float * mel_buf, + int mel_n_mels, + int mel_n_frames, + transcribe_session * abort_session); + +// Threshold-based probs -> speaker_segment rows (probs row-major [T, n_spk], +// speaker_id 1-based, p = NaN). Shared with the multitalker bundle path. +void probs_to_speaker_segments(transcribe_session * session, + const std::vector & probs, + int T, + int n_spk, + double ms_per_frame, + float threshold); + } // namespace transcribe::sortformer diff --git a/src/arch/sortformer/weights.cpp b/src/arch/sortformer/weights.cpp index bcd2de4e..da0c0b92 100644 --- a/src/arch/sortformer/weights.cpp +++ b/src/arch/sortformer/weights.cpp @@ -138,18 +138,23 @@ ggml_tensor * get_checked(ggml_context * ctx, const char * name, int64_t ne0, in } // namespace -transcribe_status build_sortformer_weights(ggml_context * ctx, const SortformerHParams & hp, SortformerWeights & w) { +transcribe_status build_sortformer_weights(ggml_context * ctx, + const SortformerHParams & hp, + SortformerWeights & w, + const char * tensor_prefix) { const int64_t d = hp.tf_d_model; const int64_t dff = hp.tf_d_ff; const int64_t ed = hp.enc_d_model; const int64_t spk = hp.max_speakers; - char name[128]; - -#define GET(dst, nm, e0, e1) \ - do { \ - (dst) = get_checked(ctx, (nm), (e0), (e1)); \ - if ((dst) == nullptr) \ - return TRANSCRIBE_ERR_GGUF; \ + const char * pfx = (tensor_prefix != nullptr) ? tensor_prefix : ""; + char name[160]; + +#define GET(dst, nm, e0, e1) \ + do { \ + std::snprintf(name, sizeof(name), "%s%s", pfx, (nm)); \ + (dst) = get_checked(ctx, name, (e0), (e1)); \ + if ((dst) == nullptr) \ + return TRANSCRIBE_ERR_GGUF; \ } while (0) GET(w.enc_proj_w, "diar.encoder_proj.weight", ed, d); @@ -158,10 +163,11 @@ transcribe_status build_sortformer_weights(ggml_context * ctx, const SortformerH w.tf_blocks.resize(static_cast(hp.tf_n_layers)); for (int i = 0; i < hp.tf_n_layers; ++i) { SortformerTfBlock & b = w.tf_blocks[static_cast(i)]; -#define GETB(dst, suffix, e0, e1) \ - do { \ - std::snprintf(name, sizeof(name), "tf.blocks.%d.%s", i, suffix); \ - GET(dst, name, e0, e1); \ + char blk[96]; +#define GETB(dst, suffix, e0, e1) \ + do { \ + std::snprintf(blk, sizeof(blk), "tf.blocks.%d.%s", i, suffix); \ + GET(dst, blk, e0, e1); \ } while (0) GETB(b.norm1_w, "norm_1.weight", d, -1); GETB(b.norm1_b, "norm_1.bias", d, -1); diff --git a/src/arch/sortformer/weights.h b/src/arch/sortformer/weights.h index 9b655e96..c1b8f2be 100644 --- a/src/arch/sortformer/weights.h +++ b/src/arch/sortformer/weights.h @@ -112,8 +112,14 @@ transcribe_status read_sortformer_hparams(const gguf_context * gguf, SortformerH // head) by name in ctx_meta, validate shapes against hp, store borrowed // pointers. Returns TRANSCRIBE_ERR_GGUF (naming the tensor) on any // missing / mis-shaped tensor. +// +// tensor_prefix (nullable, standalone default "") is prepended to every +// tensor name: the multitalker bundle GGUF embeds these tensors under a +// "sortformer." namespace so they cannot collide with the host family's +// own enc.* catalog. transcribe_status build_sortformer_weights(ggml_context * ctx_meta, const SortformerHParams & hp, - SortformerWeights & weights); + SortformerWeights & weights, + const char * tensor_prefix = nullptr); } // namespace transcribe::sortformer diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e4b12330..42b9e303 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -669,6 +669,25 @@ if(TRANSCRIBE_BUILD_REAL_MODEL_TESTS) COMMAND transcribe_parakeet_real_smoke) set_tests_properties(transcribe_parakeet_real_smoke PROPERTIES SKIP_RETURN_CODE 77) + + # Multitalker bundle end-to-end smoke (diarize=ON on the composed + # parakeet + sortformer bundle; both supervision modes). Gated on + # TRANSCRIBE_MULTITALKER_BUNDLE_GGUF at runtime, exit 77 when unset. + add_executable(transcribe_parakeet_multitalker_e2e_smoke + parakeet_multitalker_e2e_smoke.cpp) + + target_link_libraries(transcribe_parakeet_multitalker_e2e_smoke + PRIVATE transcribe transcribe-common-example) + + target_compile_definitions(transcribe_parakeet_multitalker_e2e_smoke PRIVATE + "TRANSCRIBE_TEST_SAMPLES_DIR=\"${CMAKE_SOURCE_DIR}/samples\"") + + transcribe_apply_warnings(transcribe_parakeet_multitalker_e2e_smoke) + + add_test(NAME transcribe_parakeet_multitalker_e2e_smoke + COMMAND transcribe_parakeet_multitalker_e2e_smoke) + set_tests_properties(transcribe_parakeet_multitalker_e2e_smoke PROPERTIES + SKIP_RETURN_CODE 77) endif() # ----------------------------------------------------------------------------- diff --git a/tests/golden/parakeet/multitalker-2spk-mix.rttm b/tests/golden/parakeet/multitalker-2spk-mix.rttm new file mode 100644 index 00000000..b30d4e69 --- /dev/null +++ b/tests/golden/parakeet/multitalker-2spk-mix.rttm @@ -0,0 +1,3 @@ +SPEAKER multitalker-2spk-mix 1 0.000 5.500 spk_A +SPEAKER multitalker-2spk-mix 1 9.500 4.500 spk_A +SPEAKER multitalker-2spk-mix 1 5.000 4.500 spk_B diff --git a/tests/parakeet_multitalker_e2e_smoke.cpp b/tests/parakeet_multitalker_e2e_smoke.cpp new file mode 100644 index 00000000..0c4461c4 --- /dev/null +++ b/tests/parakeet_multitalker_e2e_smoke.cpp @@ -0,0 +1,169 @@ +// parakeet_multitalker_e2e_smoke.cpp - real-model gated end-to-end test +// for the multitalker bundle (parakeet + embedded sortformer). +// +// Gating (same pattern as parakeet_real_smoke): +// - Built only under TRANSCRIBE_BUILD_REAL_MODEL_TESTS. +// - The bundle path comes from TRANSCRIBE_MULTITALKER_BUNDLE_GGUF; if +// unset, exits 77 (CTest "skipped"). +// +// What we assert, on samples/multitalker-2spk-mix.wav (the deterministic +// 2-speaker fixture whose NeMo reference lives under +// build/validate/parakeet/.../multitalker/): +// +// 1. The bundle loads and reports TRANSCRIBE_FEATURE_DIARIZATION. +// 2. diarize=OFF: single-speaker semantics — a result with every +// segment's speaker_id == 0 and no speaker_segment rows. +// 3. diarize=ON (masked mode, the default): >= 2 segments carrying at +// least two distinct 1-based speaker_ids, speaker_segment rows +// present, and each fixture voice's anchor phrase attributed to a +// single speaker ("fellow Americans" for the JFK track, +// "publication" for the Whole Earth track). +// 4. Same invariants under TRANSCRIBE_MULTITALKER_MODE=kernel. + +#include "transcribe.h" +#include "wav.h" + +#include +#include +#include +#include +#include +#include + +namespace { + +int g_failures = 0; + +void check(bool ok, const char * what) { + if (!ok) { + std::fprintf(stderr, "FAIL: %s\n", what); + ++g_failures; + } +} + +// speaker_id owning the segment whose text contains `needle`; 0 if absent +// or ambiguous (present under more than one speaker). +int32_t phrase_speaker(struct transcribe_session * ctx, const char * needle) { + std::set owners; + const int n = transcribe_n_segments(ctx); + for (int i = 0; i < n; ++i) { + struct transcribe_segment seg; + transcribe_segment_init(&seg); + if (transcribe_get_segment(ctx, i, &seg) != TRANSCRIBE_OK || seg.text == nullptr) { + continue; + } + if (std::strstr(seg.text, needle) != nullptr) { + owners.insert(seg.speaker_id); + } + } + return owners.size() == 1 ? *owners.begin() : 0; +} + +void run_multitalker_checks(struct transcribe_session * ctx, const std::vector & pcm, const char * label) { + struct transcribe_run_params rp; + transcribe_run_params_init(&rp); + rp.diarize = TRANSCRIBE_DIARIZE_MODE_ON; + + const transcribe_status st = transcribe_run(ctx, pcm.data(), static_cast(pcm.size()), &rp); + std::fprintf(stderr, "[%s] run: %s\n", label, transcribe_status_string(st)); + check(st == TRANSCRIBE_OK, "diarize=ON run returns OK"); + if (st != TRANSCRIBE_OK) { + return; + } + + const int n_segments = transcribe_n_segments(ctx); + check(n_segments >= 2, "diarize=ON yields >= 2 segments"); + + std::set speakers; + for (int i = 0; i < n_segments; ++i) { + struct transcribe_segment seg; + transcribe_segment_init(&seg); + if (transcribe_get_segment(ctx, i, &seg) == TRANSCRIBE_OK) { + std::fprintf(stderr, "[%s] S%d [%lld, %lld] %s\n", label, seg.speaker_id, + static_cast(seg.t0_ms), static_cast(seg.t1_ms), + seg.text != nullptr ? seg.text : ""); + speakers.insert(seg.speaker_id); + } + } + check(speakers.size() >= 2, "segments carry >= 2 distinct speaker_ids"); + check(speakers.count(0) == 0, "every segment is speaker-attributed (no speaker_id 0)"); + + check(transcribe_n_speaker_segments(ctx) > 0, "speaker_segment rows populated"); + + const int32_t spk_a = phrase_speaker(ctx, "fellow Americans"); + const int32_t spk_b = phrase_speaker(ctx, "publication"); + check(spk_a > 0, "JFK anchor phrase attributed to exactly one speaker"); + check(spk_b > 0, "Whole Earth anchor phrase attributed to exactly one speaker"); + check(spk_a == 0 || spk_b == 0 || spk_a != spk_b, "the two voices land on different speakers"); +} + +} // namespace + +int main() { + const char * gguf = std::getenv("TRANSCRIBE_MULTITALKER_BUNDLE_GGUF"); + if (gguf == nullptr || gguf[0] == '\0') { + std::fprintf(stderr, + "SKIP: set TRANSCRIBE_MULTITALKER_BUNDLE_GGUF to a multitalker bundle GGUF " + "(scripts/compose-multitalker-bundle.py output)\n"); + return 77; + } + const std::string wav_path = std::string(TRANSCRIBE_TEST_SAMPLES_DIR) + "/multitalker-2spk-mix.wav"; + + struct transcribe_model * model = nullptr; + { + const transcribe_status st = transcribe_model_load_file(gguf, nullptr, &model); + if (st != TRANSCRIBE_OK || model == nullptr) { + std::fprintf(stderr, "FAIL: model load: %s\n", transcribe_status_string(st)); + return EXIT_FAILURE; + } + } + check(transcribe_model_supports(model, TRANSCRIBE_FEATURE_DIARIZATION), + "bundle reports TRANSCRIBE_FEATURE_DIARIZATION"); + + std::vector pcm; + std::string load_err; + if (!transcribe_cli::load_wav_mono_16k(wav_path.c_str(), pcm, load_err)) { + std::fprintf(stderr, "FAIL: wav load: %s\n", load_err.c_str()); + transcribe_model_free(model); + return EXIT_FAILURE; + } + + struct transcribe_session * ctx = nullptr; + if (transcribe_session_init(model, nullptr, &ctx) != TRANSCRIBE_OK || ctx == nullptr) { + std::fprintf(stderr, "FAIL: session init\n"); + transcribe_model_free(model); + return EXIT_FAILURE; + } + + // diarize=OFF: shipped single-speaker semantics. + { + const transcribe_status st = transcribe_run(ctx, pcm.data(), static_cast(pcm.size()), nullptr); + check(st == TRANSCRIBE_OK, "diarize=OFF run returns OK"); + if (st == TRANSCRIBE_OK) { + check(transcribe_n_segments(ctx) >= 1, "diarize=OFF yields a result"); + check(transcribe_n_speaker_segments(ctx) == 0, "diarize=OFF has no speaker_segment rows"); + struct transcribe_segment seg; + transcribe_segment_init(&seg); + if (transcribe_get_segment(ctx, 0, &seg) == TRANSCRIBE_OK) { + check(seg.speaker_id == 0, "diarize=OFF segments are unattributed"); + } + } + } + + // diarize=ON in both supervision modes. + unsetenv("TRANSCRIBE_MULTITALKER_MODE"); + run_multitalker_checks(ctx, pcm, "masked"); + setenv("TRANSCRIBE_MULTITALKER_MODE", "kernel", /*overwrite=*/1); + run_multitalker_checks(ctx, pcm, "kernel"); + unsetenv("TRANSCRIBE_MULTITALKER_MODE"); + + transcribe_session_free(ctx); + transcribe_model_free(model); + + if (g_failures != 0) { + std::fprintf(stderr, "%d check(s) failed\n", g_failures); + return EXIT_FAILURE; + } + std::fprintf(stderr, "parakeet_multitalker_e2e_smoke: all checks passed\n"); + return EXIT_SUCCESS; +} From a49b443e8049387b5ae6542bb21e5e36d95a092c Mon Sep 17 00:00:00 2001 From: CJ Pais Date: Thu, 30 Jul 2026 02:02:41 -0700 Subject: [PATCH 2/3] format --- src/arch/parakeet/encoder.h | 14 +- src/arch/parakeet/model.cpp | 20 +- src/arch/parakeet/multitalker.cpp | 262 +++++++++++------------ src/arch/parakeet/parakeet.h | 14 +- src/arch/sortformer/model.cpp | 21 +- src/arch/sortformer/weights.cpp | 18 +- tests/parakeet_multitalker_e2e_smoke.cpp | 1 + 7 files changed, 173 insertions(+), 177 deletions(-) diff --git a/src/arch/parakeet/encoder.h b/src/arch/parakeet/encoder.h index dbe42f5e..7105e9b1 100644 --- a/src/arch/parakeet/encoder.h +++ b/src/arch/parakeet/encoder.h @@ -205,16 +205,16 @@ EncoderBuild build_encoder_graph(ggml_context * compute_ctx, const ParakeetWeights & weights, const ParakeetHParams & hp, int n_mel_frames, - ggml_type kv_type = GGML_TYPE_COUNT, - const char * backend_name = "", - const BufferedStreamMaskOverride * buf_mask = nullptr, - int n_batch = 1, + ggml_type kv_type = GGML_TYPE_COUNT, + const char * backend_name = "", + const BufferedStreamMaskOverride * buf_mask = nullptr, + int n_batch = 1, // When true and n_batch > 1, allocate the // variable-length batch masks (attn_pad_mask_in // + conv_pad_mask_in sized for the batch) and // wire them into every conformer block. The // driver fills them from per-utterance lengths. - bool batch_var_len = false, + bool batch_var_len = false, // Multitalker bundle (n_batch == 1 only): expose // per-frame speaker/background supervision masks // as graph inputs (EncoderBuild::spk_mask_in / @@ -296,8 +296,8 @@ EncoderBuild build_encoder_graph_streaming(ggml_context * compute_ctx int n_mel_chunk_frames, int drop_extra_pre_encoded, StreamingEncoderCacheIO & cache_io, - ggml_type kv_type = GGML_TYPE_COUNT, - const char * backend_name = "", + ggml_type kv_type = GGML_TYPE_COUNT, + const char * backend_name = "", // Multitalker streaming pass: expose the // per-chunk speaker/background supervision // masks (ne=[1, T_q_new]) as graph inputs diff --git a/src/arch/parakeet/model.cpp b/src/arch/parakeet/model.cpp index ba22b4b1..242d9931 100644 --- a/src/arch/parakeet/model.cpp +++ b/src/arch/parakeet/model.cpp @@ -1054,17 +1054,16 @@ transcribe_status run_one_shot_inner(ParakeetSession * pc, resolved_kv = GGML_TYPE_F16; } - const bool spk_supervision = (mt != nullptr && mt->use_kernel); + const bool spk_supervision = (mt != nullptr && mt->use_kernel); // Kernel-mode chunk gating: sanitize the orchestrator's keep list // against the actual pre_encode output length (the orchestrator // builds its chunk grid from the diar frame count, which can trail // the encoder length by a frame at the clip tail). std::vector mt_keep; if (spk_supervision && !mt->keep_enc_frames.empty()) { - const bool causal = - (pm->hparams.enc_att_context_style == ParakeetHParams::AttContextStyle::ChunkedLimited); - const int T_pred = pre_encode_time_out( - pre_encode_time_out(pre_encode_time_out(mel_n_frames, causal), causal), causal); + const bool causal = (pm->hparams.enc_att_context_style == ParakeetHParams::AttContextStyle::ChunkedLimited); + const int T_pred = + pre_encode_time_out(pre_encode_time_out(pre_encode_time_out(mel_n_frames, causal), causal), causal); mt_keep.reserve(mt->keep_enc_frames.size()); for (const int32_t i : mt->keep_enc_frames) { if (i >= 0 && i < T_pred) { @@ -1072,7 +1071,7 @@ transcribe_status run_one_shot_inner(ParakeetSession * pc, } } } - const int mt_keep_frames = static_cast(mt_keep.size()); + const int mt_keep_frames = static_cast(mt_keep.size()); EncoderBuild eb = build_encoder_graph(pc->compute_ctx, pm->weights, pm->hparams, mel_n_frames, resolved_kv, pm->backend.c_str(), /*buf_mask=*/nullptr, /*n_batch=*/1, /*batch_var_len=*/false, spk_supervision, mt_keep_frames); @@ -1114,9 +1113,9 @@ transcribe_status run_one_shot_inner(ParakeetSession * pc, if (eb.spk_mask_in != nullptr && mt != nullptr) { // Ungated encoder length (pre-gather); the injection masks are // sized to the gathered length when chunk gating is active. - const int T_full = static_cast(eb.dumps.pre_encode_out->ne[1]); - const int T_inj = static_cast(eb.spk_mask_in->ne[1]); - auto align_full = [&](const std::vector & src, float default_value) { + const int T_full = static_cast(eb.dumps.pre_encode_out->ne[1]); + const int T_inj = static_cast(eb.spk_mask_in->ne[1]); + auto align_full = [&](const std::vector & src, float default_value) { std::vector buf(static_cast(T_full), default_value); const int n = static_cast(src.size()); if (n >= T_full) { @@ -1144,8 +1143,7 @@ transcribe_status run_one_shot_inner(ParakeetSession * pc, fill_mask(eb.spk_mask_in, mt->spk, 1.0f); fill_mask(eb.bg_mask_in, mt->bg, 0.0f); if (eb.mt_keep_in != nullptr) { - ggml_backend_tensor_set(eb.mt_keep_in, mt_keep.data(), 0, - mt_keep.size() * sizeof(int32_t)); + ggml_backend_tensor_set(eb.mt_keep_in, mt_keep.data(), 0, mt_keep.size() * sizeof(int32_t)); } } diff --git a/src/arch/parakeet/multitalker.cpp b/src/arch/parakeet/multitalker.cpp index 946be1b3..6e157a02 100644 --- a/src/arch/parakeet/multitalker.cpp +++ b/src/arch/parakeet/multitalker.cpp @@ -102,12 +102,12 @@ static transcribe_status run_streaming_passes(ParakeetSession * pc, } mel_us += ggml_time_us() - t_mel_start; - const int chunk_enc = hp.enc_att_context_right + 1; // 14 - const int sub = hp.enc_subsampling_factor; // 8 + const int chunk_enc = hp.enc_att_context_right + 1; // 14 + const int sub = hp.enc_subsampling_factor; // 8 const int mel_first = hp.enc_stream_sampling_frames_first + sub * hp.enc_att_context_right; // 105 - const int mel_chunk = chunk_enc * sub; // 112 - const int mel_cache = hp.enc_stream_pre_encode_cache_size; // 9 - const int drop_sub = hp.enc_stream_drop_extra_pre_encoded; // 2 + const int mel_chunk = chunk_enc * sub; // 112 + const int mel_cache = hp.enc_stream_pre_encode_cache_size; // 9 + const int drop_sub = hp.enc_stream_drop_extra_pre_encoded; // 2 // Reference cache_gating: speaker s is active in chunk k iff the max // of its accumulated preds over the last 2 chunks (incl. current) @@ -132,6 +132,7 @@ static transcribe_status run_streaming_passes(ParakeetSession * pc, std::vector bg; bool started = false; }; + std::vector inst(active.size()); auto swap_in = [&](Inst & I) { @@ -240,14 +241,14 @@ static transcribe_status run_streaming_passes(ParakeetSession * pc, } // Kernel mode: per-chunk supervision over the NEW enc frames. - const int t_enc0 = k * chunk_enc; - const int mask_len = std::max(0, std::min(chunk_enc, T_diar - t_enc0)); - const float * spk_ptr = nullptr; - const float * bg_ptr = nullptr; + const int t_enc0 = k * chunk_enc; + const int mask_len = std::max(0, std::min(chunk_enc, T_diar - t_enc0)); + const float * spk_ptr = nullptr; + const float * bg_ptr = nullptr; std::vector bg_compat; if (use_kernel && mask_len > 0) { - spk_ptr = I.spk.data() + t_enc0; - bg_ptr = I.bg.data() + t_enc0; + spk_ptr = I.spk.data() + t_enc0; + bg_ptr = I.bg.data() + t_enc0; // TRANSCRIBE_MULTITALKER_REF_BG_COMPAT=1 reproduces the // reference harness's background-slot indexing bug // (multispk_transcribe_utils.get_active_speakers_info @@ -257,8 +258,7 @@ static transcribe_status run_streaming_passes(ParakeetSession * pc, // the reference's own bg_targets dumps. Parity tooling // only — the default is the intended union of the other // ACTIVE slots. - static const bool ref_bg_compat = - (std::getenv("TRANSCRIBE_MULTITALKER_REF_BG_COMPAT") != nullptr); + static const bool ref_bg_compat = (std::getenv("TRANSCRIBE_MULTITALKER_REF_BG_COMPAT") != nullptr); if (ref_bg_compat) { std::vector act_k; for (const int o : active) { @@ -294,9 +294,8 @@ static transcribe_status run_streaming_passes(ParakeetSession * pc, } if (st == TRANSCRIBE_OK) { const int64_t off_before = pc->stream_dec_state.frame_offset; - st = emit_streaming_chunk(pc, pm, chunk_buf.data(), n_feed, - (k == 0) ? 0 : drop_sub, advance, - spk_ptr, bg_ptr, use_kernel ? mask_len : 0); + st = emit_streaming_chunk(pc, pm, chunk_buf.data(), n_feed, (k == 0) ? 0 : drop_sub, advance, spk_ptr, + bg_ptr, use_kernel ? mask_len : 0); if (st == TRANSCRIBE_OK) { const int n_new = static_cast(pc->stream_dec_state.frame_offset - off_before); for (int f = 0; f < n_new; ++f) { @@ -321,13 +320,13 @@ static transcribe_status run_streaming_passes(ParakeetSession * pc, Inst & I = inst[i]; if (st == TRANSCRIBE_OK && !I.raw.empty()) { for (auto & rt : I.raw) { - const size_t f = std::min(static_cast(std::max(rt.step_at_emit, 0)), I.fed.size() - 1); + const size_t f = std::min(static_cast(std::max(rt.step_at_emit, 0)), I.fed.size() - 1); rt.step_at_emit = I.fed[f]; } transcribe_run_params sp = *params; sp.timestamps = TRANSCRIBE_TIMESTAMPS_AUTO; pc->clear_result(); - pc->raw_tokens = std::move(I.raw); + pc->raw_tokens = std::move(I.raw); const transcribe_status bst = build_result_from_raw_tokens(pc, pm, &sp); if (bst != TRANSCRIBE_OK) { st = bst; @@ -403,27 +402,26 @@ transcribe_status run_multitalker(ParakeetSession * pc, // ASR streaming buffer's chunks (chunk_size_first = sampling_frames + // sub * R mel frames first, then pre_encode_cache-frame overlapped // windows with drop_extra_pre_encoded outputs discarded). - P.feat_first_chunk = pm->hparams.enc_stream_sampling_frames_first + - pm->hparams.enc_subsampling_factor * pm->hparams.enc_att_context_right; - P.feat_cache = pm->hparams.enc_stream_pre_encode_cache_size; - P.drop_pre_encode = pm->hparams.enc_stream_drop_extra_pre_encoded; + P.feat_first_chunk = pm->hparams.enc_stream_sampling_frames_first + + pm->hparams.enc_subsampling_factor * pm->hparams.enc_att_context_right; + P.feat_cache = pm->hparams.enc_stream_pre_encode_cache_size; + P.drop_pre_encode = pm->hparams.enc_stream_drop_extra_pre_encoded; const int64_t t_diar_start = ggml_time_us(); transcribe::debug::push_name_prefix("mt.diar"); - const transcribe_status dst = - sf::run_diar_streaming_core(pc->diar_scratch, diar.hp, diar.conformer_hp, diar.conformer, diar.weights, - pm->backend.c_str(), pc->sched, pc->n_threads, P, diar_mel.data(), dm_mels, - dm_frames, pc); + const transcribe_status dst = sf::run_diar_streaming_core( + pc->diar_scratch, diar.hp, diar.conformer_hp, diar.conformer, diar.weights, pm->backend.c_str(), pc->sched, + pc->n_threads, P, diar_mel.data(), dm_mels, dm_frames, pc); transcribe::debug::pop_name_prefix(); if (dst != TRANSCRIBE_OK) { return dst; } const int64_t t_diar_us = ggml_time_us() - t_diar_start; - const int sub = diar.hp.enc_subsampling_factor > 0 ? diar.hp.enc_subsampling_factor : 8; - const int n_spk = diar.hp.max_speakers; - const int T_diar = std::min(pc->diar_scratch.stream.total_n, (dm_frames + sub - 1) / sub); - const std::vector & probs = pc->diar_scratch.stream.total_preds; // row-major [total_n, n_spk] + const int sub = diar.hp.enc_subsampling_factor > 0 ? diar.hp.enc_subsampling_factor : 8; + const int n_spk = diar.hp.max_speakers; + const int T_diar = std::min(pc->diar_scratch.stream.total_n, (dm_frames + sub - 1) / sub); + const std::vector & probs = pc->diar_scratch.stream.total_preds; // row-major [total_n, n_spk] if (transcribe::debug::enabled()) { const long long shape[2] = { T_diar, n_spk }; @@ -474,114 +472,115 @@ transcribe_status run_multitalker(ParakeetSession * pc, st != TRANSCRIBE_OK) { return st; } - } else - for (const int s : active) { - MultitalkerPass pass; - pass.use_kernel = use_kernel; - pass.spk.resize(static_cast(T_diar)); - pass.bg.assign(static_cast(T_diar), 0.0f); - for (int t = 0; t < T_diar; ++t) { - pass.spk[static_cast(t)] = probs[static_cast(t) * n_spk + s]; - } - for (const int o : active) { - if (o == s) { - continue; - } + } else { + for (const int s : active) { + MultitalkerPass pass; + pass.use_kernel = use_kernel; + pass.spk.resize(static_cast(T_diar)); + pass.bg.assign(static_cast(T_diar), 0.0f); for (int t = 0; t < T_diar; ++t) { - if (probs[static_cast(t) * n_spk + o] > 0.5f) { - pass.bg[static_cast(t)] = 1.0f; - } + pass.spk[static_cast(t)] = probs[static_cast(t) * n_spk + s]; } - } - - // Kernel-mode chunk gating (reference cache_gating=true, - // cache_gating_buffer_size=2): a speaker's conformer/decoder only - // ever sees chunks where _find_active_speakers selected it — max - // of the accumulated preds over the last 2 chunks (incl. current) - // > 0.5. Without this, a mostly-inactive speaker's pass - // transcribes everyone else's speech (the trained kernels only - // ever saw gated chunks). Masked mode hard-silences non-target - // features instead, so it stays ungated here. - if (use_kernel) { - const int chunk = P.chunk_len; // 14 = nframes_per_chunk - const int n_chunks = (T_diar + chunk - 1) / chunk; - // +1 covers the encoder length trailing the diar frame count - // at the tail; run_one_shot_inner clamps to the true length. - pass.keep_enc_frames.reserve(static_cast(T_diar) + 1); - for (int k = 0; k < n_chunks; ++k) { - const int end = std::min((k + 1) * chunk, T_diar); - const int begin = std::max(0, (k - 1) * chunk); // 2-chunk window - float mx = 0.0f; - for (int t = begin; t < end; ++t) { - mx = std::max(mx, probs[static_cast(t) * n_spk + s]); + for (const int o : active) { + if (o == s) { + continue; } - if (mx > 0.5f) { - const int enc_end = (k == n_chunks - 1) ? end + 1 : end; - for (int t = k * chunk; t < enc_end; ++t) { - pass.keep_enc_frames.push_back(t); + for (int t = 0; t < T_diar; ++t) { + if (probs[static_cast(t) * n_spk + o] > 0.5f) { + pass.bg[static_cast(t)] = 1.0f; } } } - if (pass.keep_enc_frames.empty()) { - continue; // globally active but never chunk-selected - } - } - // Decode at full timestamp resolution; the merged result is elided - // to the caller's request at the end. - transcribe_run_params sp = *params; - sp.timestamps = TRANSCRIBE_TIMESTAMPS_AUTO; - - pc->clear_result(); - char prefix[32]; - std::snprintf(prefix, sizeof(prefix), "mt.spk%d", s); - transcribe::debug::push_name_prefix(prefix); - const transcribe_status st = run_one_shot_inner(pc, pm, pcm, n_samples, &sp, &pass); - transcribe::debug::pop_name_prefix(); - if (st != TRANSCRIBE_OK) { - return st; - } - mel_us += pc->t_mel_us; - enc_us += pc->t_encode_us; - dec_us += pc->t_decode_us; - - SpeakerDecode r; - r.speaker = s; - r.tokens = std::move(pc->tokens); - r.words = std::move(pc->words); - r.segments = std::move(pc->segments); - r.full_text = std::move(pc->full_text); - r.raw_text = std::move(pc->raw_text); - - // Gated pass timestamps are in the gathered timeline; map each - // frame back through the keep list to absolute clip time. - if (!pass.keep_enc_frames.empty()) { - const auto & keep = pass.keep_enc_frames; - const double f_ms = diar_ms_per_frame; // 80 ms encoder cadence - auto remap_t0 = [&](int64_t t_ms) { - size_t f = static_cast(std::max(0, t_ms) / static_cast(f_ms)); - f = std::min(f, keep.size() - 1); - return static_cast(keep[f]) * static_cast(f_ms); - }; - auto remap_t1 = [&](int64_t t_ms) { - size_t f = static_cast(std::max(0, t_ms - 1) / static_cast(f_ms)); - f = std::min(f, keep.size() - 1); - return static_cast(keep[f] + 1) * static_cast(f_ms); - }; - for (auto & tk : r.tokens) { - tk.t0_ms = remap_t0(tk.t0_ms); - tk.t1_ms = remap_t1(tk.t1_ms); + // Kernel-mode chunk gating (reference cache_gating=true, + // cache_gating_buffer_size=2): a speaker's conformer/decoder only + // ever sees chunks where _find_active_speakers selected it — max + // of the accumulated preds over the last 2 chunks (incl. current) + // > 0.5. Without this, a mostly-inactive speaker's pass + // transcribes everyone else's speech (the trained kernels only + // ever saw gated chunks). Masked mode hard-silences non-target + // features instead, so it stays ungated here. + if (use_kernel) { + const int chunk = P.chunk_len; // 14 = nframes_per_chunk + const int n_chunks = (T_diar + chunk - 1) / chunk; + // +1 covers the encoder length trailing the diar frame count + // at the tail; run_one_shot_inner clamps to the true length. + pass.keep_enc_frames.reserve(static_cast(T_diar) + 1); + for (int k = 0; k < n_chunks; ++k) { + const int end = std::min((k + 1) * chunk, T_diar); + const int begin = std::max(0, (k - 1) * chunk); // 2-chunk window + float mx = 0.0f; + for (int t = begin; t < end; ++t) { + mx = std::max(mx, probs[static_cast(t) * n_spk + s]); + } + if (mx > 0.5f) { + const int enc_end = (k == n_chunks - 1) ? end + 1 : end; + for (int t = k * chunk; t < enc_end; ++t) { + pass.keep_enc_frames.push_back(t); + } + } + } + if (pass.keep_enc_frames.empty()) { + continue; // globally active but never chunk-selected + } } - for (auto & wd : r.words) { - wd.t0_ms = remap_t0(wd.t0_ms); - wd.t1_ms = remap_t1(wd.t1_ms); + + // Decode at full timestamp resolution; the merged result is elided + // to the caller's request at the end. + transcribe_run_params sp = *params; + sp.timestamps = TRANSCRIBE_TIMESTAMPS_AUTO; + + pc->clear_result(); + char prefix[32]; + std::snprintf(prefix, sizeof(prefix), "mt.spk%d", s); + transcribe::debug::push_name_prefix(prefix); + const transcribe_status st = run_one_shot_inner(pc, pm, pcm, n_samples, &sp, &pass); + transcribe::debug::pop_name_prefix(); + if (st != TRANSCRIBE_OK) { + return st; } - for (auto & sg : r.segments) { - sg.t0_ms = remap_t0(sg.t0_ms); - sg.t1_ms = remap_t1(sg.t1_ms); + mel_us += pc->t_mel_us; + enc_us += pc->t_encode_us; + dec_us += pc->t_decode_us; + + SpeakerDecode r; + r.speaker = s; + r.tokens = std::move(pc->tokens); + r.words = std::move(pc->words); + r.segments = std::move(pc->segments); + r.full_text = std::move(pc->full_text); + r.raw_text = std::move(pc->raw_text); + + // Gated pass timestamps are in the gathered timeline; map each + // frame back through the keep list to absolute clip time. + if (!pass.keep_enc_frames.empty()) { + const auto & keep = pass.keep_enc_frames; + const double f_ms = diar_ms_per_frame; // 80 ms encoder cadence + auto remap_t0 = [&](int64_t t_ms) { + size_t f = static_cast(std::max(0, t_ms) / static_cast(f_ms)); + f = std::min(f, keep.size() - 1); + return static_cast(keep[f]) * static_cast(f_ms); + }; + auto remap_t1 = [&](int64_t t_ms) { + size_t f = static_cast(std::max(0, t_ms - 1) / static_cast(f_ms)); + f = std::min(f, keep.size() - 1); + return static_cast(keep[f] + 1) * static_cast(f_ms); + }; + for (auto & tk : r.tokens) { + tk.t0_ms = remap_t0(tk.t0_ms); + tk.t1_ms = remap_t1(tk.t1_ms); + } + for (auto & wd : r.words) { + wd.t0_ms = remap_t0(wd.t0_ms); + wd.t1_ms = remap_t1(wd.t1_ms); + } + for (auto & sg : r.segments) { + sg.t0_ms = remap_t0(sg.t0_ms); + sg.t1_ms = remap_t1(sg.t1_ms); + } } + per_spk.push_back(std::move(r)); } - per_spk.push_back(std::move(r)); } // ---- 4. Merge into one speaker-tagged result ---- @@ -598,11 +597,10 @@ transcribe_status run_multitalker(ParakeetSession * pc, order.push_back({ &r, static_cast(i) }); } } - std::stable_sort(order.begin(), order.end(), - [](const SegRef & a, const SegRef & b) { - return a.r->segments[static_cast(a.seg_idx)].t0_ms < - b.r->segments[static_cast(b.seg_idx)].t0_ms; - }); + std::stable_sort(order.begin(), order.end(), [](const SegRef & a, const SegRef & b) { + return a.r->segments[static_cast(a.seg_idx)].t0_ms < + b.r->segments[static_cast(b.seg_idx)].t0_ms; + }); std::string merged_text; std::string merged_raw; diff --git a/src/arch/parakeet/parakeet.h b/src/arch/parakeet/parakeet.h index 4b149e3d..131c7528 100644 --- a/src/arch/parakeet/parakeet.h +++ b/src/arch/parakeet/parakeet.h @@ -120,8 +120,8 @@ struct ParakeetModel final : public transcribe_model { // bundle's tensor prefix); the diarizer conformer's fused-BN params // live in their own ctx + buffer, freed in the dtor. std::unique_ptr diar; - ggml_context * diar_bn_ctx = nullptr; - ggml_backend_buffer_t diar_bn_buffer = nullptr; + ggml_context * diar_bn_ctx = nullptr; + ggml_backend_buffer_t diar_bn_buffer = nullptr; // Diarizer mel front-end. Same acoustic settings as the ASR frontend // (the compose step enforces agreement) but with the sortformer port's @@ -331,11 +331,11 @@ struct ParakeetSession final : public transcribe_session { // union of other actives) drive the layer-0 speaker-kernel injection // as graph inputs (set_speaker_targets path). struct MultitalkerPass { - bool use_kernel = false; - float threshold = 0.5f; - float mask_value = -16.6355f; - std::vector spk; // [T_diar] target-speaker activity - std::vector bg; // [T_diar] binarized union of other actives + bool use_kernel = false; + float threshold = 0.5f; + float mask_value = -16.6355f; + std::vector spk; // [T_diar] target-speaker activity + std::vector bg; // [T_diar] binarized union of other actives // Kernel-mode chunk gating (reference cache_gating): encoder-frame // indices of this speaker's ACTIVE 14-frame chunks, in order. The // conformer + decoder see only these frames (gathered after the diff --git a/src/arch/sortformer/model.cpp b/src/arch/sortformer/model.cpp index 5ad59390..ef989c44 100644 --- a/src/arch/sortformer/model.cpp +++ b/src/arch/sortformer/model.cpp @@ -447,8 +447,8 @@ PreEncodeBuild build_pre_encode_graph(ggml_context * ctx, ggml_set_name(mel_in, "chunk.mel.in"); ggml_set_input(mel_in); const conf::ConvPolicy policy = sf_conv_policy(backend); - ggml_tensor * out = conf::build_pre_encode(ctx, sf_pre_view(pe), mel_in, policy, - /*name_prefix=*/"chunk.pre_encode", /*error_tag=*/"sortformer", nullptr); + ggml_tensor * out = conf::build_pre_encode(ctx, sf_pre_view(pe), mel_in, policy, + /*name_prefix=*/"chunk.pre_encode", /*error_tag=*/"sortformer", nullptr); if (out == nullptr) { return b; } @@ -983,21 +983,20 @@ transcribe_status run_diar_streaming_core(DiarStreamScratch & sc, // Family wrapper: resolve the operating point, run the core, trim, dump, // and emit speaker segments on the session. static transcribe_status run_streaming(SortformerSession * pc, - SortformerModel * pm, - int mel_n_mels, - int mel_n_frames, - double ms_per_frame, - transcribe_sortformer_preset preset) { + SortformerModel * pm, + int mel_n_mels, + int mel_n_frames, + double ms_per_frame, + transcribe_sortformer_preset preset) { const SortformerStreamParams P = resolve_stream_params(pm->hparams, preset); if (const transcribe_status st = ensure_sched(pc, pm); st != TRANSCRIBE_OK) { return st; } const int64_t t_stream_start = ggml_time_us(); - const transcribe_status st = - run_diar_streaming_core(pc->scratch, pm->hparams, pm->conformer_hp, pm->conformer, pm->weights, - pm->backend.c_str(), pc->sched, pc->n_threads, P, pc->mel_buf.data(), mel_n_mels, - mel_n_frames, pc); + const transcribe_status st = run_diar_streaming_core(pc->scratch, pm->hparams, pm->conformer_hp, pm->conformer, + pm->weights, pm->backend.c_str(), pc->sched, pc->n_threads, P, + pc->mel_buf.data(), mel_n_mels, mel_n_frames, pc); if (st != TRANSCRIBE_OK) { return st; } diff --git a/src/arch/sortformer/weights.cpp b/src/arch/sortformer/weights.cpp index da0c0b92..708aaee6 100644 --- a/src/arch/sortformer/weights.cpp +++ b/src/arch/sortformer/weights.cpp @@ -149,12 +149,12 @@ transcribe_status build_sortformer_weights(ggml_context * ctx, const char * pfx = (tensor_prefix != nullptr) ? tensor_prefix : ""; char name[160]; -#define GET(dst, nm, e0, e1) \ - do { \ - std::snprintf(name, sizeof(name), "%s%s", pfx, (nm)); \ - (dst) = get_checked(ctx, name, (e0), (e1)); \ - if ((dst) == nullptr) \ - return TRANSCRIBE_ERR_GGUF; \ +#define GET(dst, nm, e0, e1) \ + do { \ + std::snprintf(name, sizeof(name), "%s%s", pfx, (nm)); \ + (dst) = get_checked(ctx, name, (e0), (e1)); \ + if ((dst) == nullptr) \ + return TRANSCRIBE_ERR_GGUF; \ } while (0) GET(w.enc_proj_w, "diar.encoder_proj.weight", ed, d); @@ -164,10 +164,10 @@ transcribe_status build_sortformer_weights(ggml_context * ctx, for (int i = 0; i < hp.tf_n_layers; ++i) { SortformerTfBlock & b = w.tf_blocks[static_cast(i)]; char blk[96]; -#define GETB(dst, suffix, e0, e1) \ - do { \ +#define GETB(dst, suffix, e0, e1) \ + do { \ std::snprintf(blk, sizeof(blk), "tf.blocks.%d.%s", i, suffix); \ - GET(dst, blk, e0, e1); \ + GET(dst, blk, e0, e1); \ } while (0) GETB(b.norm1_w, "norm_1.weight", d, -1); GETB(b.norm1_b, "norm_1.bias", d, -1); diff --git a/tests/parakeet_multitalker_e2e_smoke.cpp b/tests/parakeet_multitalker_e2e_smoke.cpp index 0c4461c4..dac2e83e 100644 --- a/tests/parakeet_multitalker_e2e_smoke.cpp +++ b/tests/parakeet_multitalker_e2e_smoke.cpp @@ -117,6 +117,7 @@ int main() { return EXIT_FAILURE; } } + check(transcribe_model_supports(model, TRANSCRIBE_FEATURE_DIARIZATION), "bundle reports TRANSCRIBE_FEATURE_DIARIZATION"); From 3083021bf5440c6da40af1de430ffb00262fdaf2 Mon Sep 17 00:00:00 2001 From: CJ Pais Date: Thu, 30 Jul 2026 02:15:35 -0700 Subject: [PATCH 3/3] use correct free --- src/arch/parakeet/multitalker.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/arch/parakeet/multitalker.cpp b/src/arch/parakeet/multitalker.cpp index 6e157a02..09d7e3b8 100644 --- a/src/arch/parakeet/multitalker.cpp +++ b/src/arch/parakeet/multitalker.cpp @@ -34,7 +34,6 @@ // construction. #include "../sortformer/sortformer.h" -#include "ggml-backend.h" #include "ggml.h" #include "parakeet.h" #include "transcribe-debug.h" @@ -142,7 +141,7 @@ static transcribe_status run_streaming_passes(ParakeetSession * pc, }; auto free_inst = [&](Inst & I) { if (I.caches.buffer != nullptr) { - ggml_backend_buffer_free(I.caches.buffer); + transcribe::safe_buffer_free(I.caches.buffer); I.caches.buffer = nullptr; } if (I.caches.ctx != nullptr) { @@ -150,7 +149,7 @@ static transcribe_status run_streaming_passes(ParakeetSession * pc, I.caches.ctx = nullptr; } if (I.caches.pos_proj_buf != nullptr) { - ggml_backend_buffer_free(I.caches.pos_proj_buf); + transcribe::safe_buffer_free(I.caches.pos_proj_buf); I.caches.pos_proj_buf = nullptr; } if (I.caches.pos_proj_ctx != nullptr) {