Skip to content

feat(audio): bundle original FastMSS for meeting simulation - #2524

Open
timofeeva16tanya wants to merge 5 commits into
NVIDIA-NeMo:mainfrom
timofeeva16tanya:feat/fastmss-simulation
Open

timofeeva16tanya wants to merge 5 commits into
NVIDIA-NeMo:mainfrom
timofeeva16tanya:feat/fastmss-simulation

Conversation

@timofeeva16tanya

@timofeeva16tanya timofeeva16tanya commented Oct 22, 2026 •

Copy link
Copy Markdown

Description

Generate multi-speaker ASR and diarization training mixtures directly from Curator with the original FastMSS implementation included in the package. A separate FastMSS checkout is no longer required: FastMSSSimulationStage and FastMSS select the bundled source by default. An explicit source-root override remains available.

Original upstream snapshot

Vendored sources live outside automatic audio-stage discovery. Formatting hooks exclude the copied upstream files to retain exact provenance; safety/YAML checks remain active. Coverage measures the Curator wrapper separately from unchanged third-party sources.

Curator integration

Partition YAML configs into independent simulation shards, execute the original Hydra recipe in child processes, then ingest its recording-level NeMo manifest with the existing ManifestReaderStage. Each output AudioTask represents a complete meeting with audio, duration, reference text, RTTM and additional manifest fields. Preserve overlapping turns.

The wrapper manages output paths, CPU/worker count and manifest generation; retains logs; terminates Linux process groups on timeout; and starts fresh directories on retries. The original defaults resolve from the bundled source. The tutorial documents optional simulation dependency installation in an existing environment; no heavyweight dependencies become unconditional. Include vendored Python, YAML, scripts and attribution in wheels/sdists; exclude bytecode.

Validation

  • 22 targeted CPU tests pass, including real bundled-engine two-speaker generation, audio/RTTM/manifest checks, checksum verification, Hydra/subprocess failures/timeouts, agent contracts and a RayActorPoolExecutor pipeline.
  • Curator simulation wrapper coverage: 99.15% (117/118 statements).
  • Build the Curator wheel; verify all 83 upstream source checksums and attribution/config files inside it, with no bytecode.
  • Extract the wheel and successfully generate audio and RTTM using the extracted package, without any external FastMSS checkout.
  • Repository pre-commit hooks, including uv-lock, pass for all changed files. Dependency declarations and the existing lock remain unchanged.

Remaining validation before merge

  • Full non-GPU audio regression in a complete audio environment; earlier collection stopped because the existing environment lacks librosa.
  • Run the tutorial with its dashboard-enabled Xenna/Ray client; the committed pipeline regression uses RayActorPoolExecutor.

Checklist

  • Original Apache-2.0 upstream source and attribution retained.
  • Tests cover the bundled implementation and real process boundary.
  • Installation packaging and extracted-wheel execution verified.
  • Tutorial and Fern documentation updated.

@copy-pr-bot

copy-pr-bot Bot commented Oct 22, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

Signed-off-by: Tatiana Timofeeva <49036748+timofeeva16tanya@users.noreply.github.com>
Signed-off-by: Tatiana Timofeeva <49036748+timofeeva16tanya@users.noreply.github.com>
Vendor original Apache-2.0 FastMSS 81fc2c3 with provenance and attribution. Use bundled sources by default and include them in wheel/sdist packaging.

Signed-off-by: Tatiana Timofeeva <49036748+timofeeva16tanya@users.noreply.github.com>
@timofeeva16tanya timofeeva16tanya changed the title feat(audio): add FastMSS simulation integration feat(audio): bundle original FastMSS for meeting simulation Oct 23, 2026
Signed-off-by: Tatiana Timofeeva <49036748+timofeeva16tanya@users.noreply.github.com>
@timofeeva16tanya
timofeeva16tanya marked this pull request as ready for review October 23, 2026 13:22
@timofeeva16tanya
timofeeva16tanya requested review from a team as code owners October 23, 2026 13:22
@timofeeva16tanya
timofeeva16tanya requested review from sarahyurick and removed request for a team October 23, 2026 13:22
@greptile-apps

greptile-apps Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 2/5

[Medium impact] The changes reach Curator's audio simulation workflow.

Fix the missing ASR transcripts and the two generation failures before merging.

Findings

  1. P1 Meetings lack reference text ▶
  2. P1 Dry references stop generation ▶
  3. P1 Single-speaker meetings fail ▶
  4. P2 Setup guidance conflicts ▶

Summary

Bundles the original FastMSS source and adds stages that run YAML shards in child processes, then read their meeting manifests into AudioTask rows.

  • Curator pipelines can turn prepared speech into meeting-level audio tasks.
  • Curator packages the original FastMSS engine and its recipes.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[YAML configs] --> B[FilePartitioningStage]
  B --> C[FastMSSSimulationStage]
  C --> D[Bundled FastMSS child process]
  D --> E[Audio and RTTM]
  D --> F[nemo_manifest.json]
  F --> G[ManifestReaderStage]
  G --> H[One AudioTask per meeting]
Loading

Reviews (1) · Last reviewed commit: "ci(audio): baseline verified public Fast..." · Reviewed by Greptile

Comment on lines +183 to +192
manifest = run_dir / "nemo_manifest.json"
if not manifest.is_file() or not manifest.stat().st_size:
msg = (
f"FastMSS did not produce a nonempty recording manifest: {manifest}; see {run_dir / 'fastmss.log'}"
)
raise RuntimeError(msg)
results.append(
FileGroupTask(
dataset_name=task.dataset_name,
data=[str(manifest)],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Meetings lack reference text

The bundled engine never writes text into nemo_manifest.json, but this stage passes that file straight to ManifestReaderStage. The reader copies each row unchanged, so successful runs produce meetings without the reference transcripts promised for ASR training. Build the meeting transcript from the generated supervisions before returning the manifest, and check it in the real-engine test rather than only the fake entry point.

Comment on lines +630 to +631
else:
assert self.cfg.save_anechoic == False

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Dry references stop generation

Setting reverberate=true, save_spk=true and save_anechoic=true while keeping the default reverb_prob=0.5 makes generation fail whenever a meeting skips reverberation. That meeting reaches this assertion with save_anechoic still true, aborting the entire shard. Support dry references for those meetings, or require reverb_prob=1 before launching this combination.

Comment on lines +487 to +489
if prev_speaker is not None:
available_speakers = [s for s in sampled_spk if s != prev_speaker]
current_speaker = np.random.choice(available_speakers)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Single-speaker meetings fail

With min_max_spk=[1,1], a non-hold transition after the first utterance removes the only speaker from available_speakers. np.random.choice then raises instead of continuing the meeting. The bundled librispeech_1spk.yaml recipes request exactly this case. Treat transitions as holds when only one speaker was sampled, or reject these recipes before generation.


[Multi-Speaker Simulation with FastMSS](/curate-audio/tutorials/fastmss)
generates meeting mixtures, reference text and RTTM from prepared single-speaker
speech using an external FastMSS checkout.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Setup guidance conflicts

This tutorial entry says simulation uses an external FastMSS checkout, which contradicts the bundled default introduced here. Say it uses the bundled source so readers are not directed toward an unnecessary checkout.

Suggested change
speech using an external FastMSS checkout.
speech using the bundled FastMSS source.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

This branch was successfully deployed

3 active deployments
nemo-ci — 66ae1ed9 Deployed Oct 23, 2026 by copy-pr-bot[bot] via L0_Unit_Test_GPU-math #5929
public — 66ae1ed9 Deployed Oct 23, 2026 by copy-pr-bot[bot] via release / finalize / notify #1450
test — 66ae1ed9 Deployed Oct 23, 2026 by copy-pr-bot[bot] via cicd-wait-in-queue #5929
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant