open-audiodeleto / bin /audiodeleto.py
cryblanka's picture
Upload 17 files
5105668 verified
Raw
History Blame Contribute Delete
3.17 kB
#!/usr/bin/env python3
"""CLI for Open-Audiodeleto."""
from __future__ import annotations
import json
import sys
from pathlib import Path
SCRIPT_DIR = Path(__file__).resolve().parent
RELEASE_DIR = SCRIPT_DIR.parent if SCRIPT_DIR.name == "bin" else SCRIPT_DIR
MODEL_DIR = RELEASE_DIR / "model" if (RELEASE_DIR / "model").exists() else RELEASE_DIR
REPO_ROOT = RELEASE_DIR.parents[1]
EXPERIMENT_DIR = REPO_ROOT / "experiments" / "first_pass_bypass_classifier"
if str(EXPERIMENT_DIR) not in sys.path:
sys.path.insert(0, str(EXPERIMENT_DIR))
try:
from train_bypass_classifier import FEATURE_COLUMNS, extract_features, joblib, pd, require_binary
except Exception as exc:
print(json.dumps({"ok": False, "error": f"Could not load dependencies: {exc}"}))
raise SystemExit(2)
RECOMMENDATIONS = {
"low": "allow",
"medium": "review",
"high": "review",
"critical": "review"
}
NOTE = "This model detects audio patterns similar to known bypass uploads. It does not prove copyright infringement. It does not prove intent. It should not be used as the sole basis for enforcement."
def risk_level(probability: float, thresholds: dict) -> str:
if probability >= thresholds["critical"]:
return "critical"
if probability >= thresholds["high"]:
return "high"
if probability >= thresholds["medium"]:
return "medium"
return "low"
def fail(message: str, file_path: str | None = None, code: int = 1) -> None:
payload = {"ok": False, "error": message}
if file_path is not None:
payload["file"] = file_path
print(json.dumps(payload, ensure_ascii=False))
raise SystemExit(code)
def main() -> None:
if len(sys.argv) != 2:
fail("Expected exactly one audio file path.", code=2)
audio_path = Path(sys.argv[1]).expanduser()
if not audio_path.exists() or not audio_path.is_file():
fail("File missing.", str(audio_path), code=1)
try:
require_binary("ffmpeg")
require_binary("ffprobe")
except SystemExit:
fail("ffmpeg and ffprobe are required.", str(audio_path), code=2)
try:
metadata = json.loads((MODEL_DIR / "metadata.json").read_text(encoding="utf-8"))
model = joblib.load(MODEL_DIR / "model.pkl")
except Exception as exc:
fail(f"Could not load model files: {exc}", str(audio_path), code=2)
try:
features = extract_features(str(audio_path), sample_rate=22050, hop_length=512, n_fft=2048)
row = pd.DataFrame([[features[column] for column in FEATURE_COLUMNS]], columns=FEATURE_COLUMNS)
probability = float(model.predict_proba(row)[0][1])
except Exception:
fail("Could not decode audio file.", str(audio_path), code=1)
level = risk_level(probability, metadata["riskThresholds"])
payload = {
"model": metadata["name"],
"version": metadata["version"],
"file": str(audio_path),
"bypassProbability": round(probability, 6),
"riskLevel": level,
"recommendation": RECOMMENDATIONS[level],
"note": NOTE,
}
print(json.dumps(payload, ensure_ascii=False))
if __name__ == "__main__":
main()