:64738

Mumble Bridge

Audio bidireccional → <audio> en browser

Pipeline Completo

 MIC (ALSA)                                         BROWSER (sin JS)
     │                                                    ▲
     ▼                                                    │
 ┌──────────┐    Opus     ┌────────────┐   OGG/HTTP  ┌───┴──────┐
 │ murmurd  │◀═══════════▷│ gumble bot │────────────▷│ <audio>  │
 │ :64738   │  (Mumble    │  ↓ PCM     │  chunked    │ autoplay │
 │          │   protocol) │  ffmpeg    │  transfer   │          │
 └──────────┘             └────────────┘             └──────────┘
                                │
                          Oasis :3000
                          GET /audio

Key Concept: ¿Por Qué Mumble y No go2rtc ALSA?

go2rtc SÍ captura ALSA directamente y puede servir audio. Pero no es bidireccional — solo downstream. Mumble = full-duplex + ya instalado + Tor (TCP tunnel). Usar Mumble para audio es la decisión correcta incluso cuando go2rtc está disponible.
OpciónBidireccionalTorRAM extraYa instalado
Mumble (elegida)✔ nativo+0 MB
go2rtc ALSA✘ solo send⚠️+0 (ya corre)
ffmpeg ALSA→OGG✘ solo send~15 MB

3 Estrategias para Bridge Mumble → Browser

3A: Bridge HTTP ★3B: mumble-web3C: Cliente nativo
JS en browser✘ No✔ Sí (viola restricción)✘ No
Apps necesariasSolo navegadorSolo navegadorNavegador + Mumble app
Código nuevo~100 lín bridgeInstalar mumble-web + proxy~10 lín (URL mumble://)
Latencia audio~200 ms~50 ms (WebRTC)~20 ms (UDP nativo)
Bidireccional⚠️ Complejo✔ Nativo✔ Nativo
Tor⚠️ (WebRTC→TURN)✔ (TCP tunnel)
Elegida: 3A (bridge HTTP) para la UI unificada del SNH + 3C (cliente nativo) como experiencia premium para el peer remoto. Ambas son compatibles simultáneamente.

Implementación del Bridge (Estrategia 3A)

Recomendada: gumble (Go) → ffmpeg pipe
# Bot gumble captura audio del canal → stdout PCM 16-bit 48kHz mono # ffmpeg re-codifica a OGG/Opus para streaming HTTP mumble-audio-bridge --server localhost:64738 --channel "WebRTC" \ | ffmpeg -f s16le -ar 48000 -ac 1 -i pipe:0 \ -c:a libopus -application voip -b:a 32k \ -f ogg pipe:1 \ | serve-as-http --port 3001 --content-type "audio/ogg"
gumble (Go, github.com/layeh/gumble) se compila como binario estático ARM64 (~5 MB). Conecta a murmurd, captura el audio mezclado del canal, y lo escribe a stdout como PCM raw. No necesita runtime.
Oasis route (/audio)
// Endpoint HTTP mínimo (~30 líneas en Node.js/Koa) app.get('/audio', (req, res) => { res.writeHead(200, { 'Content-Type': 'audio/ogg', 'Transfer-Encoding': 'chunked', 'Cache-Control': 'no-store' }); bridge.stdout.pipe(res); req.on('close', () => bridge.stdout.unpipe(res)); });
Alternativa legacy: Node.js mumble-client
// node-mumble — ⚠️ no mantenido desde 2019 // bindings nativos rompen con Node.js recientes // Solo referencia; preferir gumble (Go) const mumble = require('mumble'); mumble.connect('mumble://127.0.0.1:64738', (err, conn) => { conn.authenticate('oasis-bridge'); conn.on('voice', (pcmBuffer) => { /* ... */ }); });
⚠️ ffmpeg NO tiene handler nativo mumble:// — el comando ffmpeg -i mumble://... NO funciona sin compilación custom. El pipeline correcto es: bot gumble → stdout PCM → pipe a ffmpeg.

Legitimidad: ¿Es Válido Usar murmurd con un Bot?

Sí. murmurd como bus de audio con un bot bridge es un patrón establecido, no un hack. El protocolo Mumble no distingue entre un cliente humano y un bot — esto es by design.
PrecedenteDescripción
MumbleDJBot Go que inyecta audio (música) en canales Mumble
piepanFramework Lua para scripting de bots Mumble
barnardCliente Mumble CLI en Go (usa gumble)
murmurd ofrece mezclador, Opus, jitter buffer, AGC, cifrado — reimplementar esto sería absurdo cuando ya corre y consume +0 MB extra.

Audio Bidireccional

DirecciónMecanismoLatenciaRequiere JS
SNH → Browsermurmurd → bridge → <audio>~200 ms
Peer → SNH (nativo)Cliente Mumble nativo~20 ms
Peer → SNH (web)getUserMedia → DataChannel → murmurd~100 ms
Para audio upstream SIN JS: el peer usa un cliente Mumble nativo (Plumble Android, Mumble desktop). Bypasa el browser.

Budget de Latencia

EtapaLatencia
ALSA → murmurd~10-20 ms
Opus encode~5-10 ms
Bridge decode + OGG re-encode~20-40 ms
HTTP chunked (LAN)~5-10 ms
<audio> buffering~100-150 ms
TOTAL downstream~150-250 ms
Cliente nativo Mumble~20-30 ms

murmurd Config Relevante

# /etc/mumble-server.ini (fragmento) host=127.0.0.1 port=64738 opusthreshold=0 bandwidth=64000 users=5 textmessagelength=0 logdays=-1
Si murmurd escucha en 127.0.0.1, clientes externos entran vía Tor TCP tunnel o SSH port forward.

Keywords

Opus Vorbis OGG gumble ALSA chunked transfer bidireccional murmurd :64738 bridge ffmpeg