Update app.py
Browse files
app.py
CHANGED
@@ -97,24 +97,25 @@ os.makedirs("generated_images", exist_ok=True)
|
|
97 |
|
98 |
# 음성 분석 관련 함수들
|
99 |
def calculate_baseline_features(audio_data):
|
100 |
-
"""기준점 음성 특성 분석"""
|
101 |
try:
|
102 |
if isinstance(audio_data, tuple):
|
103 |
sr, y = audio_data
|
|
|
|
|
104 |
elif isinstance(audio_data, str):
|
105 |
y, sr = librosa.load(audio_data, sr=16000)
|
106 |
else:
|
107 |
print("Unsupported audio format")
|
108 |
return None
|
109 |
|
110 |
-
# 음성이 없는 경우 처리
|
111 |
if len(y) == 0:
|
112 |
print("Empty audio data")
|
113 |
return None
|
114 |
|
115 |
features = {
|
116 |
"energy": float(np.mean(librosa.feature.rms(y=y))),
|
117 |
-
|
|
|
118 |
"pitch": float(np.mean(librosa.feature.zero_crossing_rate(y=y))),
|
119 |
"volume": float(np.mean(np.abs(y))),
|
120 |
"mfcc": librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13).mean(axis=1).tolist()
|
@@ -205,13 +206,13 @@ def map_acoustic_to_emotion(features, baseline_features=None):
|
|
205 |
return emotions
|
206 |
|
207 |
def analyze_voice(audio_data, state):
|
208 |
-
"""통합 음성 분석"""
|
209 |
if audio_data is None:
|
210 |
return state, "음성을 먼저 녹음해주세요.", "", "", ""
|
211 |
|
212 |
try:
|
213 |
-
|
214 |
-
|
|
|
215 |
|
216 |
if len(y) == 0:
|
217 |
return state, "음성이 감지되지 않았습니다.", "", "", ""
|
@@ -219,11 +220,12 @@ def analyze_voice(audio_data, state):
|
|
219 |
# 음향학적 특성 분석
|
220 |
acoustic_features = {
|
221 |
"energy": float(np.mean(librosa.feature.rms(y=y))),
|
222 |
-
"tempo": float(librosa.
|
223 |
"pitch": float(np.mean(librosa.feature.zero_crossing_rate(y=y))),
|
224 |
"volume": float(np.mean(np.abs(y)))
|
225 |
}
|
226 |
|
|
|
227 |
# 음성 인식
|
228 |
if speech_recognizer:
|
229 |
try:
|
@@ -401,7 +403,8 @@ def create_interface():
|
|
401 |
label="축원 문장 녹음하기",
|
402 |
sources=["microphone"],
|
403 |
type="numpy",
|
404 |
-
streaming=False
|
|
|
405 |
)
|
406 |
set_baseline_btn = gr.Button("기준점 설정 완료", variant="primary")
|
407 |
baseline_status = gr.Markdown("")
|
@@ -441,7 +444,8 @@ def create_interface():
|
|
441 |
label="소원을 나누고 싶은 마음을 말해주세요",
|
442 |
sources=["microphone"],
|
443 |
type="numpy",
|
444 |
-
streaming=False
|
|
|
445 |
)
|
446 |
with gr.Row():
|
447 |
clear_btn = gr.Button("녹음 지우기", variant="secondary")
|
@@ -515,6 +519,7 @@ def create_interface():
|
|
515 |
|
516 |
try:
|
517 |
sr, y = audio
|
|
|
518 |
features = calculate_baseline_features((sr, y))
|
519 |
if features:
|
520 |
current_state = {**current_state, "baseline_features": features}
|
@@ -634,6 +639,7 @@ if __name__ == "__main__":
|
|
634 |
demo = create_interface()
|
635 |
demo.launch(
|
636 |
debug=True,
|
|
|
637 |
server_name="0.0.0.0",
|
638 |
server_port=7860
|
639 |
)
|
|
|
97 |
|
98 |
# 음성 분석 관련 함수들
|
99 |
def calculate_baseline_features(audio_data):
|
|
|
100 |
try:
|
101 |
if isinstance(audio_data, tuple):
|
102 |
sr, y = audio_data
|
103 |
+
# 데이터 타입을 float32로 변환
|
104 |
+
y = y.astype(np.float32)
|
105 |
elif isinstance(audio_data, str):
|
106 |
y, sr = librosa.load(audio_data, sr=16000)
|
107 |
else:
|
108 |
print("Unsupported audio format")
|
109 |
return None
|
110 |
|
|
|
111 |
if len(y) == 0:
|
112 |
print("Empty audio data")
|
113 |
return None
|
114 |
|
115 |
features = {
|
116 |
"energy": float(np.mean(librosa.feature.rms(y=y))),
|
117 |
+
# tempo 함수 업데이트
|
118 |
+
"tempo": float(librosa.feature.tempo(y=y, sr=sr)[0]),
|
119 |
"pitch": float(np.mean(librosa.feature.zero_crossing_rate(y=y))),
|
120 |
"volume": float(np.mean(np.abs(y))),
|
121 |
"mfcc": librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13).mean(axis=1).tolist()
|
|
|
206 |
return emotions
|
207 |
|
208 |
def analyze_voice(audio_data, state):
|
|
|
209 |
if audio_data is None:
|
210 |
return state, "음성을 먼저 녹음해주세요.", "", "", ""
|
211 |
|
212 |
try:
|
213 |
+
sr, y = audio_data
|
214 |
+
# 데이터 타입을 float32로 변환
|
215 |
+
y = y.astype(np.float32)
|
216 |
|
217 |
if len(y) == 0:
|
218 |
return state, "음성이 감지되지 않았습니다.", "", "", ""
|
|
|
220 |
# 음향학적 특성 분석
|
221 |
acoustic_features = {
|
222 |
"energy": float(np.mean(librosa.feature.rms(y=y))),
|
223 |
+
"tempo": float(librosa.feature.tempo(y=y, sr=sr)[0]),
|
224 |
"pitch": float(np.mean(librosa.feature.zero_crossing_rate(y=y))),
|
225 |
"volume": float(np.mean(np.abs(y)))
|
226 |
}
|
227 |
|
228 |
+
|
229 |
# 음성 인식
|
230 |
if speech_recognizer:
|
231 |
try:
|
|
|
403 |
label="축원 문장 녹음하기",
|
404 |
sources=["microphone"],
|
405 |
type="numpy",
|
406 |
+
streaming=False,
|
407 |
+
preload=True # 추가
|
408 |
)
|
409 |
set_baseline_btn = gr.Button("기준점 설정 완료", variant="primary")
|
410 |
baseline_status = gr.Markdown("")
|
|
|
444 |
label="소원을 나누고 싶은 마음을 말해주세요",
|
445 |
sources=["microphone"],
|
446 |
type="numpy",
|
447 |
+
streaming=False,
|
448 |
+
preload=True # 추가
|
449 |
)
|
450 |
with gr.Row():
|
451 |
clear_btn = gr.Button("녹음 지우기", variant="secondary")
|
|
|
519 |
|
520 |
try:
|
521 |
sr, y = audio
|
522 |
+
y = y.astype(np.float32) # float32로 변환
|
523 |
features = calculate_baseline_features((sr, y))
|
524 |
if features:
|
525 |
current_state = {**current_state, "baseline_features": features}
|
|
|
639 |
demo = create_interface()
|
640 |
demo.launch(
|
641 |
debug=True,
|
642 |
+
share=True, # 추가
|
643 |
server_name="0.0.0.0",
|
644 |
server_port=7860
|
645 |
)
|