Technology5 min read

Partyline: A group voice application for Reticulum, built on LXST

By · Published by Everything Blog

In short

This application allows users to communicate in real-time voice and audio over any Reticulum transport capable of more than 6 kilobits per second. Dial-in functionality is supported, allowing users to join the server using their LXST clients such as Sideband and MeshChatX.

Key points

  • This application allows users to communicate in real-time voice and audio over any Reticu…: This application allows users to communicate in real-time voice and audio over any Reticulum transport capable of more than 6 kilobits per second.
  • Dial-in functionality is supported, allowing users to join the server using their LXST cl…: Dial-in functionality is supported, allowing users to join the server using their LXST clients such as Sideband and MeshChatX.

Sources checked by our analysis pipeline: 1

A group voice application for Reticulum, built on LXST, inspired by Mumble

- Encrypted, realtime group voice and audio over any Reticulum transport capable of >6 kilobits per second

- An easy to host lightweight server and protocol. Spin up a Partyline server in under 30 seconds.

- Per room access and channel control. open, identified users only, allow lists of identity hashes, or a password. Servers can also require a password or an allow list

- Dial-in: rnphone and other LXST clients such as Sideband and MeshChatX can call the server and land in a room too, when enabled

- Rooms each with its own LXST codec configurable by the server. Opus for fast links, Codec2 down to 700 bps for slow ones.

- GUI and terminal client with multiple language support

Requires Python 3.11 or newer

pip install partyline

For a system wide push to talk key, add the optional extra:

pip install "partyline[hotkeys]"

The graphical client uses Tk, which pip cannot install. On most OS/Distros it may already be installed by your system. If not:

On Debian or Ubuntu run

sudo apt install python3-tk

, on Fedora sudo dnf install python3-tkinter

.

Requires Python 3.11 or newer, Reticulum, and LXST

git clone https://github.com/RFnexus/partyline

cd partyline

pip install .

Or install via rngit

with:

git clone rns://4cf8a0651c4d73cacd0f93ac1d95e80a/public/partyline

For a system wide push to talk key, install the optional extra with:

pip install ".[hotkeys]"

This installs three commands: partyline, partyline-server and partyline-client.

Start the GUI client:

partyline

Connect opens the server browser. Add a server by it's hash or use the server browser to find discovered servers from announces. Double click a room to join it. Settings has the audio devices, transmit mode, push to talk key, and UI appearance options

partyline-client HASH --name Bob --room Lobby

Commands are: /join, /say, /poke, /who, /mute, /deaf

Type /ptt

to toggle push to talk

Or as an operator: /kick, /ban, /smute, /op and /move

Start a server:

partyline-server --name "My server" --profile opus-high

The server prints its destination hash for clients and with dial in enabled the number rnphone users call if configured for rooms. For rooms, access lists, operators, a server password and dial in, copy server_example.json and start with:

partyline-server --config server.json

Available --profile

codecs for rooms:

opus-high

- Opus voice, 16 kbpsopus-med

- Opus voice, 8 kbpsopus-low

- Opus voice, 6 kbpsc2-3200

- Codec2, 3200 bpsc2-2400

- Codec2, 2400 bpsc2-1200

- Codec2, 1200 bpsc2-700

- Codec2, 700 bpsmusic-low

- Opus music, 14 kbpsmusic-med

- Opus music, 28 kbpsmusic-high

- Opus music, 56 kbps

See server_example.json

for a full list of options.

opus-high-med-low and the Codec2 modes are meant for voice, and music-high-med-low is meant for streaming music or broadcasting to a room. As a rule, use the highest bitrate your link can carry

To install as a systemd unit find the server command with which partyline-server

then create /etc/systemd/system/partyline.service

:

[Unit]

Description=Partyline voice server

After=network-online.target

Wants=network-online.target

[Service]

Type=simple

User=partyline

ExecStart=/usr/local/bin/partyline-server --config /home/partyline/server.json

Restart=on-failure

[Install]

WantedBy=multi-user.target

Then:

sudo systemctl daemon-reload

sudo systemctl enable --now partyline

Server operators can also configure broadcast-only rooms for high quality music and audio using LXST's Opus CELT profiles. The options are music-high

, music-med

, and music-low

. Music rooms are a special type of room where only the listed identities can send audio. Add their identity hash, seperated by commas, in music

{"name": "Broadcast", "profile": "music-med", "music": ["0123456789abcdef0123456789abcdef"], "description": "Music/broadcast room. Only listed identities may talk. Uses LXSTs Opus CELT profile"}

An example Music Bot can be found under bots/music_bot.py

. When Partyline is installed with pip, run it with python3 -m partyline.bots.music_bot

PTT, or slow-mode rooms, are rooms designed to work over slower links like LoRa, bare copper wire bitbashing, and packet radio. Anything with more than a steady ~3.5 kbps throughput can use a PTT room. They can co-exist with regular rooms in a Partyline server, allowing both fast and slow clients to communicate over voice.

Unlike regular rooms there is a bit of latency. PTT rooms pack outgoing audio to fill the link's MTU, sending fewer, fuller packets instead of one frame per packet, and give every listener a larger receive jitter buffer to smooth out the bursty arrival you get over radio mediums like LoRa.

Mark any room push to talk with "ptt": true

. Optionally set "ptt_jitter_ms"

to change the buffer depth. It's recommended to use PTT rooms with the codec2 profiles.

{"name": "LoRa 1200", "profile": "c2-1200", "ptt": true, "description": "Slow-link push to talk"}

{"name": "Packet Radio Net 700", "profile": "c2-700", "ptt": true, "ptt_jitter_ms": 9000}

Kimi K3 (https://www.kimi.com/en) third party hosted API was used for the following tasks:

- I18N localization and UI

gettext()

implementation - Translation of UI elements and of eo, es, nl, and ru PO files

- Misc debugging and creation of

rnsconfig.py

RNS helper utilities

The .po files are located in partyline/locale/

To update a translation, change the msgstr

line under its English msgid

To add a language, copy partyline.pot

to a new .po

file and add it to LANGUAGES

in partyline/i18n.py

.

Run python partyline/locale/compile.py

, then open a pull request with your changes or submit it to the LXMF address:

- Reticulum and LXST by Mark Qvist

- Mumble. Great software that just works. The best UI is stolen UI

- Tree, toolbar and application icons from Tabler Icons

- Sound effects from Kenney interface sounds

- Tin can telephone drawing in the logo from openclipart.org

Original source: github.com

Technology