File size: 5,341 Bytes
94cbe85
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import json
from pathlib import Path
import wave

from scripts import run_local_asr_evidence


def _provider_payload(path: Path) -> Path:
    payload = {
        "transcript": "Local Parakeet transcript says the patient has trouble breathing.",
        "suggested_fields": [
            {
                "field": "symptoms",
                "draft_value": "trouble breathing",
                "source_snippet": "trouble breathing",
            }
        ],
        "missing_or_unclear_fields": ["vitals"],
        "provisional_red_flag_mentions": ["trouble breathing"],
    }
    path.write_text(json.dumps(payload), encoding="utf-8")
    return path


def test_asr_evidence_without_provider_payload_records_artifact_only(tmp_path: Path, monkeypatch) -> None:
    artifact_path = tmp_path / "parakeet-rnnt-1.1b.nemo"
    artifact_path.write_bytes(b"fake parakeet")
    monkeypatch.setattr(run_local_asr_evidence, "PARAKEET_NEMO_PATH", artifact_path)
    monkeypatch.setattr(run_local_asr_evidence, "PARAKEET_NEMO_BYTES", len(b"fake parakeet"))
    monkeypatch.setattr(
        run_local_asr_evidence,
        "PARAKEET_NEMO_SHA256",
        run_local_asr_evidence._sha256(artifact_path),
    )

    summary = run_local_asr_evidence.run_evidence(output_dir=tmp_path / "evidence")

    assert summary["status"] == "artifact_present_provider_payload_required"
    assert summary["counts_as_local_asr_artifact"] is True
    assert summary["counts_as_local_asr_proof"] is False
    assert (tmp_path / "evidence" / "artifact_metadata.json").exists()
    assert summary["asr_evidence_manifest_path"] == str(tmp_path / "evidence" / "asr_evidence_manifest.json")
    manifest = json.loads((tmp_path / "evidence" / "asr_evidence_manifest.json").read_text(encoding="utf-8"))
    assert manifest["proof_flags"]["counts_as_local_asr_artifact"] is True
    assert manifest["proof_flags"]["counts_as_local_asr_proof"] is False
    assert manifest["provider_payload"] is None


def test_asr_evidence_provider_payload_can_pass_gated_draft_checks(tmp_path: Path, monkeypatch) -> None:
    artifact_path = tmp_path / "parakeet-rnnt-1.1b.nemo"
    artifact_path.write_bytes(b"fake parakeet")
    monkeypatch.setattr(run_local_asr_evidence, "PARAKEET_NEMO_PATH", artifact_path)
    monkeypatch.setattr(run_local_asr_evidence, "PARAKEET_NEMO_BYTES", len(b"fake parakeet"))
    monkeypatch.setattr(
        run_local_asr_evidence,
        "PARAKEET_NEMO_SHA256",
        run_local_asr_evidence._sha256(artifact_path),
    )
    payload_path = _provider_payload(tmp_path / "provider.json")

    summary = run_local_asr_evidence.run_evidence(
        output_dir=tmp_path / "evidence",
        provider_payload_path=payload_path,
        provider_note="local adapter smoke",
    )

    assert summary["status"] == "local_asr_proof_passed"
    assert summary["counts_as_local_asr_artifact"] is True
    assert summary["counts_as_local_asr_proof"] is True
    draft = json.loads((tmp_path / "evidence" / "audio_draft.json").read_text(encoding="utf-8"))
    assert draft["transcript_source"] == "local_parakeet_asr_provider"
    assert draft["raw_audio_stored"] is False
    manifest = json.loads((tmp_path / "evidence" / "asr_evidence_manifest.json").read_text(encoding="utf-8"))
    assert manifest["evidence_version"] == 1
    assert manifest["provider_payload"]["sha256"] == run_local_asr_evidence._sha256(payload_path)
    assert manifest["draft_summary"]["transcript_hash"]
    assert manifest["draft_summary"]["suggested_field_count"] == 1
    assert manifest["draft_checks"]["counts_as_local_asr_proof"] is True
    assert manifest["configured_route"]["audio_backend"] == "parakeet_nemo"
    assert manifest["configured_route"]["model_stack"] == "local_4b_parakeet"
    assert manifest["raw_audio_handling"]["raw_audio_copied_to_evidence"] is False
    assert manifest["raw_audio_handling"]["raw_audio_stored"] is False


def test_asr_evidence_audio_metadata_hashes_without_copying_audio(tmp_path: Path, monkeypatch) -> None:
    artifact_path = tmp_path / "parakeet-rnnt-1.1b.nemo"
    artifact_path.write_bytes(b"fake parakeet")
    monkeypatch.setattr(run_local_asr_evidence, "PARAKEET_NEMO_PATH", artifact_path)
    monkeypatch.setattr(run_local_asr_evidence, "PARAKEET_NEMO_BYTES", len(b"fake parakeet"))
    monkeypatch.setattr(
        run_local_asr_evidence,
        "PARAKEET_NEMO_SHA256",
        run_local_asr_evidence._sha256(artifact_path),
    )
    audio_path = tmp_path / "source.wav"
    with wave.open(str(audio_path), "wb") as wav:
        wav.setnchannels(1)
        wav.setsampwidth(2)
        wav.setframerate(8000)
        wav.writeframes(b"\0\0" * 8000)

    summary = run_local_asr_evidence.run_evidence(output_dir=tmp_path / "evidence", audio_path=audio_path)

    assert summary["counts_as_local_asr_proof"] is False
    audio_metadata = json.loads((tmp_path / "evidence" / "audio_metadata.json").read_text(encoding="utf-8"))
    assert audio_metadata["duration_seconds"] == 1.0
    assert audio_metadata["raw_audio_copied_to_evidence"] is False
    manifest = json.loads((tmp_path / "evidence" / "asr_evidence_manifest.json").read_text(encoding="utf-8"))
    assert manifest["raw_audio_handling"]["audio_metadata_sha256"] == audio_metadata["sha256"]
    assert manifest["raw_audio_handling"]["raw_audio_copied_to_evidence"] is False