Update ui/tabs.py
Browse files- ui/tabs.py +43 -22
ui/tabs.py
CHANGED
|
@@ -266,21 +266,22 @@ def create_streaming_voice_tab(streaming_service: StreamingVoiceService):
|
|
| 266 |
autoplay=True
|
| 267 |
)
|
| 268 |
|
| 269 |
-
# Biến để lưu kết quả từ VAD
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
'status': 'waiting'
|
| 275 |
-
})
|
| 276 |
|
| 277 |
def start_vad():
|
| 278 |
"""Bắt đầu VAD listening"""
|
| 279 |
def vad_callback(result):
|
| 280 |
"""Callback khi VAD phát hiện speech"""
|
| 281 |
-
#
|
| 282 |
-
|
| 283 |
-
|
|
|
|
|
|
|
|
|
|
| 284 |
|
| 285 |
success = streaming_service.start_listening(vad_callback)
|
| 286 |
status = "✅ Đang lắng nghe với VAD..." if success else "❌ Lỗi khởi động VAD"
|
|
@@ -299,7 +300,6 @@ def create_streaming_voice_tab(streaming_service: StreamingVoiceService):
|
|
| 299 |
return "❌ Không có âm thanh", "Vui lòng nói lại", None, "Đang chờ...", {}
|
| 300 |
|
| 301 |
try:
|
| 302 |
-
# SỬA LỖI: Gọi đúng phương thức
|
| 303 |
result = streaming_service.process_streaming_audio(audio_data)
|
| 304 |
state = streaming_service.get_conversation_state()
|
| 305 |
status = "✅ Đã xử lý manual audio"
|
|
@@ -312,15 +312,30 @@ def create_streaming_voice_tab(streaming_service: StreamingVoiceService):
|
|
| 312 |
"""Xóa hội thoại"""
|
| 313 |
streaming_service.clear_conversation()
|
| 314 |
state = streaming_service.get_conversation_state()
|
|
|
|
|
|
|
|
|
|
|
|
|
| 315 |
return "", "", None, "🗑️ Đã xóa hội thoại", state
|
| 316 |
|
| 317 |
-
def
|
| 318 |
-
"""
|
| 319 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 320 |
state = streaming_service.get_conversation_state()
|
| 321 |
-
return
|
| 322 |
|
| 323 |
-
# Event handlers
|
| 324 |
start_vad_btn.click(
|
| 325 |
start_vad,
|
| 326 |
outputs=[status_display, state_display]
|
|
@@ -331,7 +346,6 @@ def create_streaming_voice_tab(streaming_service: StreamingVoiceService):
|
|
| 331 |
outputs=[status_display, state_display]
|
| 332 |
)
|
| 333 |
|
| 334 |
-
# SỬA LỖI: Sử dụng đúng phương thức stream
|
| 335 |
microphone.stream(
|
| 336 |
process_manual_audio,
|
| 337 |
inputs=[microphone],
|
|
@@ -343,13 +357,20 @@ def create_streaming_voice_tab(streaming_service: StreamingVoiceService):
|
|
| 343 |
outputs=[realtime_transcription, ai_response, tts_output, status_display, state_display]
|
| 344 |
)
|
| 345 |
|
| 346 |
-
#
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
|
|
|
| 350 |
outputs=[realtime_transcription, ai_response, tts_output, status_display, state_display]
|
| 351 |
)
|
| 352 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 353 |
|
| 354 |
return streaming_tab
|
| 355 |
def create_image_tab(image_service: ImageService):
|
|
|
|
| 266 |
autoplay=True
|
| 267 |
)
|
| 268 |
|
| 269 |
+
# Biến state để lưu kết quả từ VAD
|
| 270 |
+
vad_transcription = gr.State(value="")
|
| 271 |
+
vad_response = gr.State(value="")
|
| 272 |
+
vad_audio = gr.State(value=None)
|
| 273 |
+
vad_status = gr.State(value="waiting")
|
|
|
|
|
|
|
| 274 |
|
| 275 |
def start_vad():
|
| 276 |
"""Bắt đầu VAD listening"""
|
| 277 |
def vad_callback(result):
|
| 278 |
"""Callback khi VAD phát hiện speech"""
|
| 279 |
+
# Cập nhật state với kết quả mới
|
| 280 |
+
vad_transcription.value = result.get('transcription', '')
|
| 281 |
+
vad_response.value = result.get('response', '')
|
| 282 |
+
vad_audio.value = result.get('tts_audio', None)
|
| 283 |
+
vad_status.value = result.get('status', 'completed')
|
| 284 |
+
print(f"VAD Callback: {result.get('transcription', '')}")
|
| 285 |
|
| 286 |
success = streaming_service.start_listening(vad_callback)
|
| 287 |
status = "✅ Đang lắng nghe với VAD..." if success else "❌ Lỗi khởi động VAD"
|
|
|
|
| 300 |
return "❌ Không có âm thanh", "Vui lòng nói lại", None, "Đang chờ...", {}
|
| 301 |
|
| 302 |
try:
|
|
|
|
| 303 |
result = streaming_service.process_streaming_audio(audio_data)
|
| 304 |
state = streaming_service.get_conversation_state()
|
| 305 |
status = "✅ Đã xử lý manual audio"
|
|
|
|
| 312 |
"""Xóa hội thoại"""
|
| 313 |
streaming_service.clear_conversation()
|
| 314 |
state = streaming_service.get_conversation_state()
|
| 315 |
+
# Reset các state
|
| 316 |
+
vad_transcription.value = ""
|
| 317 |
+
vad_response.value = ""
|
| 318 |
+
vad_audio.value = None
|
| 319 |
return "", "", None, "🗑️ Đã xóa hội thoại", state
|
| 320 |
|
| 321 |
+
def get_vad_results():
|
| 322 |
+
"""Lấy kết quả từ VAD và cập nhật UI"""
|
| 323 |
+
if vad_status.value == "completed":
|
| 324 |
+
# Reset status sau khi lấy kết quả
|
| 325 |
+
vad_status.value = "waiting"
|
| 326 |
+
state = streaming_service.get_conversation_state()
|
| 327 |
+
return (vad_transcription.value, vad_response.value, vad_audio.value,
|
| 328 |
+
"✅ VAD đã xử lý", state)
|
| 329 |
+
else:
|
| 330 |
+
# Không có kết quả mới, trả về None để không cập nhật
|
| 331 |
+
return gr.skip(), gr.skip(), gr.skip(), gr.skip(), gr.skip()
|
| 332 |
+
|
| 333 |
+
def refresh_state():
|
| 334 |
+
"""Chỉ cập nhật state display"""
|
| 335 |
state = streaming_service.get_conversation_state()
|
| 336 |
+
return state
|
| 337 |
|
| 338 |
+
# Event handlers chính
|
| 339 |
start_vad_btn.click(
|
| 340 |
start_vad,
|
| 341 |
outputs=[status_display, state_display]
|
|
|
|
| 346 |
outputs=[status_display, state_display]
|
| 347 |
)
|
| 348 |
|
|
|
|
| 349 |
microphone.stream(
|
| 350 |
process_manual_audio,
|
| 351 |
inputs=[microphone],
|
|
|
|
| 357 |
outputs=[realtime_transcription, ai_response, tts_output, status_display, state_display]
|
| 358 |
)
|
| 359 |
|
| 360 |
+
# Nút refresh để cập nhật kết quả VAD thủ công
|
| 361 |
+
refresh_btn = gr.Button("🔄 Kiểm tra kết quả VAD", variant="secondary", visible=False)
|
| 362 |
+
|
| 363 |
+
refresh_btn.click(
|
| 364 |
+
get_vad_results,
|
| 365 |
outputs=[realtime_transcription, ai_response, tts_output, status_display, state_display]
|
| 366 |
)
|
| 367 |
+
|
| 368 |
+
# Tự động cập nhật state display mỗi 2 giây
|
| 369 |
+
streaming_tab.load(
|
| 370 |
+
refresh_state,
|
| 371 |
+
outputs=[state_display],
|
| 372 |
+
every=2
|
| 373 |
+
)
|
| 374 |
|
| 375 |
return streaming_tab
|
| 376 |
def create_image_tab(image_service: ImageService):
|