<%- include("../../../src/web/views/partials/page-header", { eyebrow: "Experimental companion", pageTitle: "Lumi Transcription", description: "Server-hosted speech recognition for selected OBS sources, managed through one Lumi Companion application." }) %> <%= providerHealth.healthy ? 'Inference ready' : 'Setup required' %>
Live Twitch delivery is not accepted yet

The native OBS 31+ caption path still needs target-machine validation. Lumi will not present a local simulated caption as live Twitch success.

First usable path

Setup progress

Complete one clear step at a time. Existing server administration remains in Lumi; streaming-computer controls remain in Companion.

  1. Download and pair CompanionCreate a short-lived, single-use package for the streaming computer.
  2. Install the OBS integrationCompanion owns installation and repair; the bridge has no separate settings.
  3. Load and benchmark a modelSmall English is the recommended starting point.
  4. Select and test a microphoneThe real safe test must pass before live delivery is enabled.
Review speech models

Lumi host

Inference health

Speech recognition runs on the Lumi server, never on the streaming computer.

Providerwhisper.cpp <%= runtimeManifest.tested_version %>
Worker<%= providerHealth.state %>
Selected model<%= providerHealth.model || 'Not loaded' %>
Active sessions<%= providerHealth.sessions || 0 %>
Shared GPU awareness

Lumi warns and benchmarks when Lumi AI already occupies GPU memory. It never unloads AI models automatically.

Access

Paired devices

Credentials are revocable and scoped to Companion capabilities.

<%= devices.filter((device) => !device.revoked_at).length %> active
<% if (!devices.length) { %>
No Companion is paired

Use Download Companion to create a package that expires after 15 minutes and works once.

<% } %> <% if (devices.length) { %> <% } %>
Curated choices

Speech models

Downloads require confirmation and checksum verification before a model can load.

<% models.forEach((model) => { %>

<%= model.label %>

<%= model.recommended ? 'Recommended starting point' : 'Fallback option' %> ยท <%= Math.round(model.bytes / 1048576) %> MiB

<%= providerHealth.model === model.id ? 'Loaded' : model.status.valid ? 'Verified' : model.status.installed ? 'Checksum failed' : 'Not installed' %> <% if (!model.status.valid) { %><% } %> <% if (model.status.valid && providerHealth.model !== model.id) { %><% } %>
<% }) %>
Audio privacy

Raw audio is held only in bounded memory and is never written to disk by default. Diagnostic caption text is retained for seven days unless disabled.