| import gradio as gr |
|
|
| def create_custom_css() -> str: |
| return """ |
| .gradio-container { |
| background-color: #1f1f1f; |
| } |
| .gr-markdown, .gr-markdown * { |
| color: #ffffff !important; |
| } |
| |
| .streaming-active { |
| border: 3px solid #00ff00 !important; |
| animation: pulse 2s infinite; |
| } |
| |
| .streaming-inactive { |
| border: 2px solid #ff4444 !important; |
| } |
| |
| @keyframes pulse { |
| 0% { border-color: #00ff00; } |
| 50% { border-color: #00cc00; } |
| 100% { border-color: #00ff00; } |
| } |
| |
| .vad-visualizer { |
| background: linear-gradient(90deg, #00ff00, #ffff00, #ff0000); |
| height: 20px; |
| border-radius: 10px; |
| margin: 10px 0; |
| transition: all 0.1s ease; |
| } |
| |
| .conversation-bubble { |
| background: #2d2d2d; |
| border-radius: 15px; |
| padding: 10px 15px; |
| margin: 5px 0; |
| border-left: 4px solid #f55036; |
| } |
| |
| .user-bubble { |
| border-left-color: #36a2f5; |
| } |
| |
| .assistant-bubble { |
| border-left-color: #f55036; |
| } |
| """ |
| def create_header() -> gr.Markdown: |
| return gr.Markdown("# 🎙️ Groq x Gradio Multi-Modal với RAG Wikipedia") |
| def create_audio_components() -> tuple: |
| with gr.Row(): |
| audio_input = gr.Audio(type="numpy", label="Nói hoặc tải lên file âm thanh") |
| |
| with gr.Row(): |
| transcription_output = gr.Textbox( |
| label="Bản ghi âm", |
| lines=5, |
| interactive=True, |
| placeholder="Bản ghi âm sẽ hiển thị ở đây..." |
| ) |
| response_output = gr.Textbox( |
| label="Phản hồi AI", |
| lines=5, |
| interactive=True, |
| placeholder="Phản hồi của AI sẽ hiển thị ở đây..." |
| ) |
| |
| with gr.Row(): |
| tts_audio_output = gr.Audio( |
| label="Phản hồi bằng giọng nói", |
| interactive=False |
| ) |
| |
| process_button = gr.Button("Xử lý", variant="primary") |
| |
| return audio_input, transcription_output, response_output, tts_audio_output, process_button |
|
|
| def create_chat_components() -> tuple: |
| """Tạo components cho chat interface - ĐÃ SỬA WARNING""" |
| chatbot = gr.Chatbot( |
| label="Chatbot", |
| height=500, |
| show_copy_button=True, |
| type="messages" |
| ) |
| state = gr.State([]) |
| |
| with gr.Row(): |
| user_input = gr.Textbox( |
| show_label=False, |
| placeholder="Nhập tin nhắn của bạn ở đây...", |
| container=False, |
| scale=4 |
| ) |
| send_button = gr.Button("Gửi", variant="primary", scale=1) |
| clear_button = gr.Button("Xóa Chat", variant="secondary", scale=1) |
| |
| with gr.Row(): |
| chat_tts_output = gr.Audio( |
| label="Phản hồi bằng giọng nói", |
| interactive=False, |
| visible=True |
| ) |
| |
| return chatbot, state, user_input, send_button, clear_button, chat_tts_output |
| def create_streaming_voice_components() -> tuple: |
| """Tạo components cho streaming voice sử dụng Gradio microphone""" |
| with gr.Group(): |
| gr.Markdown("## 🎤 Trò chuyện giọng nói thời gian thực") |
| gr.Markdown("Sử dụng microphone của thiết bị để trò chuyện với AI - hoạt động trên cả điện thoại và máy tính") |
| |
| with gr.Row(): |
| with gr.Column(scale=1): |
| |
| microphone = gr.Microphone( |
| label="🎙️ Nhấn và nói", |
| type="numpy", |
| streaming=True, |
| show_download_button=False |
| ) |
| |
| |
| clear_btn = gr.Button("🗑️ Xóa hội thoại", variant="secondary", size="sm") |
| |
| |
| status_display = gr.Textbox( |
| label="Trạng thái", |
| value="Sẵn sàng - nhấn nút microphone để nói", |
| interactive=False |
| ) |
| |
| |
| state_display = gr.JSON( |
| label="Thông tin hội thoại", |
| value={} |
| ) |
| |
| with gr.Column(scale=2): |
| |
| realtime_transcription = gr.Textbox( |
| label="📝 Bạn vừa nói", |
| lines=2, |
| interactive=False, |
| placeholder="Văn bản được chuyển đổi sẽ xuất hiện ở đây..." |
| ) |
| |
| |
| ai_response = gr.Textbox( |
| label="🤖 Phản hồi AI", |
| lines=3, |
| interactive=False, |
| placeholder="Phản hồi của AI sẽ xuất hiện ở đây..." |
| ) |
| |
| |
| tts_output = gr.Audio( |
| label="🔊 Phản hồi bằng giọng nói", |
| interactive=False, |
| autoplay=True |
| ) |
| |
| |
| return ( |
| microphone, |
| clear_btn, |
| status_display, |
| state_display, |
| realtime_transcription, |
| ai_response, |
| tts_output |
| |
| ) |
| |