Nomla

TechnikTechnology

Wie Nomla aus deiner Stimme ein Gespräch macht, und alles, was dahintersteckt. Für die Einrichtung geht es hier entlang.

How Nomla turns your voice into a conversation, and everything behind it. For setting up, go here.

Der Weg deiner StimmeHow your voice travels

Vom Mikrofon bis zum Server läuft jeder Ton durch dieselbe Kette, in 10-Millisekunden-Schritten. Die Werte stehen so im Code.

Every sound runs through the same chain from microphone to server, in 10 millisecond steps. The values below are the ones in the code.

  1. AufnahmeCapture

    Nomla nimmt mit der normalen Mikrofonquelle auf, damit nicht die eigene Gesprächsverarbeitung des Handys vor Nomlas Echounterdrückung hängt: Zwei Echounterdrücker hintereinander zerhacken auf manchen Geräten die Sprache. Nur bei Bluetooth-Headsets oder auf Wunsch wird die Anrufquelle genutzt. Das Audio-Gerät wählt Nomla selbst: Headset vor Bluetooth vor Kabel vor Lautsprecher.

    Nomla records from the plain microphone source, so the phone's own call processing does not sit in front of Nomla's echo canceller: two echo suppressors in a row chop speech on some devices. Only Bluetooth headsets, or a setting, use the call source. Nomla picks the audio device itself: preferred headset, then Bluetooth, then wired, then speaker.

    Abtastrate
    Sample rate
    48 000 Hz
    Quelle
    Source
    MIC · VOICE_COMMUNICATION
    Modus
    Mode
    MODE_IN_COMMUNICATION
  2. Umrechnen auf 48 kHzResampling to 48 kHz

    Liefert ein Gerät eine andere Rate, rechnet der Resampler von speexdsp sie um. Alles danach arbeitet mit 48 kHz.

    If a device delivers another rate, the speexdsp resampler converts it. Everything after this works at 48 kHz.

    Bibliothek
    Library
    speexdsp 1.2.1
    Aktiv
    Active
    nur bei ≠ 48 kHz
    only at ≠ 48 kHz
  3. Echo und LautstärkeEcho and level

    Die WebRTC-Audioverarbeitung entfernt das Echo dessen, was gerade aus dem Lautsprecher kommt (AEC3), und regelt den Pegel (AGC2). Sie sitzt bewusst ganz vorne: Alles, was sich zeitlich verändert, würde sie davor am Einschwingen hindern. In jedem 10-ms-Schritt bekommt sie erst das, was abgespielt wird, und dann das Mikrofon. Ob das Echo unterdrückt wird, stellst du je Gerät ein: Lautsprecher, Hörmuschel, Bluetooth, Kabel.

    WebRTC audio processing removes the echo of what the speaker is playing (AEC3) and sets the level (AGC2). It sits at the very front on purpose: anything that changes over time in front of it would keep it from converging. In each 10 ms step it gets what is being played first, then the microphone. You switch echo cancellation per device: speaker, earpiece, Bluetooth, wired.

    Echo
    Echo
    WebRTC AEC3
    Pegel
    Level
    AGC2 + High-pass
    Version
    Version
    webrtc-audio-processing 2.1+
    Standard an
    On by default
    Lautsprecher, Hörmuschel
    speaker, earpiece
  4. RauschunterdrückungNoise suppression

    Zur Wahl stehen Speex („leicht“) oder RNNoise („stark“), ein kleines neuronales Netz. Damit RNNoise beim Gleichzeitig-Sprechen nicht die eigene Stimme frisst, lockert Nomla die Dämpfung, sobald die Gegenseite hörbar ist und du sprichst, und zieht sie danach wieder an.

    Choose Speex ("light") or RNNoise ("strong"), a small neural network. So RNNoise does not eat your own voice while both sides talk, Nomla eases the attenuation while the far end is audible and you speak, and tightens it again afterwards.

    Speex
    Speex
    −15 / −25 / −35 dB
    RNNoise-Grenze
    RNNoise limit
    18 dB (6–40 dB, unbegrenzt)
    18 dB (6–40 dB, unlimited)
    RNNoise-Latenz
    RNNoise latency
    2 × 480 samples (20 ms)
    Lockern
    Easing
    in ~20 ms, zurück mit 60 ms
    in ~20 ms, back with 60 ms
  5. Sprechen erkennenDetecting speech

    Bei Sprachaktivierung entscheidet eine Wahrscheinlichkeit mit Hysterese, ob gesendet wird, mit kurzer Nachlaufzeit, damit Wortenden nicht abgeschnitten werden. Alternativ Push-to-Talk (Bildschirmtaste, Hardware-Taste, Headset-Knopf, Overlay) oder Dauersenden.

    With voice activation, a probability with hysteresis decides when to transmit, with a short hold so word endings are not cut. Alternatively push-to-talk (on-screen button, hardware key, headset button, overlay) or continuous.

    Öffnen / Schließen
    Open / close
    p ≥ 0.6 / p < 0.3
    Nachlauf
    Hold
    250 ms
    Anlauf
    Onset
    0–30 ms
  6. Opus-KodierungOpus encoding

    Opus komprimiert die Sprache mit konstanter Bitrate und Fehlerkorrektur im Datenstrom, damit einzelne verlorene Pakete kaum auffallen. Ist die Verbindung schmal, rechnet Nomla wie das Desktop-Mumble den Overhead heraus und senkt die Bitrate.

    Opus compresses speech at a constant bitrate with in-band error correction, so single lost packets barely show. On a narrow link, Nomla subtracts the overhead like desktop Mumble does and lowers the bitrate.

    Codec
    Codec
    Opus 1.6.1, VOIP, mono
    Bitrate
    Bitrate
    40 kbit/s (mind. 8)
    40 kbit/s (min. 8)
    Rahmen
    Frames
    10 ms, 2 pro Paket
    10 ms, 2 per packet
    FEC
    FEC
    an, 10 % Verlust erwartet
    on, 10 % loss expected
  7. Verschlüsselt verschickenEncrypted transport

    Sprache geht verschlüsselt per UDP an den Server, bei Servern ab 1.5 im Protobuf-Format. Kommt per UDP nichts mehr an, schaltet Nomla von selbst auf einen Tunnel durch die TLS-Verbindung um – oder du erzwingst das von Anfang an.

    Voice goes to the server over encrypted UDP, in the protobuf format with servers from 1.5. When nothing gets through on UDP any more, Nomla switches to a tunnel through the TLS connection on its own – or you force that from the start.

    Verschlüsselung
    Encryption
    OCB2-AES128
    Umschalten auf TCP
    Fall back to TCP
    20 s ohne Pakete oder 15 s ohne Ping-Antwort
    20 s without packets or 15 s without ping reply
    Ping
    Ping
    alle 5 s
    every 5 s
  8. Mumble-ServerMumble server

    Nomla spricht das Mumble-Protokoll 1.5 und funktioniert mit jedem Mumble-Server. Bricht die Verbindung ab, versucht Nomla es mit wachsendem Abstand erneut.

    Nomla speaks Mumble protocol 1.5 and works with any Mumble server. When the connection drops, Nomla retries with growing pauses.

    Protokoll
    Protocol
    1.5.0, Port 64738
    Neu verbinden
    Reconnect
    2, 4, 8, 16, dann 30 s, bis zu 10 Versuche
    2, 4, 8, 16, then 30 s, up to 10 attempts

Und zurückAnd back

Was die anderen sagen, landet in einem Jitter-Puffer (speexdsp, 10 Rahmen Spielraum), der schwankende Paketlaufzeiten glättet, wird mit Opus dekodiert und auf dem gewählten Gerät abgespielt. Dasselbe Signal bekommt die Echounterdrückung als Vorlage.

What the others say lands in a jitter buffer (speexdsp, 10 frames of margin) that smooths varying packet delay, is decoded by Opus and played on the chosen device. The echo canceller gets the same signal as its reference.

Was Nomla kannWhat Nomla does

Kanäle und LeuteChannels and people

Kanalbaum mit Suche und angehefteten Kanälen, Kanäle bearbeiten, Leute verschieben, Zugangsschlüssel, Flüstern an Kanäle und Personen, Kommentare, mumble://-Links.

Channel tree with search and pinned channels, channel editing, moving people, access tokens, whispering to channels and people, comments, mumble:// links.

Chat

Markdown, Bilder senden und anzeigen, Vorlesen eingehender Nachrichten. Fremdes HTML läuft abgeschottet.

Markdown, sending and viewing images, reading incoming messages aloud. Untrusted HTML runs sandboxed.

Sprechen ohne hinzuschauenTalking without looking

Push-to-Talk über Hardware-Taste, Headset-Knopf, Bildschirmecke oder schwebendes Overlay, eine Stummschalt-Kachel in den Schnelleinstellungen und ein Ton beim Senden.

Push-to-talk on a hardware key, headset button, screen corner or floating overlay, a mute tile in Quick Settings and a sound when transmitting.

BarrierefreiAccessible

Eigener Zustand (stumm, taub, sprechend) wird für Screenreader angesagt, Bedienelemente sind beschriftet, und automatische Tests prüfen die Barrierefreiheit der Listen und Layouts.

Your own state (muted, deafened, talking) is announced to screen readers, controls are labelled, and automated tests check the accessibility of lists and layouts.

SelbsttestsSelf-tests

Ein Mikrofontest mit Pegelanzeige über die echte Audio-Kette und ein Gleichzeitig-Sprechen-Test, der mit einer mitgelieferten Stimme prüft, ob dich die Echounterdrückung noch durchlässt.

A microphone test with a level meter on the real audio chain, and a talk-over test that uses a bundled voice to check whether echo cancellation still lets you through.

UnterwegsOn the go

Bluetooth-Headsets werden auf Wunsch automatisch genutzt, Verbindungen laufen über Tor (Orbot), und Servernamen werden auch über SRV-Einträge aufgelöst.

Bluetooth headsets can be used automatically, connections can run over Tor (Orbot), and server names also resolve through SRV records.

Diagnose für NeugierigeDiagnostics for the curious

Unter Einstellungen › Sprechen & Audio › Diagnose schaltet Debug-Funktionen aktivieren zwei zusätzliche Seiten frei. Live zeigt jede Stufe der Audio-Kette mit ihrem Pegel, dazu Echo, Empfang, Netz und Gerät, als Pult oder Liste. Aufnahme nimmt 5, 10, 20 oder 30 Sekunden auf: jede Stufe vom Mikrofon bis zum gesendeten Paket als eigene Spur, dazu den Wiedergabe-Mix und bis zu vier Sprecher. Vorher bittet ein Hinweis um das Einverständnis der anderen, und während der Aufnahme zeigt Mumble allen auf dem Server, dass du aufnimmst; erlaubt der Server keine Aufnahmen, startet sie nicht. Solange du eine Spur abspielst, pausiert das Senden, damit die anderen sie nicht über dein Mikrofon hören. Geteilt wird eine ZIP-Datei mit WAV-Spuren, Messtabellen und einer Beschreibung, nie mit Namen, Passwörtern, Zertifikaten oder Chat (siehe Datenschutz). Mit tools/diagnostics-report/report.py machen Entwickler daraus offline einen Bericht.

Under Settings › Speaking & audio › Diagnostics, Enable debug features adds two more pages. Live shows every stage of the audio chain with its level, plus echo, receive, network and device, as Console or List. Recording captures 5, 10, 20 or 30 seconds: every stage from the microphone to the sent packet as a track of its own, plus the playback mix and up to four speakers. First a notice asks for the others' consent, and while recording, Mumble shows everyone on the server that you are recording; if the server does not allow recordings, none starts. While you play a track, transmission pauses, so the others do not hear it through your microphone. What you share is a ZIP file with WAV tracks, measurement tables and a description, never with names, passwords, certificates or chat (see Privacy). Developers turn it into a report offline with tools/diagnostics-report/report.py.

Zertifikate und GeheimnisseCertificates and secrets

Dein ZertifikatYour certificate

Nomla erzeugt ein RSA-2048-Zertifikat oder importiert dein vorhandenes (PKCS#12). Export geht mit Passwort (AES-256, 100 000 Iterationen, wie OpenSSL 3) oder ohne Passwort im Format, das Mumble selbst schreibt.

Nomla creates an RSA 2048 certificate or imports your existing one (PKCS#12). Export works with a password (AES-256, 100,000 iterations, like OpenSSL 3) or without one, in the format Mumble itself writes.

Gespeicherte PasswörterStored passwords

Serverpasswörter und Zertifikate liegen mit AES-256-GCM verschlüsselt in der Datenbank, unter einem Schlüssel, der den Android-Keystore nie verlässt. Sie gehen nicht in Cloud-Backups.

Server passwords and certificates are stored encrypted with AES-256-GCM, under a key that never leaves the Android Keystore. They are kept out of cloud backups.

Server prüfenChecking servers

Ein Server gilt als vertrauenswürdig, wenn Android seiner Zertifikatskette vertraut und sie den eingegebenen Namen trägt, oder wenn du sein Zertifikat ausdrücklich angenommen hast. Geprüft wird immer der Name, den du eingegeben hast, auch wenn ein SRV-Eintrag woandershin zeigt. Den Namen gleicht die bewährte Prüfung von OkHttp mit dem Zertifikat ab, nicht eigener Code.

A server is trusted when Android trusts its certificate chain and it carries the name you entered, or when you accepted its certificate explicitly. The name checked is always the one you typed, even when an SRV record points elsewhere. OkHttp's well-tested verifier matches that name against the certificate, not code of our own.

DatenschutzPrivacy

Aufnahmen bleiben auf dem GerätRecordings stay on the device

Eine Diagnose-Aufnahme liegt nur im Arbeitsspeicher und, zum Teilen, im Cache der App, bis du sie selbst über das Teilen-Menü von Android weitergibst. Nomla lädt nichts hoch. Schaltest du die Debug-Funktionen aus, verwirft Nomla die Aufnahme und die geteilte Datei, und nach einem Neustart der App ist ohnehin nichts mehr davon übrig.

A diagnostic recording lives only in memory and, for sharing, in the app's cache, until you pass it on yourself through Android's share menu. Nomla uploads nothing. Switching the debug features off discards the recording and the shared file, and after an app restart none of it is left anyway.

Was nie drinstehtWhat is never included

Servernamen und -adressen, Benutzer- und Kanalnamen, Passwörter, Zertifikate, Zugangsschlüssel und Chat kommen nie in die Datei. Andere Sprecher heißen dort nur speaker_1 bis speaker_4. Was du bewusst nicht sendest, stummgeschaltet oder ohne gedrückte Sprechtaste, hinterlässt keine Spur deiner Stimme in der Datei: keinen Ton und keine Pegel. Enthalten sind App-Version, Gerätemodell, Android-Version, die Audio-Einstellungen, deine eigene Notiz, die Startzeit der Aufnahme (UTC) und die Produktnamen kabelgebundener, USB- und eingebauter Audiogeräte. Bluetooth-Geräte stehen nie mit Namen darin, nur mit ihrem Typ.

Server names and addresses, user and channel names, passwords, certificates, access tokens and chat never go into the file. Other speakers appear only as speaker_1 to speaker_4. What you deliberately do not send, muted or without the push-to-talk key held, leaves no trace of your voice in the file: no sound and no levels. It does hold the app version, device model, Android version, the audio settings, your own note, the recording's start time (UTC) and the product names of wired, USB and built-in audio devices. Bluetooth devices never appear by name, only by their type.

Wie Nomla gebaut istHow Nomla is built

Drei Module, sauber geschichtet. Das Protokoll kennt kein Android, die Sitzung kennt keine Oberfläche.

Three modules in clean layers. The protocol knows nothing of Android, the session nothing of the user interface.

app

Oberfläche (Android Views, Material), Vordergrund-Dienst, Einstellungen, Datenbank (SQLite, Schema 1). Abhängigkeiten von Hand verdrahtet, ohne DI-Framework: Was die ganze App teilt, hält ein einziger Container der Application, und Tests tauschen Teile nur dort aus.

User interface (Android Views, Material), foreground service, settings, database (SQLite, schema 1). Dependencies wired by hand, no DI framework: what the whole app shares lives in one container held by the Application, and tests swap parts there and nowhere else.

libraries/core

Die Sitzung mit einem Server als einfaches Objekt, Zustand als Kotlin Flows, Audio-Kette, Audio-Routing und die native Bibliothek libnomla_native.so (C++17, NDK, arm64, armv7, x86_64), die nur JNI_OnLoad exportiert.

The session with a server as a plain object, state as Kotlin flows, the audio chain, audio routing and the native library libnomla_native.so (C++17, NDK, arm64, armv7, x86_64), which exports nothing but JNI_OnLoad.

libraries/protocol

Reines Kotlin ohne Android: Mumble-Protokoll (Protobuf), TLS- und UDP-Transport, OCB2-Kryptografie, Servermodell aus unveränderlichen Datenstrukturen.

Plain Kotlin without Android: the Mumble protocol (protobuf), TLS and UDP transport, OCB2 crypto, a server model built from persistent data structures.

GetestetTested

Rund 280 Testklassen laufen auf der JVM (JUnit, Robolectric, MockK, Truth). Der native Code hat eigene Tests, jeweils auch mit AddressSanitizer und UndefinedBehaviorSanitizer. Akustische Gerätetests spielen echte Sprache durch einen Raum und messen Echo, Latenz und Dämpfung.

About 280 test classes run on the JVM (JUnit, Robolectric, MockK, Truth). The native code has its own tests, each also under AddressSanitizer and UndefinedBehaviorSanitizer. Acoustic device tests play real speech through a room and measure echo, latency and attenuation.

Ein Befehl prüft allesOne command checks everything

./gradlew verify baut alle ausgelieferten Varianten, führt die Tests aus und lässt Lint und detekt laufen. Die Entwicklungsumgebung kommt reproduzierbar aus einem Nix-Flake.

./gradlew verify builds every shipped variant, runs the tests, and runs lint and detekt. The development environment comes reproducibly from a Nix flake.

Mit KI entwickeltBuilt with AI

Große Teile der Neuentwicklung und alle Übersetzungen in 30 Sprachen entstehen mit KI-Agenten, nach festen Regeln: kleine Aufgaben, Prüfung jeder Änderung in der IDE, ein grüner Gesamtlauf vor jedem Commit. Korrekturen an Übersetzungen sind willkommen.

Large parts of the rewrite and all translations into 30 languages are made with AI agents, under fixed rules: small tasks, every change checked in the IDE, a green full run before each commit. Corrections to translations are welcome.

WerkzeugeToolchain

Kotlin 2.4, Android Gradle Plugin 9.4, JDK 21, NDK 29, CMake 4.1. Mindestens Android 12 (API 31), gebaut gegen API 37.

Kotlin 2.4, Android Gradle Plugin 9.4, JDK 21, NDK 29, CMake 4.1. Android 12 (API 31) or later, built against API 37.

Worauf Nomla aufbautWhat Nomla builds on

KomponenteComponentVersionWofürUsed for
Opus1.6.1SprachcodecVoice codec
webrtc-audio-processing2.1+Echounterdrückung, PegelregelungEcho cancellation, level control
RNNoise0.2+RauschunterdrückungNoise suppression
speexdsp1.2.1Resampler, Jitter-Puffer, leichte RauschunterdrückungResampler, jitter buffer, light noise suppression
Abseil20260817.0Grundlage für WebRTCFoundation for WebRTC
Bouncy Castle1.86Zertifikate, PKCS#12Certificates, PKCS#12
protobuf-javalite4.36.2Mumble-ProtokollMumble protocol
Kotlin Coroutines1.11.0Nebenläufigkeit, FlowsConcurrency, flows
MiniDNS1.1.1SRV-EinträgeSRV records
Coil / OkHttp3.6.3 / 5.5.0Bilder im Chat, Liste öffentlicher Server, Namensprüfung der ServerzertifikateImages in chat, public server list, host name check of server certificates
Material Components1.14.0OberflächeUser interface
Piper (ljspeech)mediumStimme für den SelbsttestVoice for the self-test

Woher Nomla kommtWhere Nomla comes from

Nomla steht auf den Schultern von über zehn Jahren freier Mumble-Clients für Android.

Nomla stands on the shoulders of more than ten years of free Mumble clients for Android.

  1. 2013–2017
    Plumble & Jumble

    Andrew Comminos und Mitwirkende. App und Protokollbibliothek.

    Andrew Comminos and contributors. App and protocol library.

  2. 2020–2026
    Mumla & Humla

    Daniel Lublin und Mitwirkende. Weiterführung von Plumble und Jumble.

    Daniel Lublin and contributors. The continuation of Plumble and Jumble.

  3. 2026–
    Nomla

    Felix Becker. Aus Mumla portiert und fast vollständig neu geschrieben: von Java nach Kotlin, mit neuer Audio-Kette, neuem Protokoll-Kern und Tests für fast alles. Lizenz: GNU GPL v3 oder neuer.

    Felix Becker. Ported from Mumla and almost completely rewritten: from Java to Kotlin, with a new audio chain, a new protocol core and tests for nearly everything. License: GNU GPL v3 or later.