Spaces:
Build error
Build error
# app.py | |
import gradio as gr | |
from tabs.speech_stress_analysis import create_voice_stress_tab | |
from tabs.speech_emotion_recognition import create_emotion_recognition_tab | |
from tabs.FACS_analysis import create_facs_analysis_tab | |
from tabs.heart_rate_variability import create_heart_rate_variability_tab | |
from tabs.deception_detection import create_deception_detection_tab, load_models | |
import logging | |
import torch | |
from typing import Dict | |
# Configure logging | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
# Custom CSS for better styling | |
CUSTOM_CSS = """ | |
/* Global styles */ | |
.gradio-container { | |
font-family: 'Arial', sans-serif; | |
max-width: 1200px; | |
margin: auto; | |
padding: 20px; | |
background-color: #f8f9fa; | |
} | |
/* Header styling */ | |
h1 { | |
color: #2c3e50; | |
text-align: center; | |
padding: 20px 0; | |
margin-bottom: 30px; | |
border-bottom: 2px solid #3498db; | |
} | |
/* Tab navigation styling */ | |
.gradio-tabs-nav { | |
background-color: #ffffff; | |
border-radius: 8px; | |
box-shadow: 0 2px 4px rgba(0,0,0,0.1); | |
margin-bottom: 20px; | |
} | |
/* Content areas */ | |
.content-area { | |
background: white; | |
padding: 20px; | |
border-radius: 8px; | |
box-shadow: 0 2px 4px rgba(0,0,0,0.1); | |
margin-top: 20px; | |
} | |
/* Results area */ | |
.results-area { | |
background-color: #ffffff; | |
padding: 20px; | |
border-radius: 8px; | |
margin-top: 20px; | |
box-shadow: 0 2px 4px rgba(0,0,0,0.1); | |
} | |
/* Disclaimer styling */ | |
.disclaimer { | |
background-color: #f8f9fa; | |
border-left: 4px solid #3498db; | |
padding: 15px; | |
margin-top: 30px; | |
font-size: 0.9em; | |
color: #666; | |
} | |
""" | |
# HTML content | |
HEADER_HTML = """ | |
<div style="text-align: center; padding: 20px;"> | |
<h1>AI-Driven Multimodal Emotional State Analysis</h1> | |
<p style="font-size: 1.2em; color: #666;"> | |
Comprehensive analysis of stress, emotion, and truthfulness through facial expressions, | |
heart rate variability, and speech patterns. | |
</p> | |
</div> | |
""" | |
DISCLAIMER_HTML = """ | |
<div class="disclaimer"> | |
<h3>Important Notice</h3> | |
<p>This application provides AI-driven analysis for:</p> | |
<ul> | |
<li>Stress and emotion detection</li> | |
<li>Heart rate variability analysis</li> | |
<li>Speech pattern analysis</li> | |
<li>Truth/deception indication</li> | |
</ul> | |
<p><strong>Disclaimer:</strong> This tool is for research and informational purposes only. | |
It should not be used as a substitute for professional medical advice, diagnosis, or treatment. | |
The deception detection feature is experimental and should not be used as definitive proof | |
of truthfulness or deception.</p> | |
</div> | |
""" | |
# Tab structure | |
TAB_STRUCTURE = [ | |
("Visual Analysis", [ | |
("FACS Analysis", create_facs_analysis_tab), | |
("Heart Rate Variability", create_heart_rate_variability_tab), | |
("Truth/Deception Detection", create_deception_detection_tab) # Pass models here | |
]), | |
("Speech Analysis", [ | |
("Speech Stress", create_voice_stress_tab), | |
("Speech Emotion", create_emotion_recognition_tab) | |
]) | |
] | |
def create_demo(models: Dict[str, torch.nn.Module]): | |
"""Create and configure the Gradio interface.""" | |
with gr.Blocks(css=CUSTOM_CSS, title="Multimodal Emotional State Analysis") as demo: | |
# Header | |
gr.HTML(HEADER_HTML) | |
# Main content area with Tabs | |
with gr.Tabs(): | |
for main_tab, sub_tabs in TAB_STRUCTURE: | |
with gr.Tab(main_tab): | |
with gr.Column(): | |
with gr.Tabs(): | |
for sub_tab, create_fn in sub_tabs: | |
with gr.Tab(sub_tab): | |
if main_tab == "Visual Analysis" and sub_tab == "Truth/Deception Detection": | |
# Pass loaded models to the deception detection tab | |
create_fn(models) | |
else: | |
create_fn() | |
# Add help information below sub-tabs | |
if main_tab == "Visual Analysis": | |
gr.Markdown(""" | |
### Visual Analysis Features | |
- **FACS Analysis**: Facial Action Coding System for emotion detection | |
- **Heart Rate Variability**: Stress and wellness indicators | |
- **Truth/Deception Detection**: Physiological response analysis | |
**For best results:** | |
1. Use good lighting | |
2. Face the camera directly | |
3. Minimize movement during recording | |
""") | |
elif main_tab == "Speech Analysis": | |
gr.Markdown(""" | |
### Speech Analysis Features | |
- **Speech Stress**: Voice stress analysis | |
- **Speech Emotion**: Emotional content detection | |
**For best results:** | |
1. Use a quiet environment | |
2. Speak clearly | |
3. Avoid background noise | |
""") | |
# Disclaimer | |
gr.HTML(DISCLAIMER_HTML) | |
return demo | |
def main(): | |
"""Main function to run the application.""" | |
# Load models once and pass them to the deception detection tab | |
models_loaded = load_models() | |
if not models_loaded: | |
logger.error("No models loaded. Exiting application.") | |
return | |
# Initialize Gradio interface | |
demo = create_demo(models_loaded) | |
# Configure and launch the interface | |
demo.queue() # Enable queuing without specific concurrency count | |
demo.launch( | |
server_name="127.0.0.1", | |
server_port=7860, | |
share=True, | |
debug=True, | |
show_error=True | |
) | |
if __name__ == "__main__": | |
main() | |