Spaces:
Sleeping
Sleeping
| """ | |
| Hugging Face Inference API Detector | |
| Uses external API for deepfake detection (No local GPU required). | |
| Uses the huggingface_hub InferenceClient for proper API access. | |
| """ | |
| import os | |
| from typing import Dict, Any | |
| from dotenv import load_dotenv | |
| # Load .env to get HF_TOKEN | |
| load_dotenv() | |
| class HFDetector: | |
| """ | |
| Detects AI voices using Hugging Face Inference API. | |
| Free, no-GPU (serverless) solution. | |
| """ | |
| # Model for audio classification / deepfake detection | |
| MODEL_ID = "mo-thecreator/Deepfake-audio-detection" | |
| def __init__(self, api_token: str = None): | |
| """ | |
| Initialize with Hugging Face API token. | |
| If not provided, tries to read HF_TOKEN from env. | |
| """ | |
| self.api_token = api_token or os.getenv("HF_TOKEN") | |
| self.is_available = bool(self.api_token) | |
| self.client = None | |
| if self.is_available: | |
| try: | |
| from huggingface_hub import InferenceClient | |
| self.client = InferenceClient(token=self.api_token) | |
| except ImportError: | |
| print("huggingface_hub not installed. Run: pip install huggingface_hub") | |
| self.is_available = False | |
| def detect(self, audio_bytes: bytes) -> Dict[str, Any]: | |
| """ | |
| Send audio to Hugging Face API for detection. | |
| Args: | |
| audio_bytes: Raw audio bytes (MP3/WAV) | |
| Returns: | |
| Detection result dictionary | |
| """ | |
| if not self.is_available or not self.client: | |
| return { | |
| "classification": "UNKNOWN", | |
| "confidenceScore": 0.0, | |
| "explanation": "Hugging Face Token (HF_TOKEN) missing in .env or library not installed", | |
| "method": "hf_api_failed", | |
| } | |
| try: | |
| # Use audio_classification endpoint | |
| result = self.client.audio_classification( | |
| audio=audio_bytes, | |
| model=self.MODEL_ID, | |
| ) | |
| # Result format: [{'label': 'real', 'score': 0.99}, {'label': 'fake', 'score': 0.01}] | |
| if not result: | |
| return { | |
| "classification": "UNKNOWN", | |
| "confidenceScore": 0.0, | |
| "explanation": "No result from HF API", | |
| "method": "hf_api_failed", | |
| } | |
| # Get top prediction | |
| top_result = result[0] | |
| label = ( | |
| top_result.label.lower() | |
| if hasattr(top_result, "label") | |
| else str(top_result.get("label", "")).lower() | |
| ) | |
| score = float( | |
| top_result.score if hasattr(top_result, "score") else top_result.get("score", 0) | |
| ) | |
| # Map to our schema | |
| is_ai = label in ["fake", "spoof", "ai", "deepfake"] | |
| if is_ai: | |
| classification = "AI_GENERATED" | |
| reasons = "Deep learning model detected synthetic speech patterns" | |
| else: | |
| classification = "HUMAN" | |
| reasons = "Deep learning model confirmed natural human voice" | |
| return { | |
| "classification": classification, | |
| "confidenceScore": score, | |
| "explanation": reasons, | |
| "method": "hf_inference_api", | |
| "raw_label": label, | |
| } | |
| except Exception as e: | |
| error_msg = str(e) | |
| print(f"HF Detector Error: {error_msg}") | |
| # Check for model loading | |
| if "loading" in error_msg.lower(): | |
| return { | |
| "classification": "UNKNOWN", | |
| "confidenceScore": 0.0, | |
| "explanation": "Model is loading, please retry in a few seconds", | |
| "method": "hf_api_loading", | |
| } | |
| return { | |
| "classification": "UNKNOWN", | |
| "confidenceScore": 0.0, | |
| "explanation": f"API Error: {error_msg[:100]}", | |
| "method": "hf_api_error", | |
| } | |
| # Singleton | |
| hf_detector = HFDetector() | |