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
output = gr.HTML(
value="
Click 'Start' to begin listening...
",
label="Live Conversation",
elem_classes=["output"]
)
# 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)
""")
# JavaScript for browser audio capture and WebRTC
js = f"""
"""
# Inject JavaScript
demo.load(js, outputs=[output, status_output])
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()