Anuvani-Diarization / src /tests /test_api.py
StephennFernandes's picture
Anuvani-Diarization 1.0.0
63dd946
Raw History Blame Contribute Delete
3.31 kB
# Copyright (c) 2026 The Anuvani-Diarization authors
# SPDX-License-Identifier: MIT OR Apache-2.0
"""The user-facing surfaces on the GPUs: Diarizer(...)(file), Diarizer.run(..., out_dir), Diarization, and the
anuvani-diar command line, against the raw-audio oracle and the release's own golden hashes (golden/expected.json)."""
import hashlib
import json
import subprocess
import sys
from pathlib import Path
import pytest
from conftest import PROJ, REL
GOLDEN = json.loads((REL / "golden/expected.json").read_text())["files"]
ORACLE = PROJ / "artifacts/oracle_audio"
INPUTS = {i["sid"]: i for i in json.loads((PROJ / "artifacts/golden12_inputs.json").read_text())}
FILES = sorted(INPUTS)[:4]
def sha(b):
return hashlib.sha256(b).hexdigest()
@pytest.fixture(scope="module")
def diarizer():
from anuvani_diar import Diarizer
return Diarizer()
@pytest.mark.gpu
def test_call_and_run(diarizer, tmp_path):
sid = FILES[0]
r = diarizer(INPUTS[sid]["path"])
assert r.ok and r.uri == sid
r.save_rttm(tmp_path / "one.rttm")
assert sha((tmp_path / "one.rttm").read_bytes()) == GOLDEN[sid]["indic_rttm_sha256"]
assert r.segments and r.speakers and r.duration_s > 0
out = tmp_path / "out"
got = list(diarizer.run([INPUTS[s]["path"] for s in FILES], out_dir=out))
assert len(got) == len(FILES) and all(g.ok for g in got)
for s in FILES:
assert sha((out / f"{s}.rttm").read_bytes()) == GOLDEN[s]["indic_rttm_sha256"], s
@pytest.mark.gpu
def test_cli_matches_diarize_py(tmp_path):
out = tmp_path / "out"
paths = [INPUTS[s]["path"] for s in FILES]
cli = [sys.executable, "-s", "-m", "anuvani_diar.cli", "--out", str(out), *paths]
r = subprocess.run(cli, capture_output=True, text=True)
assert r.returncode == 0, r.stderr[-2000:]
run = json.loads((out / "run.json").read_text())
assert len(run["files"]) == len(FILES)
assert set(run) == {"version", "model_config", "bundle_sha256", "device", "batch_size", "threads", "python", "files"}
for s, rec in zip(FILES, run["files"]):
assert Path(rec["input"]).stem == s
assert rec["rttm_sha256"] == GOLDEN[s]["indic_rttm_sha256"] == sha(Path(rec["rttm"]).read_bytes())
assert set(rec) == {"input", "rttm", "duration_s", "seconds", "rttm_sha256"}
@pytest.mark.gpu
def test_install_check(tmp_path):
"""`anuvani-diar-check`: the release's 12 golden fingerprints plus the 1 h, 3 h and 6 h files, one command."""
audio = tmp_path / "audio"
audio.mkdir()
for s, it in INPUTS.items():
(audio / f"{s}.flac").symlink_to(it["path"])
r = subprocess.run([sys.executable, "-s", "-m", "anuvani_diar.check", "--audio-dir", str(audio),
"--long-dir", str(PROJ / "artifacts/test_audio")], capture_output=True, text=True)
assert r.returncode == 0, r.stdout[-2000:] + r.stderr[-2000:]
assert "15/15 outputs identical" in r.stdout and "WARNING" not in r.stdout
def test_diarizer_refuses_to_start_without_its_network_check(monkeypatch):
"""No silent skip: without assets/nn_golden.json the networks are never used unchecked."""
from anuvani_diar import api
monkeypatch.setattr(api, "default_golden", lambda: None)
with pytest.raises(FileNotFoundError, match="nn_golden.json"):
api.Diarizer()