import gradio as gr
from fastapi import FastAPI
from shared import DEFAULT_CHANGE_THRESHOLD, DEFAULT_MAX_SPEAKERS, ABSOLUTE_MAX_SPEAKERS
# Replace with your actual space URL when deployed
API_WS = "wss://your-space.hf.space/ws_inference"
def build_ui():
"""Build Gradio UI for speaker diarization"""
with gr.Blocks(title="Real-time Speaker Diarization", theme=gr.themes.Soft()) as demo:
gr.Markdown("# ๐ค Live Speaker Diarization")
gr.Markdown("Real-time speech recognition with automatic speaker identification")
with gr.Row():
with gr.Column(scale=2):
# Conversation display with embedded JavaScript
output = gr.HTML(
"""
Click 'Start Listening' to beginโฆ
""",
label="Live Conversation"
)
# Control buttons
with gr.Row():
start_btn = gr.Button("โถ๏ธ Start Listening", variant="primary", size="lg")
stop_btn = gr.Button("โน๏ธ Stop", variant="stop", size="lg")
clear_btn = gr.Button("๐๏ธ Clear", variant="secondary", size="lg")
# Status display
status_output = gr.Textbox(
label="System Status",
value="Click 'Start Listening' to begin...",
lines=8,
interactive=False
)
with gr.Column(scale=1):
# Settings
gr.Markdown("## โ๏ธ Settings")
threshold_slider = gr.Slider(
minimum=0.3,
maximum=0.9,
step=0.05,
value=DEFAULT_CHANGE_THRESHOLD,
label="Speaker Change Sensitivity",
info="Lower = more sensitive"
)
max_speakers_slider = gr.Slider(
minimum=2,
maximum=ABSOLUTE_MAX_SPEAKERS,
step=1,
value=DEFAULT_MAX_SPEAKERS,
label="Maximum Speakers"
)
update_btn = gr.Button("Update Settings", variant="secondary")
# Instructions
gr.Markdown("""
## ๐ Instructions
1. **Start Listening** - allows browser to access microphone
2. **Speak** - system will recognize different speakers
3. **Stop** when finished
## ๐จ Speaker Colors
- ๐ด Speaker 1 (Red)
- ๐ข Speaker 2 (Teal)
- ๐ต Speaker 3 (Blue)
- ๐ก Speaker 4 (Green)
""")
return demo
# Create Gradio interface
demo = build_ui()
def mount_ui(app: FastAPI):
"""Mount Gradio app to FastAPI"""
app.mount("/", demo.app)
# For standalone testing
if __name__ == "__main__":
demo.launch()