Voice: salas de voz y vídeo estilo Discord, ahora incluidas con Discourse 🎙

A principios de este año compartimos Resenha, un experimento que añadía salas de voz y vídeo estilo Discord directamente a Discourse. Sin necesidad de aplicaciones externas, solo WebRTC entre pares en tu barra lateral.

El experimento funcionó. Lo hemos estado usando para nuestras propias reuniones desde entonces, y hoy se gradúa: Resenha ahora se llama Voice (Voz), y se distribuye como un plugin de núcleo incluido en cada instalación de Discourse. :tada:

Lo que obtienes

  • Salas centradas en la barra lateral — haz clic para unirte o salir, ve los avatares en vivo de los participantes con indicadores de habla animados y sigue navegando por el foro mientras hablas. Sin cambio de ruta, sin ventana emergente.
  • Vídeo y compartir pantalla — cada sala obtiene una página completa con una cuadrícula de mosaicos; la cámara y el compartir pantalla se activan al instante, y la calidad se escala automáticamente según el número de espectadores.
  • Desenfoque de fondo — segmentación de personas con MediaPipe ejecutándose por completo en tu navegador, con una vista previa en vivo y fuerza ajustable.
  • Supresión de ruido — elige entre tres motores de IA (RNNoise, DTLN, DeepFilterNet3) que se ejecutan como worklets de audio WebAssembly, desde livianos hasta de grado de estudio.
  • Subtítulos en vivo — opcionales, subtítulos del lado del espectador impulsados por el reconocimiento de voz NVIDIA Parakeet ejecutándose localmente vía WebGPU. Multilingüe, y ningún audio sale nunca de tu navegador.
  • Llamadas directas — llama a alguien directamente desde su tarjeta de usuario o perfil.
  • Chat de texto por sala — respaldado por el chat real de Discourse: cada llamada obtiene su propio hilo en el canal de chat de la sala.
  • Permisos y gestión de salas — salas públicas, restringidas por grupo y privadas; creación de salas por usuarios controlada por grupos; silenciar, sordina, volumen por usuario y expulsar.
  • Indicadores de audio con tema — los tonos de entrada/salida y llamada siguen tu paquete de sonidos de notificación de chat, por lo que Voice suena como el resto de tu sitio.

Cómo funciona

Por defecto, todo es entre pares: tu servidor de Discourse solo maneja la señalización, y los medios fluyen directamente entre los participantes con cifrado DTLS-SRTP. Cero infraestructura adicional, ideal para salas de hasta ~50 personas en voz, o hasta 10 con vídeo.

Todo el procesamiento de audio y vídeo (supresión de ruido, desenfoque de fondo, subtítulos) se ejecuta localmente en el dispositivo de cada participante. Nada se envía a terceros.

¿Necesitas llamadas más grandes? Apunta el plugin a un servidor en la nube o autoalojado de LiveKit y enruta todas las salas (o solo algunas) a través de él. Cada participante luego publica cada pista exactamente una vez, sin importar el tamaño de la sala. Las salas enrutadas por LiveKit también pueden grabar llamadas, con la grabación controlada directamente desde la interfaz de la sala en Discourse.

Cómo activarlo

:discourse: Voice está disponible en todos nuestros planes de alojamiento. La integración de LiveKit para llamadas más grandes está disponible en nuestros planes Business y Enterprise; los autoalojadores :discourse-bw: pueden apuntarlo a su propio servidor LiveKit.

Voice viene incluido con Discourse, por lo que no hay nada que instalar. Actívalo a través de Admin > Settings > Plugins > voice enabled. El plugin crea una sala predeterminada “Watercooler” para que haya un lugar para estar desde el principio.

A partir de ahí, voice_allowed_groups controla quién puede unirse a las salas, y voice_create_room_allowed_groups controla quién puede crearlas (administradores, moderadores y TL2 por defecto). El vídeo está activado por defecto; los subtítulos son opcionales mediante voice_subtitles_enabled (requieren WebGPU).

Si estabas ejecutando el plugin Resenha desde mi repositorio personal, elimínalo de tu app.yml cuando tengas la oportunidad, ya que el plugin Voice incluido lo reemplaza.

Estado

Esto aún es temprano. Lo hemos estado usando internamente a diario durante meses y funciona muy bien para grupos pequeños, pero pruébalo con tu equipo antes de abrirlo a toda una comunidad. No hay grabación de llamadas en la ruta predeterminada entre pares, y las herramientas de moderación más allá de las banderas de usuario, expulsión y “Terminar llamada” aún están en la hoja de ruta.

Comentarios bienvenidos

Pruébalo y dinos cómo te va. ¡Los errores, ideas y preguntas son todos bienvenidos en este tema! También los PR, ahora más fáciles que nunca: el código está en core. :microphone:

24 Me gusta

espera … ¿qué … ¿video también?

Man's Mind Blown Reaction

¡fantástico!

6 Me gusta

Vaya, ¿en serio?

¿Hay alguna instrucción para probar esto en instancias autoalojadas? Por ejemplo, con algún contenedor de Docker separado?

2 Me gusta

Solo actualiza a la última versión con una reconstrucción y habilita el nuevo plugin en la página de administración. No es necesario hacer nada más.

5 Me gusta

Creo que te refieres a salas de voz y vídeo estilo Discourse? :innocent: :grin:

2 Me gusta

¿Entonces puedo dejar de lado las claves pública/privada en Nats, los subdominios, el servidor Coturn y todos los scripts que estaba intentando crear, para tener un servidor Livekit seguro como puente?

Incluso si tengo que seguir trabajando en ello, ¡gracias por haber construido esto!

1 me gusta

Quiero decir, si quieres tener un Coturn dedicado para STUN/TURN en tu instancia, adelante. Lo mismo con LiveKit; si quieres usarlo, no hay problema.

No es obligatorio para hacer llamadas con la configuración predeterminada, pero ofrecemos esa flexibilidad.

1 me gusta