| """ |
| Standalone audio deepfake inference script. |
| |
| Usage: |
| python inference/predict_audio.py -f audio.wav |
| python inference/predict_audio.py -f audio.mp3 --json |
| """ |
|
|
| import sys |
| import os |
| import argparse |
| import json |
|
|
| ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) |
| if ROOT_DIR not in sys.path: |
| sys.path.insert(0, ROOT_DIR) |
|
|
| from pipeline.audio_analyzer import AudioAnalyzer |
|
|
|
|
| def main(): |
| parser = argparse.ArgumentParser(description="Audio deepfake detection") |
| parser.add_argument("-f", "--file", required=True, help="Path to audio file") |
| parser.add_argument("--json", action="store_true", help="Output as JSON") |
| args = parser.parse_args() |
|
|
| if not os.path.exists(args.file): |
| print(f"Error: File not found: {args.file}") |
| sys.exit(1) |
|
|
| analyzer = AudioAnalyzer() |
| result = analyzer.analyze(args.file) |
|
|
| if args.json: |
| |
| output = {k: v for k, v in result.items() if k != "segment_results"} |
| print(json.dumps(output, indent=2)) |
| else: |
| if "error" in result: |
| print(f"\nError: {result['error']}") |
| sys.exit(1) |
|
|
| print("\n=== AUDIO DEEPFAKE DETECTION ===") |
| print(f"File : {args.file}") |
| print(f"Duration : {result['duration_sec']}s") |
| print(f"Segments Analyzed : {result['segments_analyzed']}") |
| print() |
| print(f"Authenticity Score : {result['authenticity_score']}%") |
| print(f"Fake Probability : {result['fake_probability']:.4f}") |
| print(f"Label : {result['label']}") |
| print(f"Confidence : {result['confidence']}") |
| print(f"Manipulation Type : {result['manipulation_type']}") |
| print() |
| print(f"Evidence : {', '.join(result['evidence'])}") |
| if result['timestamps']: |
| print(f"Suspicious Times : {result['timestamps']}") |
| print() |
| print(f"Explanation : {result['explanation']}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|