Update ui/tabs.py
Browse files- ui/tabs.py +25 -2
ui/tabs.py
CHANGED
|
@@ -266,12 +266,20 @@ def create_streaming_voice_tab(streaming_service: StreamingVoiceService):
|
|
| 266 |
autoplay=True
|
| 267 |
)
|
| 268 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 269 |
def start_vad():
|
| 270 |
"""Bắt đầu VAD listening"""
|
| 271 |
def vad_callback(result):
|
| 272 |
"""Callback khi VAD phát hiện speech"""
|
| 273 |
-
#
|
| 274 |
-
|
| 275 |
print(f"VAD Result: {result}")
|
| 276 |
|
| 277 |
success = streaming_service.start_listening(vad_callback)
|
|
@@ -291,6 +299,7 @@ def create_streaming_voice_tab(streaming_service: StreamingVoiceService):
|
|
| 291 |
return "❌ Không có âm thanh", "Vui lòng nói lại", None, "Đang chờ...", {}
|
| 292 |
|
| 293 |
try:
|
|
|
|
| 294 |
result = streaming_service.process_streaming_audio(audio_data)
|
| 295 |
state = streaming_service.get_conversation_state()
|
| 296 |
status = "✅ Đã xử lý manual audio"
|
|
@@ -305,6 +314,12 @@ def create_streaming_voice_tab(streaming_service: StreamingVoiceService):
|
|
| 305 |
state = streaming_service.get_conversation_state()
|
| 306 |
return "", "", None, "🗑️ Đã xóa hội thoại", state
|
| 307 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 308 |
# Event handlers
|
| 309 |
start_vad_btn.click(
|
| 310 |
start_vad,
|
|
@@ -316,6 +331,7 @@ def create_streaming_voice_tab(streaming_service: StreamingVoiceService):
|
|
| 316 |
outputs=[status_display, state_display]
|
| 317 |
)
|
| 318 |
|
|
|
|
| 319 |
microphone.stream(
|
| 320 |
process_manual_audio,
|
| 321 |
inputs=[microphone],
|
|
@@ -326,6 +342,13 @@ def create_streaming_voice_tab(streaming_service: StreamingVoiceService):
|
|
| 326 |
clear_conversation,
|
| 327 |
outputs=[realtime_transcription, ai_response, tts_output, status_display, state_display]
|
| 328 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 329 |
|
| 330 |
return streaming_tab
|
| 331 |
def create_image_tab(image_service: ImageService):
|
|
|
|
| 266 |
autoplay=True
|
| 267 |
)
|
| 268 |
|
| 269 |
+
# Biến để lưu kết quả từ VAD callback
|
| 270 |
+
vad_result = gr.State(value={
|
| 271 |
+
'transcription': "",
|
| 272 |
+
'response': "",
|
| 273 |
+
'tts_audio': None,
|
| 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 |
+
# Lưu kết quả vào state
|
| 282 |
+
vad_result.value = result
|
| 283 |
print(f"VAD Result: {result}")
|
| 284 |
|
| 285 |
success = streaming_service.start_listening(vad_callback)
|
|
|
|
| 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"
|
|
|
|
| 314 |
state = streaming_service.get_conversation_state()
|
| 315 |
return "", "", None, "🗑️ Đã xóa hội thoại", state
|
| 316 |
|
| 317 |
+
def update_from_vad():
|
| 318 |
+
"""Cập nhật UI từ kết quả VAD"""
|
| 319 |
+
result = vad_result.value
|
| 320 |
+
state = streaming_service.get_conversation_state()
|
| 321 |
+
return result['transcription'], result['response'], result['tts_audio'], "✅ VAD đã xử lý", state
|
| 322 |
+
|
| 323 |
# Event handlers
|
| 324 |
start_vad_btn.click(
|
| 325 |
start_vad,
|
|
|
|
| 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],
|
|
|
|
| 342 |
clear_conversation,
|
| 343 |
outputs=[realtime_transcription, ai_response, tts_output, status_display, state_display]
|
| 344 |
)
|
| 345 |
+
|
| 346 |
+
# Timer để cập nhật kết quả từ VAD
|
| 347 |
+
streaming_tab.load(
|
| 348 |
+
update_from_vad,
|
| 349 |
+
outputs=[realtime_transcription, ai_response, tts_output, status_display, state_display],
|
| 350 |
+
every=1 # Cập nhật mỗi giây
|
| 351 |
+
)
|
| 352 |
|
| 353 |
return streaming_tab
|
| 354 |
def create_image_tab(image_service: ImageService):
|