A Bitfocus Companion module to control a Mumble VoIP server as a broadcast intercom system using Elgato Stream Deck.
graph LR
subgraph SD["🎛️ Stream Deck XL"]
B1["CAM 1<br/>MUTED"]
B2["CAM 2<br/>TALKING"]
B3["CAM 3<br/>WANTS TALK"]
B4["MUTE ALL"]
B5["STATUS<br/>8on 3opn"]
end
subgraph CP["⚙️ Companion + Module"]
MOD["mumble-intercom<br/>─────────────<br/>✓ Voice Detection<br/>✓ Server Mute<br/>✓ User Tracking"]
end
subgraph MS["🖥️ Mumble Server"]
U1["🎤 Camera 1"]
U2["🔇 Camera 2"]
U3["🎤 Audio Op"]
end
subgraph CREW["📱 Crew · 4G/WiFi"]
C1["Camera Op 1"]
C2["Camera Op 2"]
C3["Audio Op"]
end
SD -- "Actions" --> CP
CP -- "TLS + Protobuf" --> MS
MS -. "Voice Packets" .-> CP
MS <-. "4G / WiFi" .-> CREW
style SD fill:#1c2530,stroke:#3a4a5a,color:#e8edf3
style CP fill:#1c2530,stroke:#4a9eff,color:#e8edf3
style MS fill:#1c2530,stroke:#44aa44,color:#e8edf3
style CREW fill:#1c2530,stroke:#3a4a5a,color:#e8edf3
Designed for live production directors who need to manage crew communications from a physical control surface — mute/unmute camera operators, see who's talking, and manage the intercom bus in real time.
Why Mumble? Free, open-source, low-latency, runs on everything (phones, laptops, desktops), works over 4G/WiFi, and now you can control it from your Stream Deck.
- 🎙️ Server-side mute/unmute — Mute and unmute users directly on the Mumble server
- 🟢 Real-time voice activity detection — See who's talking with color-coded buttons
- 🎛️ Up to 16 user slots — Map each button to a camera operator or crew member
- ⚡ Instant feedback — Sub-second visual response to voice activity
- 🔌 Zero native dependencies — Pure JavaScript implementation, works on Windows/macOS/Linux without build tools
- 📦 Drag-and-drop presets — Pre-configured buttons ready to use
| Color | State | Meaning |
|---|---|---|
| ⬛ Dark Grey | OFFLINE | User not connected to Mumble |
| 🔘 Grey | MUTED | User online, muted by director |
| 🟡 Yellow | WANTS TALK | User is speaking but muted — wants attention |
| 🔴 Red | OPEN | User is unmuted (mic open), not speaking |
| 🟢 Green | TALKING | User is unmuted and actively speaking |
- Bitfocus Companion v4.x
- A running Murmur (Mumble server)
- The bot user must have admin permissions on the Mumble server to mute/unmute other users
- Download or clone this repository
- Install dependencies and build:
cd companion-module-mumble-intercom
npm install
npx tsc -p tsconfig.json- Open the Companion Launcher → ⚙ Settings:
- Enable "Developer Modules"
- Set the developer modules path to the parent folder containing this module
- Restart Companion
- The module appears in Connections as "Mumble: Mumble Server"
| Setting | Description |
|---|---|
| Server Host | Hostname or IP address of your Murmur server |
| Port | Mumble server port (default: 64738) |
| Bot Username | Unique name for the bot (e.g. Director_Bot) |
| Server Password | Server password, if required |
Configure up to 16 slots, each mapped to a Mumble username. The username must match exactly (case-sensitive).
| Setting | Example |
|---|---|
| Slot 1 - Mumble Username | Camera1 |
| Slot 2 - Mumble Username | Camera2 |
| Slot 3 - Mumble Username | Audio_Op |
| ... | ... |
The bot needs admin rights to mute/unmute users on the server:
- Connect to Mumble as a user with admin privileges (or as
SuperUser) - Right-click the Root channel → Edit...
- Go to the Groups tab
- Select the admin group
- Add the bot username (e.g.
Director_Bot) to the Members list - Click OK
If you need to set the SuperUser password on your Murmur server:
murmurd -supw <your-password>| Action | Description |
|---|---|
| Toggle Slot Mute | Toggle server mute/unmute for a user slot |
| Mute Slot | Server mute a specific user slot |
| Unmute Slot (Open) | Server unmute a specific user slot |
| Open All Slots | Unmute all configured user slots |
| Mute All Slots | Mute all configured user slots |
| Feedback | Type | Description |
|---|---|---|
| User Slot Status | Advanced | Changes button color based on user state |
| User Is Talking | Boolean | True when user is actively speaking |
All variables use your connection label as prefix (default: mumble).
| Variable | Description |
|---|---|
$(mumble:slot_N_status) |
Status text: OFFLINE / MUTED / WANTS TALK / OPEN / TALKING |
$(mumble:slot_N_name) |
Configured username for slot N |
$(mumble:slot_N_online) |
Whether user is connected (Yes/No) |
$(mumble:slot_N_talking) |
Whether user is speaking (Yes/No) |
$(mumble:slot_N_muted) |
Whether user is muted (Yes/No) |
$(mumble:users_online) |
Count of online users |
$(mumble:users_open) |
Count of unmuted users |
$(mumble:connected) |
Whether module is connected (Yes/No) |
Stream Deck XL Layout (example):
┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│ Camera1 │ Camera2 │ Camera3 │ Camera4 │ Camera5 │ Camera6 │ Camera7 │ Camera8 │
│ MUTED │ TALKING │ OFFLINE │ OPEN │ MUTED │ MUTED │ OFFLINE │ MUTED │
├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Audio_Op │ Graphics │ Replay │ Floor │ STATUS │ │ MUTE ALL │ OPEN ALL │
│ OPEN │ MUTED │ OFFLINE │ TALKING │ 8on 3opn │ │ │ │
└─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘
The director can:
- See at a glance who's online, talking, or trying to talk
- Tap once to toggle any crew member's mic
- Mute/Open All for scene transitions
- Spot the yellow — someone muted wants to speak!
- Status button — Always see a live count of online and open users
The module includes ready-to-use button presets. Go to the Presets tab in Companion and drag them onto your Stream Deck.
| Preset | Category | Description |
|---|---|---|
| Slot 1–16 | Camera Slots | Toggle mute button per user, with status text and color feedback |
| Open All | Control | Unmute all configured slots (green) |
| Mute All | Control | Mute all configured slots (red) |
| Status | Info | Displays live count of online users and open (unmuted) users |
The Status button shows Online: X / Open: Y and updates in real time — useful to keep at a glance how many crew members are connected and active.
This module implements the Mumble protocol directly using:
- Node.js
tlsmodule for encrypted connection to Murmur - protobufjs for Mumble protocol message encoding/decoding
- UDPTunnel over TCP for voice activity detection (audio packets are tunneled through the TLS connection)
No native dependencies — no node-gyp, no C++ compilation needed.
| Message | Type ID | Purpose |
|---|---|---|
| Version | 0 | Protocol handshake |
| UDPTunnel | 1 | Voice data (activity detection) |
| Authenticate | 2 | Login with username/password |
| Ping | 3 | Keep connection alive |
| Reject | 4 | Authentication rejection |
| ServerSync | 7 | Connection established |
| UserState | 9 | User join/leave/mute state |
| UserRemove | 11 | User disconnected |
| CryptSetup | 15 | Encryption setup for voice tunnel |
Contributions are welcome! This module was created for the broadcast community.
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
MIT License — see LICENSE for details.