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 (simplified for demo) features = outputs.last_hidden_state.mean(dim=1).numpy() # Adjusted thresholds for testing (lower to trigger feedback) respiratory_score = np.mean(features) # Mock score mental_health_score = np.std(features) # Mock score feedback = "" if respiratory_score > 0.1: # Lowered from 0.5 feedback += "Possible respiratory issue detected; consult a doctor. " if mental_health_score > 0.1: # Lowered from 0.3 feedback += "Possible stress indicators detected; consider professional advice. " if not feedback: feedback = "No significant health indicators detected." feedback += "\n\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) 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" # Or "audio_samples/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)