지난해 말, 우리는 Resenha라는 실험적 프로젝트를 공개했습니다. 이 프로젝트는 Discord 스타일의 음성 및 비디오 룸을 Discourse에 직접 추가하는 것이었습니다. 외부 앱이 필요 없으며, 사이드바에서 피어-투-피어(P2P) WebRTC를 통해 작동합니다.
이 실험은 성공적이었습니다. 우리는 그 이후로 자체 회의에 이 기능을 사용하고 있으며, 오늘 드디어 정식 버전으로 거듭납니다. Resenha는 이제 Voice라는 이름으로, 모든 Discourse 설치 패키지에 포함된 핵심 플러그인으로 제공됩니다. ![]()
제공되는 기능
- 사이드바 중심의 룸 — 클릭하여 입장하거나 나가고, 애니메이션된 발화 표시기가 있는 실시간 참가자 아바타를 확인하며, 대화하는 동안에도 포럼을 계속 둘러볼 수 있습니다. 라우트 변경이나 팝업 창 없이, 컴팩트한 통화 위젯이 사이트 곳곳을 따라다닙니다.
- 비디오 및 화면 공유 — 각 룸에는 타일 그리드가 있는 전체 페이지가 제공되며, 카메라 및 화면 공유는 즉시 전환되고, 화질은 시청자 수에 따라 자동으로 조절됩니다.
- 배경 흐림 처리 — MediaPipe 인물 분할이 브라우저 내에서 완전히 실행되며, 실시간 미리보기와 강도 조절이 가능합니다.
- 노이즈 서프레션(소음 제거) — WebAssembly 오디오 워크렛으로 실행되는 세 가지 AI 엔진(RNNoise, DTLN, DeepFilterNet3) 중 선택할 수 있으며, 가벼운 수준부터 스튜디오급까지 지원됩니다.
- 실시간 자막 — 옵트인 방식의 시청자 측 자막으로, NVIDIA Parakeet 음성 인식 엔진이 WebGPU를 통해 로컬에서 실행됩니다. 다국어 지원, 최첨단 기술, 로컬 AI. 통화 전사를 토픽 초안으로 직접 기록할 수도 있습니다.
- 직접 통화 — 사용자 카드나 프로필에서 바로 누군가에게 통화를 걸 수 있습니다.
- 룸별 텍스트 채팅 — 실제 Discourse 채팅으로 뒷받침됩니다: 각 통화는 해당 룸의 채팅 채널에서 별도의 스레드를 생성합니다.
- 룸 권한 및 관리 — 공개, 그룹 제한, 비공개 룸; 그룹에 기반한 사용자 룸 생성 권한; 음소거, 디afen(마이크 및 스피커 끔), 사용자별 볼륨 조절, 강퇴 기능.
- 테마 기반 오디오 큐 — 입장/나감과 통화 음향은 채팅 알림 사운드 팩을 따르므로, Voice의 사운드가 사이트의 나머지 부분과 일관성을 유지합니다.
작동 방식
기본적으로 모든 것이 피어-투-피어(P2P) 방식으로 작동합니다. Discourse 서버는 시그널링(signaling)만 처리하고, 미디어는 DTLS-SRTP 암호화를 통해 참가자 간에 직접 전송됩니다. 추가 인프라가 전혀 필요 없으며, 음성 기준 최대 약 50명, 비디오 기준 최대 10명 규모의 룸에 이상적입니다.
모든 오디오 및 비디오 처리(노이즈 서프레션, 배경 흐림, 자막)는 각 참가자의 기기에서 로컬로 실행됩니다. 제3자에게 아무것도 전송되지 않습니다.
더 큰 규모의 통화가 필요합니까? 플러그인을 클라우드 또는 셀프호스팅 LiveKit 서버를 가리키도록 설정하고, 모든 룸(또는 일부 룸)을 이를 통해 라우팅하십시오. 그러면 각 참가자는 룸 크기와 관계없이 모든 트랙을 정확히 한 번만 게시하게 됩니다. LiveKit을 통해 라우팅된 룸에서는 통화를 녹음할 수도 있으며, 녹음은 Discourse의 룸 UI에서 바로 제어할 수 있습니다.
활성화 방법
Voice는 저희의 모든 호스팅 플랜에서 사용할 수 있습니다. 대규모 통화를 위한 LiveKit 통합은 Business 및 Enterprise 플랜에서 사용할 수 있으며, 셀프호스터
는 자체 LiveKit 서버를 지정할 수 있습니다.
Voice는 Discourse에 번들로 포함되어 있으므로 설치할 것이 없습니다. 관리자 > 설정 > 플러그인 > voice enabled를 통해 활성화하십시오. 이 플러그인은 기본 “Watercooler” 룸을 시드하여, 바로 모임을 가질 수 있는 공간을 제공합니다.
그 후, voice_allowed_groups는 누가 룸에 참여할 수 있는지를, voice_create_room_allowed_groups는 누가 룸을 생성할 수 있는지를 제어합니다(기본값은 관리자, 모더레이터, TL2). 비디오는 기본적으로 켜져 있습니다. 직접 통화는 voice_direct_calls_allowed_groups에서 일부 그룹을 선택할 때까지 꺼져 있으며, 자막은 voice_subtitles_enabled을 통해 옵트인 방식으로 활성화됩니다(WebGPU가 필요하며, 각 사용자는 약 2.5GB 크기의 모델을 한 번 다운로드해야 합니다).
개인 저장소에서 Resenha 플러그인을 실행 중이셨다면, 번들로 제공되는 Voice 플러그인이 이를 대체하므로 가능할 때 app.yml에서 제거해 주십시오.
현황
아직 초기 단계입니다. 수개월간 매일 내부적으로 사용하며 테스트해 왔으며, 소규모 그룹에게는 매우 잘 작동하지만, 전체 커뮤니티에 공개하기 전에 팀에서 먼저 테스트해 보시기 바랍니다. 기본 P2P 경로에는 통화 녹음 기능이 없으며, 사용자 플래그, 강퇴, "통화 종료"를 제외한 모더레이션 도구는 아직 로드맵에 남아 있습니다.
피드백 환영
직접 사용해 보고 어떻게 작동하는지 알려주세요! 버그, 아이디어, 질문은 모두 이 토픽에서 환영합니다. PR도 환영하며, 이제 그 어느 때보다 쉬워졌습니다: 코드는 core에 있습니다. ![]()






