import gradio as gr import librosa import numpy as np import torch from transformers import Wav2Vec2Processor, Wav2Vec2Model from simple_salesforce import Salesforce import os from datetime import datetime # Salesforce credentials (store securely in environment variables) SF_USERNAME = os.getenv("SF_USERNAME", "your_salesforce_username") SF_PASSWORD = os.getenv("SF_PASSWORD", "your_salesforce_password") SF_SECURITY_TOKEN = os.getenv("SF_SECURITY_TOKEN", "your_salesforce_security_token") SF_INSTANCE_URL = os.getenv("SF_INSTANCE_URL", "https://your-salesforce-instance.salesforce.com") # Initialize Salesforce connection try: sf = Salesforce( username=SF_USERNAME, password=SF_PASSWORD, security_token=SF_SECURITY_TOKEN, instance_url=SF_INSTANCE_URL ) except Exception as e: print(f"Failed to connect to Salesforce: {str(e)}") sf = None # Load Wav2Vec2 model for speech feature extraction processor = Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-base-960h") model = Wav2Vec2Model.from_pretrained("facebook/wav2vec2-base-960h") def analyze_voice(audio_file): """Analyze voice for health indicators.""" try: # Load audio file audio, sr = librosa.load(audio_file, sr=16000) # Process audio for Wav2Vec2 inputs = processor(audio, sampling_rate=16000, return_tensors="pt", padding=True) with torch.no_grad(): outputs = model(**inputs) # Extract features features = outputs.last_hidden_state.mean(dim=1).numpy() # Mock health analysis (for testing) respiratory_score = np.mean(features) mental_health_score = np.std(features) # Debug: Print scores print(f"Respiratory Score: {respiratory_score:.4f}, Mental Health Score: {mental_health_score:.4f}") # Adjusted thresholds for testing feedback = "" if respiratory_score > 0.1: feedback += f"Possible respiratory issue detected (score: {respiratory_score:.4f}); consult a doctor. " if mental_health_score > 0.1: feedback += f"Possible stress indicators detected (score: {mental_health_score:.4f}); consider professional advice. " if not feedback: feedback = "No significant health indicators detected." feedback += f"\n\n**Debug Info**: Respiratory Score = {respiratory_score:.4f}, Mental Health Score = {mental_health_score:.4f}" feedback += "\n**Disclaimer**: This is not a diagnostic tool. Consult a healthcare provider for medical advice." # Store in Salesforce if sf: store_in_salesforce(audio_file, feedback, respiratory_score, mental_health_score) # Clean up temporary audio file (for HIPAA/GDPR compliance) try: os.remove(audio_file) print(f"Deleted temporary audio file: {audio_file}") except Exception as e: print(f"Failed to delete audio file: {str(e)}") return feedback except Exception as e: return f"Error processing audio: {str(e)}" def store_in_salesforce(audio_file, feedback, respiratory_score, mental_health_score): """Store analysis results in Salesforce.""" try: sf.HealthAssessment__c.create({ "AssessmentDate__c": datetime.utcnow().isoformat(), "Feedback__c": feedback, "RespiratoryScore__c": float(respiratory_score), "MentalHealthScore__c": float(mental_health_score), "AudioFileName__c": os.path.basename(audio_file) }) except Exception as e: print(f"Failed to store in Salesforce: {str(e)}") def test_with_sample_audio(): """Test the app with a sample audio file.""" sample_audio_path = "audio_samples/sample.wav" # Adjust if using common_voice_sample.wav if os.path.exists(sample_audio_path): return analyze_voice(sample_audio_path) return "Sample audio file not found." # Gradio interface iface = gr.Interface( fn=analyze_voice, inputs=gr.Audio(type="filepath", label="Record or Upload Voice"), outputs=gr.Textbox(label="Health Assessment Feedback"), title="Health Voice Analyzer", description="Record or upload a voice sample for preliminary health assessment. Supports English, Spanish, Hindi, Mandarin." ) if __name__ == "__main__": print(test_with_sample_audio()) # Run test on startup iface.launch(server_name="0.0.0.0", server_port=7860)