OBS hotkeys and Stream Deck control Beta

Last updated October 1, 2026 For: Tech directors who automate OBS with hotkeys, Stream Deck or Companion

On this page

You can control SermonWave in OBS without touching the dock: with OBS's own hotkeys, or from a Stream Deck or Bitfocus Companion through obs-websocket. This article explains what's available and what isn't yet.

Who it's for#

Tech directors who already drive OBS with hotkeys, an Elgato Stream Deck, Bitfocus Companion or a similar controller.

Before you start#

  • The plugin is installed and paired. See Pair OBS with SermonWave.
  • For Stream Deck / Companion: the obs-websocket server is enabled in OBS (Tools → WebSocket Server Settings → Enable WebSocket server). It's built into OBS 28 and later.
  • Your controller can send a raw obs-websocket request (for example Companion's OBS module with a custom request, or a Stream Deck plugin that supports CallVendorRequest).

Hotkeys#

The SermonWave plugin does not add hotkeys of its own to OBS Settings → Hotkeys in this Beta. You won't find "SermonWave" entries there.

You usually don't need them, because translation follows OBS:

  1. In the dock, set Translate when to Streaming, Recording or Streaming or recording. See Set up audio, languages and start/stop in OBS.
  2. In OBS Settings → Hotkeys, assign keys to OBS's built-in Start Streaming / Stop Streaming and Start Recording / Stop Recording.
  3. Pressing those keys now starts and stops translation, translated streams and translated recordings together.
OBS Settings > Hotkeys with Start Streaming and Start Recording assigned

obs-websocket vendor requests#

The plugin registers an obs-websocket vendor named sermonwave. Any obs-websocket client can call it with the standard CallVendorRequest request:

{
  "requestType": "CallVendorRequest",
  "requestData": {
    "vendorName": "sermonwave",
    "requestType": "get_state",
    "requestData": {}
  }
}

Languages are given as short codes, for example es, fr, pt.

Useful requests#

Request typeRequest dataWhat it does
get_state—Pairing, device number, device languages, caption language, health.
get_outputs—Per language: stream/recording state, bitrate, dropped frames, re-sync progress, YouTube state and watch link.
set_outputlanguage plus any of the fields belowChanges one language's panel.
add_languagelanguageSame as Add language.
remove_languagelanguageSame as Remove.
set_sync_delaysync_delay_ms (4000–15000)Sets the Sync delay.
set_languagessource_language, target_languages (list of {"code": "es"})Saves the device's languages, like Save languages. Changes the device for everyone.
set_youtube_channelchannelSaves Channel for /listen.
youtube_state—YouTube sign-in and broadcast state.
youtube_settingsprivacy (unlisted, public, private), title_templateSets YouTube privacy and title.
youtube_keysrefresh (true/false)Lists your channel's stream keys.
collect_diagnosticsreasonSends a diagnostics report to SermonWave support now.

set_output fields#

All optional except language:

  • stream_now: "start" or "stop" — same as Start now / Stop now.
  • stream_enabled, record_enabled, room (true/false) — Stream …, Record a … copy, Play … in the room.
  • preset: youtube_rtmps, youtube_rtmps_backup, youtube_rtmp, facebook, custom; or destination: youtube_auto for YouTube (automatic).
  • server, key — server and stream key for a manual platform.
  • sync_video, stream_captions, record_captions, captions_default, resync, keep_live (true/false).
  • bg_db, bg_off, duck_db — Original audio level, Original audio Off, and Under translation level, in dB.

Examples#

Start the Spanish translated stream now:

{
  "requestType": "CallVendorRequest",
  "requestData": {
    "vendorName": "sermonwave",
    "requestType": "set_output",
    "requestData": { "language": "es", "stream_now": "start" }
  }
}

Toggle in-room playback of French on:

{
  "requestType": "CallVendorRequest",
  "requestData": {
    "vendorName": "sermonwave",
    "requestType": "set_output",
    "requestData": { "language": "fr", "room": true }
  }
}

Lower the original sound under the Spanish translation to −25 dB:

{
  "requestType": "CallVendorRequest",
  "requestData": {
    "vendorName": "sermonwave",
    "requestType": "set_output",
    "requestData": { "language": "es", "duck_db": -25 }
  }
}

The response comes back in the responseData of the reply. Requests like set_output answer {"ok": true} right away; check the result with get_outputs.

Troubleshooting#

The request fails with an unknown vendor. obs-websocket was not running when OBS loaded the plugin, or the plugin isn't installed. Enable the WebSocket server and restart OBS.

set_output returns ok: false. The language field is missing.

Nothing happens for a language. Make sure that language was added under Languages (or call add_language first).

FAQ#

Will SermonWave hotkeys come later?#

Possibly. Today, use OBS's own stream and record hotkeys, or the requests above.

Is the obs-websocket connection secure?#

It's local to your network. Keep Enable Authentication on in the WebSocket Server Settings and use the password in your controller.