Spaces:
Sleeping
Sleeping
Muhammed Essam
Claude
commited on
Commit
Β·
576583f
1
Parent(s):
e459b45
Add Mermaid diagrams and enhance UI visibility
Browse files- Add visual flowcharts to all 4 tabs showing AI pipeline
- Display models used in each feature with emojis
- Show performance metrics for each tab
- Side-by-side layout (diagram left, form right)
- Update footer to reflect whisper-base model
- Improved visual hierarchy and user guidance
UI Enhancements:
- Tab 1: Division Text - Name extraction + semantic search flow
- Tab 2: Division Voice - Whisper transcription + translation flow
- Tab 3: Contact Text - Dual path name/division matching flow
- Tab 4: Contact Voice - Complete AI pipeline visualization
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
app.py
CHANGED
|
@@ -244,36 +244,54 @@ def create_demo():
|
|
| 244 |
|
| 245 |
**Database:** {stats['total_contacts']} contacts β’ {stats['departments']} departments β’ {stats['divisions']} divisions
|
| 246 |
|
| 247 |
-
**
|
| 248 |
-
-
|
| 249 |
-
-
|
| 250 |
-
- π€
|
| 251 |
-
- π Contact search with confidence scoring
|
| 252 |
""")
|
| 253 |
|
| 254 |
with gr.Tabs():
|
| 255 |
|
| 256 |
# Tab 1: Division Matching (Text)
|
| 257 |
with gr.Tab("π Division Matching (Text)"):
|
| 258 |
-
gr.Markdown("""
|
| 259 |
-
### Search for divisions by text query
|
| 260 |
-
Try queries like:
|
| 261 |
-
- "I need help from IT Security"
|
| 262 |
-
- "Find someone in Finance"
|
| 263 |
-
- "Connect me to Human Resources"
|
| 264 |
-
- "Find Ahmed in App Dev"
|
| 265 |
-
""")
|
| 266 |
-
|
| 267 |
with gr.Row():
|
| 268 |
-
with gr.Column():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 269 |
div_text_input = gr.Textbox(
|
| 270 |
label="Enter your query",
|
| 271 |
placeholder="e.g., I need help from IT Security",
|
| 272 |
lines=2
|
| 273 |
)
|
| 274 |
-
div_text_btn = gr.Button("π Search Divisions", variant="primary")
|
| 275 |
-
|
| 276 |
-
with gr.Column():
|
| 277 |
div_text_output = gr.Markdown(label="Results")
|
| 278 |
|
| 279 |
div_text_btn.click(
|
|
@@ -284,21 +302,47 @@ def create_demo():
|
|
| 284 |
|
| 285 |
# Tab 2: Division Matching (Voice)
|
| 286 |
with gr.Tab("π€ Division Matching (Voice)"):
|
| 287 |
-
gr.Markdown("""
|
| 288 |
-
### Search for divisions by voice
|
| 289 |
-
Speak your query in any language - it will be automatically transcribed and translated.
|
| 290 |
-
""")
|
| 291 |
-
|
| 292 |
with gr.Row():
|
| 293 |
-
with gr.Column():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 294 |
div_voice_input = gr.Audio(
|
| 295 |
sources=["microphone"],
|
| 296 |
type="numpy",
|
| 297 |
-
label="Record your voice query"
|
| 298 |
)
|
| 299 |
-
div_voice_btn = gr.Button("π Search Divisions", variant="primary")
|
| 300 |
-
|
| 301 |
-
with gr.Column():
|
| 302 |
div_voice_output = gr.Markdown(label="Results")
|
| 303 |
|
| 304 |
div_voice_btn.click(
|
|
@@ -309,25 +353,54 @@ def create_demo():
|
|
| 309 |
|
| 310 |
# Tab 3: Contact Search (Text)
|
| 311 |
with gr.Tab("π₯ Contact Search (Text)"):
|
| 312 |
-
gr.Markdown("""
|
| 313 |
-
### Search for contacts by text query
|
| 314 |
-
Try queries like:
|
| 315 |
-
- "Find Dima in Information Technology"
|
| 316 |
-
- "Ahmed Al-Malek"
|
| 317 |
-
- "I need to talk to someone in Legal"
|
| 318 |
-
- "Find Rashed in Finance"
|
| 319 |
-
""")
|
| 320 |
-
|
| 321 |
with gr.Row():
|
| 322 |
-
with gr.Column():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 323 |
contact_text_input = gr.Textbox(
|
| 324 |
label="Enter your query",
|
| 325 |
placeholder="e.g., Find Dima in Information Technology",
|
| 326 |
lines=2
|
| 327 |
)
|
| 328 |
-
contact_text_btn = gr.Button("π Search Contacts", variant="primary")
|
| 329 |
-
|
| 330 |
-
with gr.Column():
|
| 331 |
contact_text_output = gr.Markdown(label="Results")
|
| 332 |
|
| 333 |
contact_text_btn.click(
|
|
@@ -338,21 +411,55 @@ def create_demo():
|
|
| 338 |
|
| 339 |
# Tab 4: Contact Search (Voice)
|
| 340 |
with gr.Tab("ποΈ Contact Search (Voice)"):
|
| 341 |
-
gr.Markdown("""
|
| 342 |
-
### Search for contacts by voice
|
| 343 |
-
Speak your query in any language to find contacts.
|
| 344 |
-
""")
|
| 345 |
-
|
| 346 |
with gr.Row():
|
| 347 |
-
with gr.Column():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 348 |
contact_voice_input = gr.Audio(
|
| 349 |
sources=["microphone"],
|
| 350 |
type="numpy",
|
| 351 |
-
label="Record your voice query"
|
| 352 |
)
|
| 353 |
-
contact_voice_btn = gr.Button("π Search Contacts", variant="primary")
|
| 354 |
-
|
| 355 |
-
with gr.Column():
|
| 356 |
contact_voice_output = gr.Markdown(label="Results")
|
| 357 |
|
| 358 |
contact_voice_btn.click(
|
|
@@ -366,7 +473,7 @@ def create_demo():
|
|
| 366 |
**Models:**
|
| 367 |
- Embeddings: `sentence-transformers/all-MiniLM-L6-v2`
|
| 368 |
- Name Extraction: `urchade/gliner_small-v2.1`
|
| 369 |
-
- Speech-to-Text: `openai/whisper-
|
| 370 |
|
| 371 |
**Supported Languages:** 99+ languages (auto-detected)
|
| 372 |
""")
|
|
|
|
| 244 |
|
| 245 |
**Database:** {stats['total_contacts']} contacts β’ {stats['departments']} departments β’ {stats['divisions']} divisions
|
| 246 |
|
| 247 |
+
**AI Models Powered:**
|
| 248 |
+
- π€ **Whisper Base** - Speech recognition (99+ languages)
|
| 249 |
+
- π§ **MiniLM-L6-v2** - Semantic search embeddings
|
| 250 |
+
- π€ **GLiNER** - Named entity recognition
|
|
|
|
| 251 |
""")
|
| 252 |
|
| 253 |
with gr.Tabs():
|
| 254 |
|
| 255 |
# Tab 1: Division Matching (Text)
|
| 256 |
with gr.Tab("π Division Matching (Text)"):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 257 |
with gr.Row():
|
| 258 |
+
with gr.Column(scale=1):
|
| 259 |
+
gr.Markdown("""
|
| 260 |
+
### π How It Works
|
| 261 |
+
|
| 262 |
+
```mermaid
|
| 263 |
+
graph TD
|
| 264 |
+
A[Your Text Query] --> B[Name Extraction<br/>GLiNER Model]
|
| 265 |
+
A --> C[Semantic Search<br/>MiniLM Embeddings]
|
| 266 |
+
B --> D[Extract Person Names]
|
| 267 |
+
C --> E[Find Matching Divisions]
|
| 268 |
+
D --> F[Show Results]
|
| 269 |
+
E --> F
|
| 270 |
+
```
|
| 271 |
+
|
| 272 |
+
**Models Used:**
|
| 273 |
+
- π§ **MiniLM-L6-v2** (Embeddings)
|
| 274 |
+
- π€ **GLiNER** (Name Extraction)
|
| 275 |
+
|
| 276 |
+
**Performance:** ~500ms per query
|
| 277 |
+
""")
|
| 278 |
+
|
| 279 |
+
with gr.Column(scale=2):
|
| 280 |
+
gr.Markdown("""
|
| 281 |
+
### Search for divisions by text query
|
| 282 |
+
**Try these examples:**
|
| 283 |
+
- "I need help from IT Security"
|
| 284 |
+
- "Find someone in Finance"
|
| 285 |
+
- "Connect me to Human Resources"
|
| 286 |
+
- "Find Ahmed in App Dev"
|
| 287 |
+
""")
|
| 288 |
+
|
| 289 |
div_text_input = gr.Textbox(
|
| 290 |
label="Enter your query",
|
| 291 |
placeholder="e.g., I need help from IT Security",
|
| 292 |
lines=2
|
| 293 |
)
|
| 294 |
+
div_text_btn = gr.Button("π Search Divisions", variant="primary", size="lg")
|
|
|
|
|
|
|
| 295 |
div_text_output = gr.Markdown(label="Results")
|
| 296 |
|
| 297 |
div_text_btn.click(
|
|
|
|
| 302 |
|
| 303 |
# Tab 2: Division Matching (Voice)
|
| 304 |
with gr.Tab("π€ Division Matching (Voice)"):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 305 |
with gr.Row():
|
| 306 |
+
with gr.Column(scale=1):
|
| 307 |
+
gr.Markdown("""
|
| 308 |
+
### π€ How It Works
|
| 309 |
+
|
| 310 |
+
```mermaid
|
| 311 |
+
graph TD
|
| 312 |
+
A[ποΈ Voice Input] --> B[Whisper Base<br/>Speech-to-Text]
|
| 313 |
+
B --> C[Auto Language<br/>Detection]
|
| 314 |
+
C --> D{English?}
|
| 315 |
+
D -->|No| E[Translate to<br/>English]
|
| 316 |
+
D -->|Yes| F[Name Extraction<br/>GLiNER]
|
| 317 |
+
E --> F
|
| 318 |
+
F --> G[Semantic Search<br/>MiniLM]
|
| 319 |
+
G --> H[π Results]
|
| 320 |
+
```
|
| 321 |
+
|
| 322 |
+
**Models Used:**
|
| 323 |
+
- π€ **Whisper Base** (Speech-to-Text)
|
| 324 |
+
- π§ **MiniLM-L6-v2** (Embeddings)
|
| 325 |
+
- π€ **GLiNER** (Name Extraction)
|
| 326 |
+
|
| 327 |
+
**Languages:** 99+ supported
|
| 328 |
+
**Performance:** ~8-10s per query
|
| 329 |
+
""")
|
| 330 |
+
|
| 331 |
+
with gr.Column(scale=2):
|
| 332 |
+
gr.Markdown("""
|
| 333 |
+
### Search for divisions by voice
|
| 334 |
+
**Speak in any language:**
|
| 335 |
+
- English, Arabic, Spanish, French...
|
| 336 |
+
- Automatic transcription + translation
|
| 337 |
+
- Same accuracy as text search
|
| 338 |
+
""")
|
| 339 |
+
|
| 340 |
div_voice_input = gr.Audio(
|
| 341 |
sources=["microphone"],
|
| 342 |
type="numpy",
|
| 343 |
+
label="ποΈ Record your voice query"
|
| 344 |
)
|
| 345 |
+
div_voice_btn = gr.Button("π Search Divisions", variant="primary", size="lg")
|
|
|
|
|
|
|
| 346 |
div_voice_output = gr.Markdown(label="Results")
|
| 347 |
|
| 348 |
div_voice_btn.click(
|
|
|
|
| 353 |
|
| 354 |
# Tab 3: Contact Search (Text)
|
| 355 |
with gr.Tab("π₯ Contact Search (Text)"):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 356 |
with gr.Row():
|
| 357 |
+
with gr.Column(scale=1):
|
| 358 |
+
gr.Markdown("""
|
| 359 |
+
### π₯ How It Works
|
| 360 |
+
|
| 361 |
+
```mermaid
|
| 362 |
+
graph TD
|
| 363 |
+
A[Text Query] --> B[Name Extraction<br/>GLiNER]
|
| 364 |
+
A --> C[Division Matching<br/>MiniLM]
|
| 365 |
+
B --> D[Extract Names]
|
| 366 |
+
C --> E[Find Divisions]
|
| 367 |
+
D --> F[Search 500<br/>Contacts]
|
| 368 |
+
E --> F
|
| 369 |
+
F --> G[Fuzzy Matching<br/>+ Scoring]
|
| 370 |
+
G --> H[Ranked Results<br/>by Confidence]
|
| 371 |
+
```
|
| 372 |
+
|
| 373 |
+
**Models Used:**
|
| 374 |
+
- π§ **MiniLM-L6-v2** (Division Match)
|
| 375 |
+
- π€ **GLiNER** (Name Extraction)
|
| 376 |
+
- π **Fuzzy Matching** (Contact Search)
|
| 377 |
+
|
| 378 |
+
**Database:** 500 contacts
|
| 379 |
+
**Performance:** ~2-3s per query
|
| 380 |
+
""")
|
| 381 |
+
|
| 382 |
+
with gr.Column(scale=2):
|
| 383 |
+
gr.Markdown("""
|
| 384 |
+
### Search for contacts by text query
|
| 385 |
+
**Try these examples:**
|
| 386 |
+
- "Find Dima in Information Technology"
|
| 387 |
+
- "Ahmed Al-Malek"
|
| 388 |
+
- "I need to talk to someone in Legal"
|
| 389 |
+
- "Find Rashed in Finance"
|
| 390 |
+
|
| 391 |
+
**Results show:**
|
| 392 |
+
- β
Name (English + Arabic)
|
| 393 |
+
- β
Job title and division
|
| 394 |
+
- β
Contact info (phone, email)
|
| 395 |
+
- β
Confidence score
|
| 396 |
+
""")
|
| 397 |
+
|
| 398 |
contact_text_input = gr.Textbox(
|
| 399 |
label="Enter your query",
|
| 400 |
placeholder="e.g., Find Dima in Information Technology",
|
| 401 |
lines=2
|
| 402 |
)
|
| 403 |
+
contact_text_btn = gr.Button("π Search Contacts", variant="primary", size="lg")
|
|
|
|
|
|
|
| 404 |
contact_text_output = gr.Markdown(label="Results")
|
| 405 |
|
| 406 |
contact_text_btn.click(
|
|
|
|
| 411 |
|
| 412 |
# Tab 4: Contact Search (Voice)
|
| 413 |
with gr.Tab("ποΈ Contact Search (Voice)"):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 414 |
with gr.Row():
|
| 415 |
+
with gr.Column(scale=1):
|
| 416 |
+
gr.Markdown("""
|
| 417 |
+
### ποΈ How It Works
|
| 418 |
+
|
| 419 |
+
```mermaid
|
| 420 |
+
graph TD
|
| 421 |
+
A[π€ Voice] --> B[Whisper<br/>Transcribe]
|
| 422 |
+
B --> C{Language?}
|
| 423 |
+
C -->|Arabic/Other| D[Translate to<br/>English]
|
| 424 |
+
C -->|English| E[GLiNER<br/>Extract Names]
|
| 425 |
+
D --> E
|
| 426 |
+
E --> F[MiniLM<br/>Match Divisions]
|
| 427 |
+
F --> G[Search 500<br/>Contacts]
|
| 428 |
+
G --> H[Fuzzy Match<br/>+ Score]
|
| 429 |
+
H --> I[π Ranked<br/>Results]
|
| 430 |
+
```
|
| 431 |
+
|
| 432 |
+
**Full AI Pipeline:**
|
| 433 |
+
- π€ **Whisper** (Transcription)
|
| 434 |
+
- π **Translation** (Auto)
|
| 435 |
+
- π€ **GLiNER** (Names)
|
| 436 |
+
- π§ **MiniLM** (Divisions)
|
| 437 |
+
- π **Fuzzy Match** (Contacts)
|
| 438 |
+
|
| 439 |
+
**Performance:** ~8-12s total
|
| 440 |
+
""")
|
| 441 |
+
|
| 442 |
+
with gr.Column(scale=2):
|
| 443 |
+
gr.Markdown("""
|
| 444 |
+
### Search for contacts by voice
|
| 445 |
+
**Speak naturally in any language:**
|
| 446 |
+
- "Find Ahmed from IT"
|
| 447 |
+
- "Ψ£ΨΨͺΨ§Ψ¬ Ψ£ΨΩ
Ψ― Ω
Ω ΨͺΩΩΩΨ© Ψ§ΩΩ
ΨΉΩΩΩ
Ψ§Ψͺ" (Arabic)
|
| 448 |
+
- Automatic language detection
|
| 449 |
+
- Same results as text search
|
| 450 |
+
|
| 451 |
+
**Perfect for:**
|
| 452 |
+
- β
Mobile/hands-free use
|
| 453 |
+
- β
Non-English speakers
|
| 454 |
+
- β
Quick lookups
|
| 455 |
+
""")
|
| 456 |
+
|
| 457 |
contact_voice_input = gr.Audio(
|
| 458 |
sources=["microphone"],
|
| 459 |
type="numpy",
|
| 460 |
+
label="ποΈ Record your voice query"
|
| 461 |
)
|
| 462 |
+
contact_voice_btn = gr.Button("π Search Contacts", variant="primary", size="lg")
|
|
|
|
|
|
|
| 463 |
contact_voice_output = gr.Markdown(label="Results")
|
| 464 |
|
| 465 |
contact_voice_btn.click(
|
|
|
|
| 473 |
**Models:**
|
| 474 |
- Embeddings: `sentence-transformers/all-MiniLM-L6-v2`
|
| 475 |
- Name Extraction: `urchade/gliner_small-v2.1`
|
| 476 |
+
- Speech-to-Text: `openai/whisper-base`
|
| 477 |
|
| 478 |
**Supported Languages:** 99+ languages (auto-detected)
|
| 479 |
""")
|