Spaces:
Runtime error
Runtime error
import os | |
from anthropic import Anthropic | |
import gradio as gr | |
# ... (your existing imports) | |
class ClinicalVoiceAnalyzer: | |
def __init__(self): | |
# Initialize without the API key first | |
self.anthropic = None | |
self.model = "claude-3-opus-20240229" | |
self.api_key = os.getenv('ANTHROPIC_API_KEY') | |
# Reference ranges remain the same | |
self.reference_ranges = { | |
'pitch': {'min': 150, 'max': 400}, | |
'tempo': {'min': 90, 'max': 130}, | |
'energy': {'min': 0.01, 'max': 0.05} | |
} | |
# Initialize Anthropic client if API key is available | |
self._initialize_anthropic() | |
def _initialize_anthropic(self): | |
"""Safely initialize the Anthropic client""" | |
try: | |
if self.api_key: | |
self.anthropic = Anthropic(api_key=self.api_key) | |
print("Anthropic client initialized successfully") | |
else: | |
print("Warning: ANTHROPIC_API_KEY not found in environment variables") | |
except Exception as e: | |
print(f"Error initializing Anthropic client: {str(e)}") | |
self.anthropic = None | |
def generate_clinical_analysis(self, voice_features): | |
"""Generate clinical analysis with fallback behavior""" | |
if not self.anthropic: | |
return self._generate_fallback_analysis(voice_features), {} | |
try: | |
prompt = self._construct_analysis_prompt(voice_features) | |
response = self.anthropic.messages.create( | |
model=self.model, | |
max_tokens=1000, | |
messages=[{ | |
"role": "user", | |
"content": prompt | |
}] | |
) | |
return response.content, self._parse_clinical_response(response.content) | |
except Exception as e: | |
print(f"Error in clinical analysis: {str(e)}") | |
return self._generate_fallback_analysis(voice_features), {} | |
def _generate_fallback_analysis(self, features): | |
"""Generate basic analysis when Anthropic API is unavailable""" | |
pitch_status = "elevated" if features['pitch_mean'] > self.reference_ranges['pitch']['max'] else "normal" | |
tempo_status = "elevated" if features['tempo'] > self.reference_ranges['tempo']['max'] else "normal" | |
return f"""Basic Voice Analysis: | |
Pitch Analysis: {pitch_status} ({features['pitch_mean']:.2f} Hz) | |
Speech Rate: {tempo_status} ({features['tempo']:.2f} BPM) | |
Energy Level: {features['energy_mean']:.4f} | |
Note: This is a basic analysis. For detailed clinical interpretation, please ensure the Anthropic API key is configured.""" | |
# ... (rest of your ClinicalVoiceAnalyzer methods remain the same) | |
# Modified analyze_audio function | |
def analyze_audio(audio_input): | |
try: | |
# Your existing audio processing code... | |
# Initialize clinical analyzer with graceful fallback | |
clinical_analyzer = ClinicalVoiceAnalyzer() | |
clinical_analysis, clinical_insights = clinical_analyzer.generate_clinical_analysis(features) | |
# Create enhanced summary | |
summary = f"""Voice Analysis Summary: | |
Speech Content: | |
{transcription} | |
Voice Characteristics: | |
- Average Pitch: {features['pitch_mean']:.2f} Hz | |
- Pitch Variation: {features['pitch_std']:.2f} Hz | |
- Speech Rate (Tempo): {features['tempo']:.2f} BPM | |
- Voice Energy: {features['energy_mean']:.4f} | |
Dominant Emotion: {max(emotion_scores.items(), key=lambda x: x[1])[0]} | |
Clinical Analysis: | |
{clinical_analysis} | |
""" | |
return summary, emotion_viz, feature_viz, clinical_insights | |
except Exception as e: | |
error_msg = f"Error in audio analysis: {str(e)}" | |
print(error_msg) | |
return error_msg, None, None, None | |
# ... (rest of your existing code) | |
# Modified Gradio interface | |
demo = gr.Interface( | |
fn=analyze_audio, | |
inputs=gr.Audio( | |
sources=["microphone", "upload"], | |
type="filepath", | |
label="Audio Input" | |
), | |
outputs=[ | |
gr.Textbox(label="Analysis Summary", lines=15), | |
gr.HTML(label="Emotion Analysis"), | |
gr.HTML(label="Voice Feature Analysis"), | |
gr.JSON(label="Clinical Insights") | |
], | |
title="Advanced Voice Analysis System", | |
description="""This system provides comprehensive voice analysis with clinical interpretation. | |
Upload an audio file or record directly through your microphone.""" | |
) |