| """Launches the Whisper Transcribe app behind an ngrok tunnel.""" |
|
|
| import os |
| import sys |
| import threading |
|
|
| os.environ.setdefault("WHISPER_MODEL_SIZE", "large-v3") |
| os.environ.setdefault("HOST", "0.0.0.0") |
| os.environ.setdefault("PORT", "5000") |
|
|
| from backend import config |
| from backend.app import app, logger |
| import backend.transcriber as T |
| from pyngrok import ngrok |
|
|
|
|
| def _preload() -> None: |
| T.cleanup_outputs() |
| print(f"Pre-loading '{config.MODEL_SIZE}' model (first run downloads weights ~1-3 GB)…") |
| try: |
| T.get_model(config.MODEL_SIZE) |
| print("Model ready.\n") |
| except Exception as exc: |
| logger.warning("Model pre-load failed: %s — will retry on first request.", exc) |
|
|
|
|
| def main() -> None: |
| flask_thread = threading.Thread( |
| target=lambda: app.run(host=config.HOST, port=config.PORT, threaded=True), |
| daemon=True, |
| ) |
| flask_thread.start() |
|
|
| token = os.environ.get("NGROK_AUTHTOKEN", "").strip() |
| if token: |
| ngrok.set_auth_token(token) |
| else: |
| print( |
| "WARNING: NGROK_AUTHTOKEN is not set — falling back to ngrok anonymous tier, " |
| "which may be rate-limited." |
| ) |
|
|
| try: |
| public_url = ngrok.connect(config.PORT).public_url |
| except Exception as exc: |
| print("Could not open an ngrok tunnel:", exc) |
| print("Set NGROK_AUTHTOKEN in .env and run again.") |
| raise |
|
|
| print("\n" + "=" * 64) |
| print(f" Whisper Transcribe is live → {public_url}") |
| print("=" * 64 + "\n") |
|
|
| |
| threading.Thread(target=_preload, daemon=True).start() |
|
|
| flask_thread.join() |
|
|
|
|
| if __name__ == "__main__": |
| try: |
| main() |
| except KeyboardInterrupt: |
| print("\nShutting down.") |
| except Exception: |
| logger.exception("Fatal error while starting the app") |
| sys.exit(1) |
|
|