Ajouter un véritable PTT matériel à Mumble pour commuter votre TX

Mumble est une solution fantastique pour monter des liaisons audio radioamateur de haute qualité. Le problème majeur ? L’application ne gère absolument pas le déclenchement matériel d’un émetteur (PTT). Sans solution dédiée, on se retrouve coincé, obligé de s’en remettre à des systèmes VOX hasardeux ou à des bidouilles logicielles peu fiables.

L’objectif ici est de combler ce manque en créant une passerelle : un script Python qui « écoute » spécifiquement l’audio de Mumble et déclenche instantanément le PTT matériel de votre transceiver au moindre son reçu, avec un délai de relâchement paramétrable.

Note : Ce montage est réalisé sous Ubuntu avec une interface RigExpert Tiny (commutation sur port série) et un Yaesu FT-890. Le principe reste exactement le même sur un Raspberry Pi : il suffira de remplacer la commande série du script par le pilotage d’une broche GPIO. C’est d’ailleurs un test que nous ferons très bientôt !

1. Prérequis logiciels

Le script fonctionne avec Python 3 et nécessite les bibliothèques pyaudio (pour intercepter le son) et pyserial (pour piloter l’interface série). Installez-les via votre terminal :

Bash

sudo apt update
sudo apt install python3-pyaudio python3-serial

2. Figer le port USB de l’interface

Sous Linux, l’attribution des ports USB est volatile (/dev/ttyUSB1 peut devenir ttyUSB2 au prochain redémarrage). Pour éviter que le script ne tourne dans le vide, nous allons utiliser l’identifiant matériel unique de l’interface.

Tapez cette commande :

Bash

ls -l /dev/serial/by-id/

Repérez la ligne qui correspond à votre port PTT (sur une RigExpert, c’est généralement if01-port0, le if00 gérant le CAT). Copiez ce chemin complet, il servira dans le script.

3. Le script Python de commutation (mumble_vox_ptt.py)

Créez un fichier mumble_vox_ptt.py et collez-y le code ci-dessous. Pensez à modifier :

  1. La variable PTT_PORT avec votre propre chemin by-id.
  2. La variable TARGET_INDEX avec l’index de votre moniteur audio USB (lancez le script une première fois, il listera vos cartes son pour vous aider à trouver la bonne).

Python

import time
import struct
import pyaudio
import serial

CHUNK = 256
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
# Seuil anti-bruit de fond (à ajuster entre 2500 et 5000 selon votre carte son)
THRESHOLD = 5000 
HOLD_TIME = 1.5

# Remplacez par le chemin by-id de votre propre interface PTT
PTT_PORT = "/dev/serial/by-id/usb-FTDI_MixW_RigExpert_Tiny_00000000-if01-port0"

# Ouverture du port et mise au repos immédiate des lignes DTR et RTS
ser = serial.Serial(PTT_PORT, baudrate=9600, timeout=0)
ser.dtr = False
ser.rts = False
time.sleep(0.2) 

p = pyaudio.PyAudio()

# Renseignez ici l'index de votre moniteur USB (celui où sort l'audio Mumble)
TARGET_INDEX = 6  

print(f"Ouverture du flux audio (index {TARGET_INDEX}) et verrouillage PTT au repos...")
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, input_device_index=TARGET_INDEX, frames_per_buffer=CHUNK)

print("Passerelle Mumble -> PTT Matériel active...")
ptt_active = False
last_voice_time = time.time()

def get_rms(data):
    count = len(data) // 2
    if count == 0:
        return 0
    shorts = struct.unpack(f"<{count}h", data)
    return (sum(s * s for s in shorts) / count) ** 0.5

def set_ptt(state):
    global ptt_active, last_voice_time
    if state:
        last_voice_time = time.time()
        if not ptt_active:
            ser.rts = True  # Commutation du vrai PTT sur la ligne RTS
            print("\n>>> PTT MATÉRIEL ACTIVÉ (RTS)")
            ptt_active = True
    else:
        if ptt_active and (time.time() - last_voice_time > HOLD_TIME):
            ser.rts = False  # Relâchement PTT
            print("\n<<< PTT MATÉRIEL COUPÉ")
            ptt_active = False

try:
    while True:
        data = stream.read(CHUNK, exception_on_overflow=False)
        rms = get_rms(data)
        
        print(f"RMS : {int(rms):<5}  |  Seuil : {THRESHOLD}   ", end="\r", flush=True)
        
        if rms > THRESHOLD:
            set_ptt(True)
        else:
            set_ptt(False)
                
except KeyboardInterrupt:
    print("\nArrêt propre du script...")
    ser.dtr = False
    ser.rts = False
    ser.close()
    stream.stop_stream()
    stream.close()
    p.terminate()

4. Raccordement et exécution

Côté matériel, reliez la sortie PTT de votre interface directement à la prise RCA (souvent marquée « PTT » ou « SEND ») à l’arrière de votre transceiver.

Lancez le script dans votre terminal :

Bash

python3 mumble_vox_ptt.py

Le tour est joué : Mumble dispose enfin d’un véritable PTT matériel réactif au quart de tour, sans couper vos premières syllabes.

73 de F4IAA !

Laisser un commentaire