Voice: Discord-ähnliche Sprach- und Videoräume, jetzt im Discourse-Paket enthalten 🎙

Anfang dieses Jahres haben wir Resenha vorgestellt, ein Experiment, das Discord-ähnliche Sprach- und Videochats direkt in Discourse integrieren sollte. Keine externen Apps erforderlich, nur Peer-to-Peer-WebRTC in deiner Seitenleiste.

Das Experiment war erfolgreich. Wir nutzen es seitdem für unsere eigenen Meetings, und heute wird es offiziell: Resenha heißt jetzt Voice und wird als Kern-Plugin mit jeder Discourse-Installation ausgeliefert. :tada:

Was du bekommst

  • Seitenleisten-First-Räume — klicke, um beizutreten oder zu verlassen, siehst du Live-Avatare der Teilnehmer mit animierten Sprechindikatoren und kannst gleichzeitig im Forum stöbern, während du sprichst. Kein Routenwechsel, kein Popup-Fenster.
  • Video- und Bildschirmtrennung — jeder Raum erhält eine Vollseite mit einem Kachelraster; Kamera- und Bildschirmfreigabe werden sofort umgeschaltet, und die Qualität skaliert automatisch mit der Anzahl der Zuschauer.
  • Hintergrundunschärfe — MediaPipe-Personensegmentierung, die vollständig in deinem Browser läuft, mit Live-Vorschau und einstellbarer Intensität.
  • Geräuschunterdrückung — wähle zwischen drei KI-Engines (RNNoise, DTLN, DeepFilterNet3), die als WebAssembly-Audio-Worklets laufen, von leichtgewichtig bis Studioqualität.
  • Live-Untertitel — optional, Zuschauer-seitige Untertitel, angetrieben von NVIDIA Parakeet Spracherkennung, die lokal über WebGPU läuft. Mehrsprachig, und kein Audio verlässt deinen Browser.
  • Direktanrufe — rufe jemanden direkt von seiner Benutzerkarte oder seinem Profil aus an.
  • Textchat pro Raum — unterstützt durch echten Discourse-Chat: Jeder Anruf erhält seinen eigenen Thread im Chat-Kanal des Raums.
  • Raumberechtigungen und -verwaltung — öffentliche, gruppenbeschränkte und private Räume; Erstellung von Räumen durch Benutzer nach Gruppen gesteuert; stummschalten, taub machen, Lautstärke pro Benutzer und Rausschmeißen.
  • Themenbasierte Audio-Hinweise — Beitritts-/Verlassens- und Anrufsignale folgen deinem Chat-Benachrichtigungstong-Paket, sodass Voice sich wie der Rest deiner Website anhört.

So funktioniert es

Standardmäßig läuft alles Peer-to-Peer: Dein Discourse-Server verarbeitet nur das Signaling, und die Medien fließen direkt zwischen den Teilnehmern mit DTLS-SRTP-Verschlüsselung. Keine zusätzliche Infrastruktur, ideal für Räume mit bis zu ~50 Personen per Sprache oder bis zu 10 mit Video.

Die gesamte Audio- und Videoverarbeitung (Geräuschunterdrückung, Hintergrundunschärfe, Untertitel) wird lokal auf dem Gerät jedes Teilnehmers ausgeführt. Nichts wird an Dritte gesendet.

Brauchst du größere Anrufe? Weise das Plugin auf einen Cloud- oder selbst gehosteten LiveKit-Server hin und leite alle Räume (oder nur einige) darüber. Jeder Teilnehmer veröffentlicht dann jedes Track genau einmal, unabhängig von der Raumgröße. Über LiveKit geleitete Räume können auch Anrufe aufnehmen, wobei die Aufnahme direkt aus der Raum-UI in Discourse gesteuert wird.

So aktivierst du es

:discourse: Voice ist auf allen unseren Hosting-Plänen verfügbar. Die LiveKit-Integration für größere Anrufe ist auf unseren Business- und Enterprise-Plänen verfügbar; Selbst-Hoster :discourse-bw: können es auf ihren eigenen LiveKit-Server zeigen lassen.

Voice ist mit Discourse gebündelt, es muss also nichts installiert werden. Aktiviere es über Admin > Einstellungen > Plugins > voice enabled. Das Plugin erstellt einen Standard-„Watercooler“-Raum, damit es sofort einen Ort zum Verweilen gibt.

Von dort aus steuert voice_allowed_groups, wer Räume beitreten kann, und voice_create_room_allowed_groups, wer sie erstellen kann (standardmäßig Admins, Moderatoren und TL2). Video ist standardmäßig aktiviert; Untertitel sind optional über voice_subtitles_enabled (dafür wird WebGPU benötigt).

Falls du das Resenha-Plugin aus meinem persönlichen Repository ausgeführt hast, entferne es bei Gelegenheit aus deiner app.yml, da das gebündelte Voice-Plugin es ersetzt.

Status

Dies ist noch in einer frühen Phase. Wir nutzen es seit Monaten täglich intern und es funktioniert sehr gut für kleine Gruppen, aber teste es mit deinem Team, bevor du es für eine ganze Community öffnest. Auf dem standardmäßigen Peer-to-Peer-Pfad gibt es keine Anrufaufzeichnung, und Moderationstools über Benutzer-Flags, Rausschmeißen und „Anruf beenden“ hinaus sind noch auf der Roadmap.

Feedback willkommen

Probiere es aus und lass uns wissen, wie es läuft! Bugs, Ideen und Fragen sind in diesem Thema alle willkommen. Auch PRs, jetzt einfacher denn je: Der Code befindet sich im Kernbereich. :microphone:

24 „Gefällt mir“

Moment … was … Video auch?

Man's Mind Blown Reaction

Fantastisch!

6 „Gefällt mir“

Wow, wirklich?

Gibt es Anweisungen, wie man das auf selbst gehosteten Instanzen testen kann? Zum Beispiel mit einem separaten Docker-Container?

2 „Gefällt mir“

Führe einfach ein Update auf die neueste Version mit einem Rebuild durch und aktiviere das neue Plugin auf der Admin-Seite. Es ist nichts weiter nötig.

5 „Gefällt mir“

Meinst du nicht eher Discourse-ähnliche Sprach- und Videoräume? :innocent: :grin:

2 „Gefällt mir“

Kann ich also die öffentlichen/privaten Schlüssel in Nats, die Unterdomainen, den Coturn-Server und alle Skripte, die ich zu erstellen versuchte, einfach beiseitelegen, um einen sicheren Livekit-Server als Brücke zu haben?

Auch wenn ich daran weiterarbeiten muss, danke dir, dass du das gebaut hast!

1 „Gefällt mir“

Ich meine, wenn du einen dedizierten Coturn für STUN/TURN auf deiner Instanz haben möchtest, tu das ruhig. Gleiches gilt für LiveKit; wenn du es verwenden möchtest, sei es dir recht.

Es ist nicht zwingend erforderlich, um Anrufe direkt aus dem Karton heraus durchzuführen, aber wir bieten diese Flexibilität an.

1 „Gefällt mir“