Update app.py
Browse files
app.py
CHANGED
@@ -859,9 +859,27 @@ def create_interface():
|
|
859 |
margin: 10px 0 !important;
|
860 |
}
|
861 |
|
862 |
-
.blessing-status-box
|
863 |
-
|
864 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
865 |
}
|
866 |
"""
|
867 |
|
@@ -898,9 +916,13 @@ def create_interface():
|
|
898 |
|
899 |
# 3단계: 축원 의식
|
900 |
blessing_section = gr.Column(visible=False)
|
|
|
901 |
with blessing_section:
|
902 |
gr.Markdown("### 축원의식을 시작하겠습니다")
|
903 |
-
gr.Markdown("
|
|
|
|
|
|
|
904 |
|
905 |
# 축원 문장 녹음하기
|
906 |
baseline_audio = gr.Audio(
|
@@ -910,16 +932,17 @@ def create_interface():
|
|
910 |
streaming=False
|
911 |
)
|
912 |
|
913 |
-
#
|
914 |
blessing_status = gr.Markdown(
|
915 |
-
"
|
916 |
elem_id="blessing-status",
|
917 |
elem_classes="blessing-status-box"
|
918 |
)
|
919 |
|
920 |
-
#
|
921 |
set_baseline_btn = gr.Button("축원문 분석하기", variant="primary")
|
922 |
-
|
|
|
923 |
|
924 |
|
925 |
# 4단계: 굿판 입장 안내
|
@@ -1148,23 +1171,55 @@ def create_interface():
|
|
1148 |
|
1149 |
def handle_blessing_complete(audio, state):
|
1150 |
if audio is None:
|
1151 |
-
return
|
1152 |
-
|
|
|
|
|
|
|
|
|
|
|
1153 |
try:
|
1154 |
-
status_msg = "
|
1155 |
sr, y = audio
|
1156 |
features = calculate_baseline_features((sr, y))
|
1157 |
|
1158 |
if features:
|
1159 |
state = safe_state_update(state, {"baseline_features": features})
|
1160 |
-
|
1161 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1162 |
|
1163 |
-
return state, "분석에 실패했습니다. 다시 시도해주세요.", gr.update(visible=True), gr.update(visible=False)
|
1164 |
-
|
1165 |
except Exception as e:
|
1166 |
-
return
|
1167 |
-
|
|
|
|
|
|
|
|
|
|
|
1168 |
def handle_enter():
|
1169 |
return gr.update(selected=1) # 청신 탭으로 이동
|
1170 |
|
@@ -1326,7 +1381,17 @@ def create_interface():
|
|
1326 |
set_baseline_btn.click(
|
1327 |
fn=handle_blessing_complete,
|
1328 |
inputs=[baseline_audio, state],
|
1329 |
-
outputs=[
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1330 |
)
|
1331 |
|
1332 |
enter_btn.click(
|
|
|
859 |
margin: 10px 0 !important;
|
860 |
}
|
861 |
|
862 |
+
.blessing-status-box {
|
863 |
+
min-height: 250px !important;
|
864 |
+
max-height: 400px !important;
|
865 |
+
overflow-y: auto !important;
|
866 |
+
padding: 20px !important;
|
867 |
+
border: 1px solid #ddd !important;
|
868 |
+
border-radius: 12px !important;
|
869 |
+
background-color: #f8f9fa !important;
|
870 |
+
margin: 15px 0 !important;
|
871 |
+
font-size: 16px !important;
|
872 |
+
line-height: 1.6 !important;
|
873 |
+
}
|
874 |
+
|
875 |
+
.blessing-status-box h3 {
|
876 |
+
color: #2a5d8f !important;
|
877 |
+
margin-bottom: 15px !important;
|
878 |
+
}
|
879 |
+
|
880 |
+
.blessing-status-box strong {
|
881 |
+
color: #4a90e2 !important;
|
882 |
+
}
|
883 |
}
|
884 |
"""
|
885 |
|
|
|
916 |
|
917 |
# 3단계: 축원 의식
|
918 |
blessing_section = gr.Column(visible=False)
|
919 |
+
blessing_section = gr.Column(visible=False)
|
920 |
with blessing_section:
|
921 |
gr.Markdown("### 축원의식을 시작하겠습니다")
|
922 |
+
gr.Markdown("""
|
923 |
+
축원 문장을 읽어주세요:
|
924 |
+
'명짐 복짐 짊어지고 안가태평하시기를 비도발원 축원 드립니다'
|
925 |
+
""")
|
926 |
|
927 |
# 축원 문장 녹음하기
|
928 |
baseline_audio = gr.Audio(
|
|
|
932 |
streaming=False
|
933 |
)
|
934 |
|
935 |
+
# 상태 표시창 수정
|
936 |
blessing_status = gr.Markdown(
|
937 |
+
value="축원 문장을 녹음한 후 분석하기 버튼을 눌러주세요.",
|
938 |
elem_id="blessing-status",
|
939 |
elem_classes="blessing-status-box"
|
940 |
)
|
941 |
|
942 |
+
# 분석 버튼과 진행 버튼 분리
|
943 |
set_baseline_btn = gr.Button("축원문 분석하기", variant="primary")
|
944 |
+
analysis_complete = gr.Markdown(visible=False) # 분석 완료 상태 표시
|
945 |
+
continue_to_next = gr.Button("청신 의식 시작하기", variant="primary", visible=False)
|
946 |
|
947 |
|
948 |
# 4단계: 굿판 입장 안내
|
|
|
1171 |
|
1172 |
def handle_blessing_complete(audio, state):
|
1173 |
if audio is None:
|
1174 |
+
return (
|
1175 |
+
state,
|
1176 |
+
"음성을 먼저 녹음해주세요.",
|
1177 |
+
gr.update(visible=False), # analysis_complete
|
1178 |
+
gr.update(visible=False) # continue_to_next
|
1179 |
+
)
|
1180 |
+
|
1181 |
try:
|
1182 |
+
status_msg = "축원문을 분석중입니다..."
|
1183 |
sr, y = audio
|
1184 |
features = calculate_baseline_features((sr, y))
|
1185 |
|
1186 |
if features:
|
1187 |
state = safe_state_update(state, {"baseline_features": features})
|
1188 |
+
detailed_msg = f"""
|
1189 |
+
### 축원 분석이 완료되었습니다
|
1190 |
+
|
1191 |
+
**음성 특성 분석:**
|
1192 |
+
- 음성 강도: {features['energy']:.2f}
|
1193 |
+
- 음성 속도: {features['tempo']:.2f}
|
1194 |
+
- 음성 높낮이: {features['pitch']:.2f}
|
1195 |
+
- 음성 크기: {features['volume']:.2f}
|
1196 |
+
|
1197 |
+
이제 청신 의식을 시작할 준비가 되었습니다.
|
1198 |
+
아래 '청신 의식 시작하기' 버튼을 눌러 다음 단계로 진행해주세요.
|
1199 |
+
"""
|
1200 |
+
|
1201 |
+
return (
|
1202 |
+
state,
|
1203 |
+
detailed_msg,
|
1204 |
+
gr.update(visible=True, value="분석 완료"), # analysis_complete
|
1205 |
+
gr.update(visible=True) # continue_to_next
|
1206 |
+
)
|
1207 |
+
|
1208 |
+
return (
|
1209 |
+
state,
|
1210 |
+
"분석에 실패했습니다. 다��� 시도해주세요.",
|
1211 |
+
gr.update(visible=False),
|
1212 |
+
gr.update(visible=False)
|
1213 |
+
)
|
1214 |
|
|
|
|
|
1215 |
except Exception as e:
|
1216 |
+
return (
|
1217 |
+
state,
|
1218 |
+
f"오류가 발생했습니다: {str(e)}",
|
1219 |
+
gr.update(visible=False),
|
1220 |
+
gr.update(visible=False)
|
1221 |
+
)
|
1222 |
+
|
1223 |
def handle_enter():
|
1224 |
return gr.update(selected=1) # 청신 탭으로 이동
|
1225 |
|
|
|
1381 |
set_baseline_btn.click(
|
1382 |
fn=handle_blessing_complete,
|
1383 |
inputs=[baseline_audio, state],
|
1384 |
+
outputs=[
|
1385 |
+
state,
|
1386 |
+
blessing_status,
|
1387 |
+
analysis_complete,
|
1388 |
+
continue_to_next
|
1389 |
+
]
|
1390 |
+
)
|
1391 |
+
|
1392 |
+
continue_to_next.click(
|
1393 |
+
fn=lambda: (gr.update(selected=1)),
|
1394 |
+
outputs=[tabs]
|
1395 |
)
|
1396 |
|
1397 |
enter_btn.click(
|