invincible-jha's picture
Upload 2 files
978a6ce verified
raw
history blame
4.48 kB
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."""
)