Spaces:
Running
Running
Commit ·
b45f016
1
Parent(s): 7f7357a
ui.py
CHANGED
|
@@ -81,40 +81,21 @@ def create_gradio_app():
|
|
| 81 |
this.baseUrl = 'https://{config.hf_space_url}';
|
| 82 |
this.wsUrl = 'wss://{config.hf_space_url}/ws';
|
| 83 |
this.renderUrl = 'wss://{config.render_url}/stream';
|
|
|
|
| 84 |
}}
|
| 85 |
|
| 86 |
async startRecording() {{
|
| 87 |
try {{
|
| 88 |
-
|
| 89 |
-
this.
|
| 90 |
-
audio: {{
|
| 91 |
-
echoCancellation: true,
|
| 92 |
-
noiseSuppression: true,
|
| 93 |
-
autoGainControl: true,
|
| 94 |
-
sampleRate: 16000
|
| 95 |
-
}}
|
| 96 |
-
}});
|
| 97 |
|
| 98 |
-
//
|
| 99 |
await this.connectWebSocket();
|
| 100 |
|
| 101 |
-
//
|
| 102 |
-
|
| 103 |
-
mimeType: 'audio/webm;codecs=opus'
|
| 104 |
-
}});
|
| 105 |
-
|
| 106 |
-
this.mediaRecorder.ondataavailable = (event) => {{
|
| 107 |
-
if (event.data.size > 0 && this.ws && this.ws.readyState === WebSocket.OPEN) {{
|
| 108 |
-
// Send audio chunk to server
|
| 109 |
-
this.ws.send(event.data);
|
| 110 |
-
}}
|
| 111 |
-
}};
|
| 112 |
-
|
| 113 |
-
// Start recording with chunks every 1 second
|
| 114 |
-
this.mediaRecorder.start(1000);
|
| 115 |
-
this.isRecording = true;
|
| 116 |
|
| 117 |
-
this.updateStatus('connected', '
|
| 118 |
|
| 119 |
}} catch (error) {{
|
| 120 |
console.error('Error starting recording:', error);
|
|
@@ -124,10 +105,11 @@ def create_gradio_app():
|
|
| 124 |
|
| 125 |
async connectWebSocket() {{
|
| 126 |
return new Promise((resolve, reject) => {{
|
| 127 |
-
|
|
|
|
| 128 |
|
| 129 |
this.ws.onopen = () => {{
|
| 130 |
-
console.log('WebSocket connected');
|
| 131 |
resolve();
|
| 132 |
}};
|
| 133 |
|
|
@@ -312,7 +294,9 @@ def create_gradio_app():
|
|
| 312 |
streaming=False,
|
| 313 |
modality="audio",
|
| 314 |
mode="send-receive",
|
| 315 |
-
|
|
|
|
|
|
|
| 316 |
)
|
| 317 |
|
| 318 |
# Control buttons
|
|
@@ -498,13 +482,26 @@ async def process_audio_chunk(audio_data: bytes) -> dict:
|
|
| 498 |
fastapi_app = create_fastapi_app()
|
| 499 |
gradio_app = create_gradio_app()
|
| 500 |
|
| 501 |
-
# Root redirect
|
| 502 |
@fastapi_app.get("/")
|
| 503 |
-
|
| 504 |
-
|
|
|
|
| 505 |
|
| 506 |
-
# Mount Gradio app to FastAPI
|
| 507 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 508 |
|
| 509 |
# Add diagnostic endpoints to check connections
|
| 510 |
@fastapi_app.get("/check-backend")
|
|
@@ -542,6 +539,20 @@ async def log_configuration():
|
|
| 542 |
logger.info(f"- WebRTC URL: wss://{config.render_url}/stream")
|
| 543 |
logger.info(f"- WebSocket URL: wss://{config.hf_space_url}/ws_inference")
|
| 544 |
logger.info("Note: Audio will be streamed through the Render backend using WebRTC")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 545 |
|
| 546 |
if __name__ == "__main__":
|
| 547 |
import uvicorn
|
|
|
|
| 81 |
this.baseUrl = 'https://{config.hf_space_url}';
|
| 82 |
this.wsUrl = 'wss://{config.hf_space_url}/ws';
|
| 83 |
this.renderUrl = 'wss://{config.render_url}/stream';
|
| 84 |
+
this.rtcComponentSynced = false;
|
| 85 |
}}
|
| 86 |
|
| 87 |
async startRecording() {{
|
| 88 |
try {{
|
| 89 |
+
this.isRecording = true;
|
| 90 |
+
this.updateStatus('connecting', 'Connecting to server...');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
|
| 92 |
+
// Connect to WebSocket for transcription updates
|
| 93 |
await this.connectWebSocket();
|
| 94 |
|
| 95 |
+
// Let the RTCComponent handle the audio streaming
|
| 96 |
+
// This will be handled by Gradio's WebRTC component
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
|
| 98 |
+
this.updateStatus('connected', 'Connected and listening');
|
| 99 |
|
| 100 |
}} catch (error) {{
|
| 101 |
console.error('Error starting recording:', error);
|
|
|
|
| 105 |
|
| 106 |
async connectWebSocket() {{
|
| 107 |
return new Promise((resolve, reject) => {{
|
| 108 |
+
// Only connect to the conversation updates WebSocket
|
| 109 |
+
this.ws = new WebSocket('wss://{config.hf_space_url}/ws_transcription');
|
| 110 |
|
| 111 |
this.ws.onopen = () => {{
|
| 112 |
+
console.log('WebSocket connected for transcription updates');
|
| 113 |
resolve();
|
| 114 |
}};
|
| 115 |
|
|
|
|
| 294 |
streaming=False,
|
| 295 |
modality="audio",
|
| 296 |
mode="send-receive",
|
| 297 |
+
audio_html_attrs="style='display:none;'", # Hide the audio element
|
| 298 |
+
visible=True, # Make component visible but hide audio element
|
| 299 |
+
elements=["video", "start", "stop"] # Don't include audio element
|
| 300 |
)
|
| 301 |
|
| 302 |
# Control buttons
|
|
|
|
| 482 |
fastapi_app = create_fastapi_app()
|
| 483 |
gradio_app = create_gradio_app()
|
| 484 |
|
| 485 |
+
# Root redirect - keep this simple
|
| 486 |
@fastapi_app.get("/")
|
| 487 |
+
def root():
|
| 488 |
+
"""Redirect root to the Gradio UI"""
|
| 489 |
+
return RedirectResponse(url="/ui/") # Note the trailing slash is important
|
| 490 |
|
| 491 |
+
# Mount Gradio app to FastAPI - use correct mounting method for Gradio
|
| 492 |
+
try:
|
| 493 |
+
# For newer Gradio versions
|
| 494 |
+
fastapi_app.mount("/ui", gradio_app)
|
| 495 |
+
except Exception as e:
|
| 496 |
+
# Try alternative mounting method
|
| 497 |
+
try:
|
| 498 |
+
from gradio.routes import mount_gradio_app
|
| 499 |
+
app = mount_gradio_app(fastapi_app, gradio_app, path="/ui")
|
| 500 |
+
logger.info("Mounted Gradio app using mount_gradio_app")
|
| 501 |
+
except Exception as e2:
|
| 502 |
+
logger.error(f"Failed to mount Gradio app: {e2}")
|
| 503 |
+
# As a last resort, try the simplest mounting
|
| 504 |
+
fastapi_app.mount("/ui", gradio_app.app)
|
| 505 |
|
| 506 |
# Add diagnostic endpoints to check connections
|
| 507 |
@fastapi_app.get("/check-backend")
|
|
|
|
| 539 |
logger.info(f"- WebRTC URL: wss://{config.render_url}/stream")
|
| 540 |
logger.info(f"- WebSocket URL: wss://{config.hf_space_url}/ws_inference")
|
| 541 |
logger.info("Note: Audio will be streamed through the Render backend using WebRTC")
|
| 542 |
+
|
| 543 |
+
# Test connection to Render backend
|
| 544 |
+
try:
|
| 545 |
+
async with websockets.connect(f"wss://{config.render_url}/stream", ping_interval=None, ping_timeout=None) as ws:
|
| 546 |
+
logger.info("Successfully connected to Render backend WebSocket")
|
| 547 |
+
except Exception as e:
|
| 548 |
+
logger.error(f"Failed to connect to Render backend: {e}")
|
| 549 |
+
|
| 550 |
+
# Test connection to HF Space backend
|
| 551 |
+
try:
|
| 552 |
+
async with websockets.connect(f"wss://{config.hf_space_url}/ws_inference", ping_interval=None, ping_timeout=None) as ws:
|
| 553 |
+
logger.info("Successfully connected to HF Space WebSocket")
|
| 554 |
+
except Exception as e:
|
| 555 |
+
logger.error(f"Failed to connect to HF Space: {e}")
|
| 556 |
|
| 557 |
if __name__ == "__main__":
|
| 558 |
import uvicorn
|