diff --git a/CLAUDE.md b/CLAUDE.md index cedaf50..d1e6dd2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -10,7 +10,7 @@ Local Transcription is a desktop application for real-time speech-to-text transc - Standalone desktop GUI (PySide6/Qt) - Local transcription with CPU/GPU support - Built-in web server for OBS browser source integration -- Optional PHP-based multi-user server for syncing transcriptions across users +- Optional Node.js-based multi-user server for syncing transcriptions across users - Noise suppression and Voice Activity Detection (VAD) - Cross-platform builds (Linux/Windows) with PyInstaller @@ -29,12 +29,12 @@ local-transcription/ │ ├── main_window_qt.py # Main application window (PySide6) │ ├── settings_dialog_qt.py # Settings dialog (PySide6) │ └── transcription_display_qt.py # Display widget -├── server/ # Web display server -│ ├── web_display.py # FastAPI server for OBS browser source -│ └── php/ # Optional multi-user PHP server -│ ├── server.php # Multi-user sync server -│ ├── display.php # Multi-user web display -│ └── README.md # PHP server documentation +├── server/ # Web display servers +│ ├── web_display.py # FastAPI server for OBS browser source (local) +│ └── nodejs/ # Optional multi-user Node.js server +│ ├── server.js # Multi-user sync server with WebSocket +│ ├── package.json # Node.js dependencies +│ └── README.md # Server deployment documentation ├── config/ # Example configuration files │ └── default_config.yaml # Default settings template ├── main.py # GUI application entry point @@ -128,28 +128,20 @@ uv run python -m uvicorn server.web_display:app --reload - Used for OBS browser source integration - Single-user (displays only local transcriptions) -**Multi-User Servers** (Optional - for syncing across multiple users) +**Multi-User Server** (Optional - for syncing across multiple users) -Three options available: +**Node.js WebSocket Server** ([server/nodejs/](server/nodejs/)) - **RECOMMENDED** +- Real-time WebSocket support (< 100ms latency) +- Handles 100+ concurrent users +- Easy deployment to VPS/cloud hosting (Railway, Heroku, DigitalOcean, or any VPS) +- Configurable display options via URL parameters: + - `timestamps=true/false` - Show/hide timestamps + - `maxlines=50` - Maximum visible lines (prevents scroll bars in OBS) + - `fontsize=16` - Font size in pixels + - `fontfamily=Arial` - Font family + - `fade=10` - Seconds before text fades (0 = never) -1. **PHP with Polling** ([server/php/display-polling.php](server/php/display-polling.php)) - **RECOMMENDED for PHP** - - Works on ANY shared hosting (no buffering issues) - - Uses HTTP polling instead of SSE - - 1-2 second latency, very reliable - - File-based storage, no database needed - -2. **Node.js WebSocket Server** ([server/nodejs/](server/nodejs/)) - **BEST PERFORMANCE** - - Real-time WebSocket support (< 100ms latency) - - Handles 100+ concurrent users - - Requires VPS/cloud hosting (Railway, Heroku, DigitalOcean) - - Much better than PHP for real-time applications - -3. **PHP with SSE** ([server/php/display.php](server/php/display.php)) - **NOT RECOMMENDED** - - Has buffering issues on most shared hosting - - PHP-FPM incompatibility - - Use polling or Node.js instead - -See [server/COMPARISON.md](server/COMPARISON.md) and [server/QUICK_FIX.md](server/QUICK_FIX.md) for details +See [server/nodejs/README.md](server/nodejs/README.md) for deployment instructions ### Configuration System @@ -281,19 +273,17 @@ See [server/COMPARISON.md](server/COMPARISON.md) and [server/QUICK_FIX.md](serve 3. URL: `http://localhost:8080` 4. Set dimensions (e.g., 1920x300) -### Multi-User Display (PHP Server - Polling) -1. Deploy PHP server to web hosting -2. Each user enables "Server Sync" in settings -3. Enter same room name and passphrase -4. In OBS: Add "Browser" source -5. URL: `https://your-domain.com/transcription/display-polling.php?room=ROOM&fade=10` - ### Multi-User Display (Node.js Server) 1. Deploy Node.js server (see [server/nodejs/README.md](server/nodejs/README.md)) 2. Each user configures Server URL: `http://your-server:3000/api/send` 3. Enter same room name and passphrase 4. In OBS: Add "Browser" source -5. URL: `http://your-server:3000/display?room=ROOM&fade=10` +5. URL: `http://your-server:3000/display?room=ROOM&fade=10×tamps=true&maxlines=50&fontsize=16` +6. Customize URL parameters as needed: + - `timestamps=false` - Hide timestamps + - `maxlines=30` - Show max 30 lines (prevents scroll bars) + - `fontsize=18` - Larger font + - `fontfamily=Courier` - Different font ## Performance Optimization @@ -314,7 +304,7 @@ See [server/COMPARISON.md](server/COMPARISON.md) and [server/QUICK_FIX.md](serve - ✅ **Phase 1**: Standalone desktop application (complete) - ✅ **Web Server**: Local OBS integration (complete) - ✅ **Builds**: PyInstaller executables (complete) -- 🚧 **Phase 2**: Multi-user PHP server (functional, optional) +- ✅ **Phase 2**: Multi-user Node.js server (complete, optional) - ⏸️ **Phase 3+**: Advanced features (see [NEXT_STEPS.md](NEXT_STEPS.md)) ## Related Documentation @@ -323,4 +313,4 @@ See [server/COMPARISON.md](server/COMPARISON.md) and [server/QUICK_FIX.md](serve - [BUILD.md](BUILD.md) - Detailed build instructions - [INSTALL.md](INSTALL.md) - Installation guide - [NEXT_STEPS.md](NEXT_STEPS.md) - Future enhancements -- [server/php/README.md](server/php/README.md) - PHP server setup +- [server/nodejs/README.md](server/nodejs/README.md) - Node.js server setup and deployment diff --git a/config/default_config.yaml b/config/default_config.yaml index 99f4f6a..5809ee6 100644 --- a/config/default_config.yaml +++ b/config/default_config.yaml @@ -25,7 +25,7 @@ processing: server_sync: enabled: false - url: "http://localhost/transcription/server.php" + url: "http://localhost:3000/api/send" room: "default" passphrase: "" diff --git a/gui/main_window_qt.py b/gui/main_window_qt.py index 8946f99..f2f4f85 100644 --- a/gui/main_window_qt.py +++ b/gui/main_window_qt.py @@ -273,6 +273,9 @@ class MainWindow(QMainWindow): port = self.config.get('web_server.port', 8080) show_timestamps = self.config.get('display.show_timestamps', True) fade_after_seconds = self.config.get('display.fade_after_seconds', 10) + max_lines = self.config.get('display.max_lines', 50) + font_family = self.config.get('display.font_family', 'Arial') + font_size = self.config.get('display.font_size', 16) # Try up to 5 ports if the default is in use ports_to_try = [port] + [port + i for i in range(1, 5)] @@ -284,7 +287,10 @@ class MainWindow(QMainWindow): host=host, port=try_port, show_timestamps=show_timestamps, - fade_after_seconds=fade_after_seconds + fade_after_seconds=fade_after_seconds, + max_lines=max_lines, + font_family=font_family, + font_size=font_size ) self.web_server_thread = WebServerThread(self.web_server) self.web_server_thread.start() @@ -530,6 +536,9 @@ class MainWindow(QMainWindow): if self.web_server: self.web_server.show_timestamps = show_timestamps self.web_server.fade_after_seconds = self.config.get('display.fade_after_seconds', 10) + self.web_server.max_lines = self.config.get('display.max_lines', 50) + self.web_server.font_family = self.config.get('display.font_family', 'Arial') + self.web_server.font_size = self.config.get('display.font_size', 16) # Restart server sync if it was running and settings changed if self.is_transcribing and self.server_sync_client: diff --git a/gui/settings_dialog_qt.py b/gui/settings_dialog_qt.py index ebcdf5e..cb6af4a 100644 --- a/gui/settings_dialog_qt.py +++ b/gui/settings_dialog_qt.py @@ -155,7 +155,7 @@ class SettingsDialog(QDialog): server_layout.addRow("Enable Server Sync:", self.server_enabled_check) self.server_url_input = QLineEdit() - self.server_url_input.setPlaceholderText("http://example.com/transcription/server.php") + self.server_url_input.setPlaceholderText("http://your-server:3000/api/send") server_layout.addRow("Server URL:", self.server_url_input) self.server_room_input = QLineEdit() diff --git a/server/nodejs/server.js b/server/nodejs/server.js index fb4463d..49b4e65 100644 --- a/server/nodejs/server.js +++ b/server/nodejs/server.js @@ -411,6 +411,19 @@ app.get('/', (req, res) => {
Add a Browser source in OBS and paste this URL. Set width to 1920 and height to 200-400px.
+fade=10 - Seconds before text fades (0 = never fade)timestamps=true - Show/hide timestamps (true/false)maxlines=50 - Max lines visible at once (prevents scroll bars)fontsize=16 - Font size in pixelsfontfamily=Arial - Font family (Arial, Courier, etc.)
+ Example: ?room=myroom&fade=15×tamps=false&maxlines=30&fontsize=18
+