[Unit] Description=Swictation Voice-to-Text Daemon After=graphical-session.target # Auto-start UI service when daemon starts Wants=swictation-ui.service [Service] Type=simple ExecStart=/usr/local/lib/node_modules/swictation/bin/swictation-daemon Restart=on-failure RestartSec=5 # Environment - CRITICAL for GPU acceleration and correct model operation Environment="RUST_LOG=info" # ORT_DYLIB_PATH: Points to ONNX Runtime library (CRITICAL - without this, model produces 100% blank tokens) Environment="ORT_DYLIB_PATH=/usr/local/lib/node_modules/swictation/lib/native/libonnxruntime.so" # LD_LIBRARY_PATH: CUDA runtime + ONNX Runtime CUDA providers (for GPU acceleration) # Without this: 14x performance regression (43s vs 3-6s expected for 57s audio) # Include cuda-12.9 for cuDNN libraries (libcudnn.so.9) required by ONNX Runtime Environment="LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda-12.9/lib64:/usr/local/lib/node_modules/swictation/lib/native" # CUDA_HOME: Helps CUDA libraries find additional resources at runtime Environment="CUDA_HOME=/usr/local/cuda" # Import user environment for PulseAudio/PipeWire session (enables full audio device detection) ImportEnvironment= # Resource limits - Relaxed for optimal GPU performance # 1.1B model needs ~3.5GB GPU VRAM + ~1-2GB system RAM + multi-core CPU for optimal performance # Original limits (MemoryMax=500M, CPUQuota=50%) caused performance issues # Uncomment and adjust for production if needed: # MemoryMax=8G # CPUQuota=200% # Security hardening - Relaxed for USB audio device access # Re-enable these in production if your audio devices don't require direct USB access: # PrivateTmp=true # ProtectSystem=strict # ProtectHome=read-only # ReadWritePaths=/tmp # ReadWritePaths=%h/.local/share/swictation # ReadWritePaths=%h/.cache/swictation # ReadWritePaths=%h/.config/swictation [Install] WantedBy=default.target