Update app.py
Browse files
app.py
CHANGED
@@ -708,16 +708,16 @@ def create_interface():
|
|
708 |
return (
|
709 |
state,
|
710 |
"음성을 먼저 녹음해주세요.",
|
711 |
-
gr.update(visible=False),
|
712 |
-
gr.update(visible=False),
|
713 |
-
gr.update(visible=False),
|
714 |
-
gr.update(visible=False),
|
715 |
-
gr.update(visible=
|
716 |
-
gr.update(visible=
|
|
|
717 |
)
|
718 |
|
719 |
try:
|
720 |
-
# 1. 음성 특성 분석
|
721 |
features = calculate_baseline_features(audio)
|
722 |
if features is None:
|
723 |
return (
|
@@ -727,14 +727,13 @@ def create_interface():
|
|
727 |
gr.update(visible=False),
|
728 |
gr.update(visible=False),
|
729 |
gr.update(visible=False),
|
|
|
730 |
gr.update(visible=True),
|
731 |
gr.update(visible=False)
|
732 |
)
|
733 |
|
734 |
-
# 2. 감정 분석
|
735 |
baseline_emotion = map_acoustic_to_emotion(features)
|
736 |
|
737 |
-
# 3. 분석 결과 생성
|
738 |
voice_features_text = f"""
|
739 |
🎭 음성 특성 분석:
|
740 |
|
@@ -754,26 +753,25 @@ def create_interface():
|
|
754 |
|
755 |
analysis_text = """
|
756 |
✨ 기준 음성 분석이 완료되었습니다.
|
757 |
-
|
758 |
"""
|
759 |
|
760 |
-
# 4. 상태 업데이트
|
761 |
new_state = safe_state_update(state, {
|
762 |
"baseline_features": features,
|
763 |
"baseline_emotion": baseline_emotion,
|
764 |
"analysis_complete": True
|
765 |
})
|
766 |
|
767 |
-
# 5. 최종 결과 반환 - 여기서 entry_guide_section을 보이게 설정
|
768 |
return (
|
769 |
new_state,
|
770 |
"✅ 축원이 완료되었습니다.",
|
771 |
-
gr.update(visible=False),
|
772 |
gr.update(value=voice_features_text, visible=True), # voice_features
|
773 |
-
gr.update(value=sentiment_text, visible=True),
|
774 |
-
gr.update(value=analysis_text, visible=True),
|
775 |
-
gr.update(visible=
|
776 |
-
gr.update(visible=True)
|
|
|
777 |
)
|
778 |
|
779 |
except Exception as e:
|
@@ -785,9 +783,56 @@ def create_interface():
|
|
785 |
gr.update(visible=False),
|
786 |
gr.update(visible=False),
|
787 |
gr.update(visible=False),
|
|
|
788 |
gr.update(visible=True),
|
789 |
gr.update(visible=False)
|
790 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
791 |
|
792 |
# 4단계: 굿판 입장 안내
|
793 |
entry_guide_section = gr.Column(visible=False)
|
@@ -1056,7 +1101,21 @@ def create_interface():
|
|
1056 |
blessing_section, # 축원 섹션
|
1057 |
entry_guide_section # 가이드 섹션
|
1058 |
]
|
|
|
|
|
|
|
|
|
1059 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1060 |
enter_btn.click(
|
1061 |
fn=handle_enter,
|
1062 |
outputs=[tabs]
|
|
|
708 |
return (
|
709 |
state,
|
710 |
"음성을 먼저 녹음해주세요.",
|
711 |
+
gr.update(visible=False), # loading_icon
|
712 |
+
gr.update(visible=False), # voice_features
|
713 |
+
gr.update(visible=False), # text_sentiment
|
714 |
+
gr.update(visible=False), # analysis_result
|
715 |
+
gr.update(visible=False), # next_button
|
716 |
+
gr.update(visible=True), # blessing_section
|
717 |
+
gr.update(visible=False) # entry_guide_section
|
718 |
)
|
719 |
|
720 |
try:
|
|
|
721 |
features = calculate_baseline_features(audio)
|
722 |
if features is None:
|
723 |
return (
|
|
|
727 |
gr.update(visible=False),
|
728 |
gr.update(visible=False),
|
729 |
gr.update(visible=False),
|
730 |
+
gr.update(visible=False),
|
731 |
gr.update(visible=True),
|
732 |
gr.update(visible=False)
|
733 |
)
|
734 |
|
|
|
735 |
baseline_emotion = map_acoustic_to_emotion(features)
|
736 |
|
|
|
737 |
voice_features_text = f"""
|
738 |
🎭 음성 특성 분석:
|
739 |
|
|
|
753 |
|
754 |
analysis_text = """
|
755 |
✨ 기준 음성 분석이 완료되었습니다.
|
756 |
+
결과를 확인하신 후 아래의 '다음 단계로' 버튼을 눌러주세요.
|
757 |
"""
|
758 |
|
|
|
759 |
new_state = safe_state_update(state, {
|
760 |
"baseline_features": features,
|
761 |
"baseline_emotion": baseline_emotion,
|
762 |
"analysis_complete": True
|
763 |
})
|
764 |
|
|
|
765 |
return (
|
766 |
new_state,
|
767 |
"✅ 축원이 완료되었습니다.",
|
768 |
+
gr.update(visible=False), # loading_icon
|
769 |
gr.update(value=voice_features_text, visible=True), # voice_features
|
770 |
+
gr.update(value=sentiment_text, visible=True), # text_sentiment
|
771 |
+
gr.update(value=analysis_text, visible=True), # analysis_result
|
772 |
+
gr.update(visible=True), # next_button
|
773 |
+
gr.update(visible=True), # blessing_section
|
774 |
+
gr.update(visible=False) # entry_guide_section
|
775 |
)
|
776 |
|
777 |
except Exception as e:
|
|
|
783 |
gr.update(visible=False),
|
784 |
gr.update(visible=False),
|
785 |
gr.update(visible=False),
|
786 |
+
gr.update(visible=False),
|
787 |
gr.update(visible=True),
|
788 |
gr.update(visible=False)
|
789 |
)
|
790 |
+
|
791 |
+
def next_section():
|
792 |
+
return (
|
793 |
+
gr.update(visible=False), # blessing_section
|
794 |
+
gr.update(visible=True) # entry_guide_section
|
795 |
+
)
|
796 |
+
|
797 |
+
# UI 구성
|
798 |
+
blessing_section = gr.Column(visible=False)
|
799 |
+
with blessing_section:
|
800 |
+
gr.Markdown("### 축원의식을 시작하겠습니다")
|
801 |
+
gr.Markdown("'명짐 복짐 짊어지고 안가태평하시기를 비도발원 축원 드립니다'")
|
802 |
+
with gr.Column() as recording_section:
|
803 |
+
baseline_audio = gr.Audio(
|
804 |
+
label="축원 문장 녹음하기",
|
805 |
+
sources=["microphone"],
|
806 |
+
type="numpy",
|
807 |
+
streaming=False
|
808 |
+
)
|
809 |
+
|
810 |
+
with gr.Column() as action_section:
|
811 |
+
set_baseline_btn = gr.Button("축원 마치기", variant="primary")
|
812 |
+
|
813 |
+
# 분석 상태와 결과를 보여주는 섹션
|
814 |
+
analysis_status = gr.Markdown("")
|
815 |
+
loading_icon = gr.HTML("""
|
816 |
+
<div style="display:flex;justify-content:center;align-items:center;height:50px;overflow:hidden;">
|
817 |
+
<div class="loader" style="width:30px;height:30px;"></div>
|
818 |
+
</div>
|
819 |
+
""")
|
820 |
+
voice_features = gr.Textbox(
|
821 |
+
label="음성 특성 분석",
|
822 |
+
interactive=False,
|
823 |
+
visible=False
|
824 |
+
)
|
825 |
+
text_sentiment = gr.Textbox(
|
826 |
+
label="기본 감정 상태",
|
827 |
+
interactive=False,
|
828 |
+
visible=False
|
829 |
+
)
|
830 |
+
analysis_result = gr.Markdown(visible=False)
|
831 |
+
next_button = gr.Button(
|
832 |
+
"다음 단계로",
|
833 |
+
variant="primary",
|
834 |
+
visible=False # 초기에는 숨김
|
835 |
+
)
|
836 |
|
837 |
# 4단계: 굿판 입장 안내
|
838 |
entry_guide_section = gr.Column(visible=False)
|
|
|
1101 |
blessing_section, # 축원 섹션
|
1102 |
entry_guide_section # 가이드 섹션
|
1103 |
]
|
1104 |
+
).then( # 분석 완료 후 '다음으로' 버튼 표시
|
1105 |
+
lambda: gr.update(visible=True),
|
1106 |
+
None,
|
1107 |
+
[next_step_btn]
|
1108 |
)
|
1109 |
+
|
1110 |
+
# 새로운 버튼에 대한 이벤트 연결
|
1111 |
+
next_step_btn.click(
|
1112 |
+
fn=proceed_to_next_step,
|
1113 |
+
outputs=[
|
1114 |
+
blessing_section,
|
1115 |
+
entry_guide_section
|
1116 |
+
]
|
1117 |
+
)
|
1118 |
+
|
1119 |
enter_btn.click(
|
1120 |
fn=handle_enter,
|
1121 |
outputs=[tabs]
|