File size: 7,318 Bytes
b8a7acb
 
 
 
a26ac7e
8505717
cda260d
b8a7acb
 
 
 
 
3670697
c114fac
 
119b8cd
c114fac
 
 
3670697
c114fac
 
 
 
4855721
c114fac
 
75ea1cc
445cb9a
 
 
 
 
 
 
c114fac
f68ad9e
c114fac
 
 
6e6e483
5af67d4
ac6aba3
1452771
1b7ed19
b24d4f6
 
 
 
 
b02a7f6
edd1c74
 
 
 
b8d86cc
bd3fdf2
6d1f344
edd1c74
fa86929
4d96b3f
edd1c74
6d1f344
edd1c74
6d1f344
 
 
4d96b3f
6d1f344
 
 
 
edd1c74
 
4d96b3f
6d1f344
edd1c74
6d1f344
 
 
edd1c74
6d1f344
4d96b3f
edd1c74
6d1f344
76a5ff8
6d1f344
76a5ff8
 
b02a7f6
bd3fdf2
 
 
6d1f344
875db1b
e77657a
6d1f344
1e7c569
 
 
6d1f344
2078afe
f5aef4c
 
6d1f344
336fe2c
 
 
 
 
 
 
f5aef4c
7aada44
6062e5c
 
 
ac6aba3
 
0e007bd
a14dda6
1b7ed19
 
bd3fdf2
f8d6a23
6d1f344
81738fe
a14dda6
 
6d1f344
c0fce84
6d1f344
 
 
 
 
c0fce84
81738fe
a14dda6
 
6d1f344
c0fce84
81738fe
a14dda6
 
6d1f344
366bcd5
6d1f344
366bcd5
 
b24d4f6
b02a7f6
 
 
 
 
 
 
 
336fe2c
2f5d69d
6bbaa62
f6b2216
336fe2c
 
b02a7f6
e541f17
 
 
 
b02a7f6
 
 
 
 
e541f17
466cd11
9ba8687
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
import gradio as gr
from llm_loader import load_model
from processing import process_input
from transcription_diarization import diarize_audio
from visualization import create_charts
import time
import re
from config import openai_api_key

# Load the model
llm = load_model(openai_api_key)

def analyze_video(video_path, progress=gr.Progress()):
    start_time = time.time()
    if not video_path:
        return [None] * 29  # Return None for all outputs

    progress(0, desc="Starting analysis...")
    progress(0.2, desc="Starting transcription and diarization")
    transcription = diarize_audio(video_path)
    progress(0.5, desc="Transcription and diarization complete.")

    progress(0.6, desc="Processing transcription")
    results = process_input(transcription, llm)
    progress(0.7, desc="Transcription processing complete.")

    progress(0.9, desc="Generating charts")
    charts, explanations, general_impressions = create_charts(results)
    
    # Assuming speaker_general_impression is already defined
    speaker_general_impression_str = str(general_impressions)
    # Remove quotation marks
    general_impressions = speaker_general_impression_str.replace('"', '')
    print(general_impressions)

    progress(1.0, desc="Charts generation complete.")
    
    end_time = time.time()
    execution_time = end_time - start_time

    output_components = []  # transcript

    output_components.append(f"Completed in {int(execution_time)} seconds.")
    output_components.append(gr.Textbox(value=transcription, label="Transcript", lines=10, visible=True))

    with gr.Tab(label=f'Description', visible=False):
        gr.Markdown(description_txt)
        gr.HTML("<div style='height: 20px;'></div>")
        gr.Image(value="appendix/AI Personality Detection flow - 1.png", label='Flowchart 1', width=1000)
        gr.Image(value="appendix/AI Personality Detection flow - 2.png", label='Flowchart 2', width=1000)

    for i, (speaker_id, speaker_charts) in enumerate(charts.items(), start=1):
        print(speaker_id)
        speaker_explanations = explanations[speaker_id]
        speaker_general_impression = general_impressions[speaker_id]
        
        with gr.Tab():
            with gr.TabItem(label=f'General Impression'):
                speaker_section1 = [
                    gr.Markdown(f"### {speaker_id}", visible=True),
                    gr.Textbox(value=speaker_general_impression, label="General Impression", visible=True)
                ]

            with gr.TabItem(label=f'Attachment Styles'):
                speaker_section2 = [
                    gr.Plot(value=speaker_charts.get("attachment", None), visible=True),
                    gr.Plot(value=speaker_charts.get("dimensions", None), visible=True),
                    gr.Textbox(value=speaker_explanations.get("attachment", ""), label="Attachment Styles Explanation",
                               visible=True)
                ]

            with gr.TabItem(label=f'Big Five Traits'):
                speaker_section3 = [
                    gr.Plot(value=speaker_charts.get("bigfive", None), visible=True),
                    gr.Textbox(value=speaker_explanations.get("bigfive", ""), label="Big Five Traits Explanation",
                               visible=True)
                ]

            with gr.TabItem(label=f'Personalities'):
                speaker_section4 = [
                    gr.Plot(value=speaker_charts.get("personality", None), visible=True),
                    gr.Textbox(value=speaker_explanations.get("personality", ""),
                               label="Personality Disorders Explanation", visible=True)
                ]

        output_components.extend(speaker_section1)
        output_components.extend(speaker_section2)
        output_components.extend(speaker_section3)
        output_components.extend(speaker_section4)

    # Pad with None for any missing speakers
    while len(output_components) < 28:
        output_components.extend([gr.update(visible=False)] * 9)

    return output_components


def use_example():
    return "examples/Scenes.From.A.Marriage.US.mp4"


with gr.Blocks() as iface:
    gr.Markdown("# Multiple-Speakers-Personality-Analyzer")
    gr.Markdown("This project provides an advanced AI system designed for diagnosing and profiling personality attributes from video content based on a single speaker or multiple speakers in a conversation.")

    with gr.Row():
        with gr.Column(scale=3):
            video_input = gr.Video(label="Upload Video")
            analyze_button = gr.Button("Analyze")
        with gr.Column(scale=1):
            gr.Markdown("Example Video")
            example_video = gr.Video("examples/Scenes.From.A.Marriage.US.mp4", label="Example Video")
            use_example_button = gr.Button("Load Example")

    # Create output components
    output_components = []
    # Add transcript output near the top
    execution_box = gr.Textbox(label="Execution Info", value="N/A", lines=1)
    output_components.append(execution_box)

    transcript = gr.Textbox(label="Transcript", lines=10, visible=False)
    output_components.append(transcript)

    for n in range(3):  # Assuming maximum of 3 speakers
        with gr.Tab(label=f'Speaker {n + 1}', visible=True):
            with gr.TabItem(label=f'General Impression'):
                column_components1 = [
                    gr.Markdown(visible=False),
                    gr.Textbox(label="General Impression", visible=False)]

            with gr.TabItem(label=f'Attachment Styles'):
                column_components2 = [
                    gr.Plot(visible=False),
                    gr.Plot(visible=False),
                    gr.Textbox(label="Attachment Styles Explanation", visible=False)]

            with gr.TabItem(label=f'Big Five Traits'):
                column_components3 = [
                    gr.Plot(visible=False),
                    gr.Textbox(label="Big Five Traits Explanation", visible=False)]

            with gr.TabItem(label=f'Personalities'):
                column_components4 = [
                    gr.Plot(visible=False),
                    gr.Textbox(label="Personality Disorders Explanation", visible=False)]

        output_components.extend(column_components1)
        output_components.extend(column_components2)
        output_components.extend(column_components3)
        output_components.extend(column_components4)

    with open('description.txt', 'r') as file:
        description_txt = file.read()
    with gr.Tab(label=f'Description', visible=True):
        gr.Markdown(description_txt)
        gr.HTML("<div style='height: 20px;'></div>")
        gr.Image(value="appendix/AI Personality Detection flow - 1.png", label='Flowchart 1', width=1000)
        gr.Image(value="appendix/AI Personality Detection flow - 2.png", label='Flowchart 2', width=1000)
        
    analyze_button.click(
        fn=analyze_video,
        inputs=[video_input],
        outputs=output_components,
        show_progress=True
    )

    use_example_button.click(
        fn=use_example,
        inputs=[],
        outputs=[video_input],
    ).then(fn=analyze_video,
           inputs=[video_input],
           outputs=output_components,
           show_progress=True
           )

if __name__ == "__main__":
    iface.launch()