PTT Live

Système d'intercom professionnel WebRTC pour techniciens événementiels

Communiquez via smartphone (PWA) en WiFi, le serveur fait le pont avec l'installation audio professionnelle.


🚀 Démarrage rapide

Installation Automatique (Recommandé)

Un seul script pour tout installer (détection automatique macOS/Linux) :

# Lancer l'installation portable
./install.sh

# Démarrer le système
./start.sh --dev

L'installeur configure automatiquement :

  • LiveKit Server local (pas besoin de compte cloud)
  • Détection et configuration IP réseau
  • Backends audio (sox/PipeWire/JACK selon OS)
  • Toutes les dépendances

📖 Guide portable complet : README-PORTABLE.md


Installation Manuelle (avec LiveKit Cloud)

Alternative si vous préférez utiliser LiveKit Cloud

  1. Prérequis

  2. Installer les dépendances

    cd server && npm install
    cd ../client && npm install
    
  3. Configurer LiveKit Cloud

    Créer server/.env :

    LIVEKIT_URL=wss://votre-projet.livekit.cloud
    LIVEKIT_API_KEY=APIxxxxxxxxxx
    LIVEKIT_API_SECRET=xxxxxxxxxxxxxxxxxx
    USE_LOCAL_LIVEKIT=false
    
  4. Démarrer

    Terminal 1 :

    cd server && npm run dev
    

    Terminal 2 :

    cd client && npm run dev
    
  5. Tester : https://localhost:5173

    • Se connecter avec votre nom
    • Ouvrir second onglet avec autre nom
    • Maintenir bouton PTT pour parler !

📖 Guide LiveKit Cloud : docs/SETUP_LIVEKIT.md


📱 Utilisation

  • Bouton PTT : Maintenir pour parler, relâcher pour écouter
  • Desktop : Clic maintenu / Mobile : Appui tactile maintenu
  • Feedback : Vibration + couleur rouge quand vous parlez
  • VU-mètre : Visualisation niveau audio en temps réel


🐛 Dépannage : "Connexion impossible"

Cause : Clés LiveKit non configurées ou invalides.

Solution :

  1. Vérifier que server/.env existe avec vos vraies clés LiveKit Cloud
  2. L'URL doit être en wss:// (pas ws://)
  3. Redémarrer le serveur après modification
  4. Vérifier que le serveur tourne : curl http://localhost:3000/health

Voir le guide complet : docs/SETUP_LIVEKIT.md


📚 Documentation


🎯 État du projet

  • Phase 1 : MVP fonctionnel (WebRTC + PTT)
  • Phase 2 : Fonctionnalités avancées (groupes, routing, admin)
  • 🆕 Portable : Installation zéro-config macOS/Linux
  • Phase 3 : Intégrations audio pro (Dante, AES67)

Version actuelle : 0.2.0 (Portable - production-ready)


Architecture

AUDIO PRO                        CLIENTS MOBILES
(selon option)                   (navigateurs PWA)

Option 1 : Carte son externe ┐   ┌── 📱 Réalisateur
Option 2 : Dante (DVS/PCIe)  ├───┤── 📱 Cadreur
Option 3 : AES67 (RTP)       ┘   ├── 📱 Ingé son
                                  └── 📱 Régisseur
              ↕
        [ SERVEUR ]
        Bridge Audio
        LiveKit SFU
        API + PWA

Fonctionnalités

Groupes

  • Un utilisateur = un groupe actif à la fois
  • Un groupe = un ou plusieurs canaux audio
  • Croiser deux équipes = créer un groupe dédié

Modes de transmission

PTT classique   → Maintenir pour parler
Mode continu    → Toggle ON/OFF (configurable par user)

Notifications

  • Son + vibration (appels privés)
  • Web Push via PWA
  • iOS : PWA obligatoire (iOS 16.4+)

Options Audio

Option 1 — Carte son externe USB/PCIe

✅ Simple, multi-OS, pas de licence
✅ Idéal pour développement et petites installations
✅ Brancher → fonctionne
⚠️  Limité en canaux (8-32 selon modèle)
⚠️  Nécessite câblage physique vers la régie

Exemples : MOTU 16A, RME AIO, Focusrite Scarlett 18i20

Option 2 — Dante

✅ Standard pro événementiel
✅ 512+ canaux sur réseau IP
✅ Latence < 1ms sur LAN dédié
⚠️  DVS : licence ~300€, support Linux non officiel
⚠️  Nécessite macOS ou Windows pour DVS
⚠️  Alternative : carte PCIe Brooklyn II (plus stable)

Implémentation : Dante Virtual Soundcard → JACK → Bridge

Option 3 — AES67 (RTP multicast)

✅ Standard ouvert, pas de licence
✅ Compatible Linux natif
✅ Interopérable avec Dante (mode AES67)
⚠️  Configuration réseau plus complexe (PTP, multicast)
⚠️  Moins d'équipements compatibles que Dante pur

Implémentation : RTP multicast → PipeWire/JACK → Bridge

Stack Technique

SERVEUR
────────────────────────────────
LiveKit Server   binaire Go, SFU WebRTC self-hosted
Bridge Audio     Node.js, cœur du système
JACK / PipeWire  abstraction audio OS (Linux/macOS)
CoreAudio        backend macOS natif
WASAPI / ASIO    backend Windows
libopus          transcodage PCM ↔ Opus
Config           YAML (groupes, routes, canaux)

CLIENT
────────────────────────────────
PWA React        interface mobile
livekit-client   SDK WebRTC
Web Push API     notifications

Bridge Audio

[Source audio]  →  JACK/PipeWire/CoreAudio
                →  Jitter Buffer (cible 40ms)
                →  Encodage Opus (96kbps voix)
                →  LiveKit Room

[LiveKit Room]  →  Décodage Opus
                →  Mix si groupe multi-canaux
                →  JACK/PipeWire/CoreAudio
                →  [Sortie audio]

Déploiement

PAS DE DOCKER — binaires natifs uniquement

$ git clone ...
$ ./install/linux.sh     # ou macos.sh / windows.ps1
$ node server/index.js

✅ LiveKit SFU démarré     (port 7880)
✅ Bridge audio actif
✅ Interface web servie    (port 3000)
Structure de lancement
──────────────────────
index.js
 ├── spawn livekit-server   (binaire Go téléchargé à l'install)
 ├── AudioBridge.start()    (backend détecté automatiquement)
 └── express static         (sert la PWA)

Structure du Projet

project/
├── server/
│   ├── index.js              # Point d'entrée unique
│   ├── livekit-server        # Binaire (téléchargé à l'install)
│   ├── bridge/
│   │   ├── audio.js          # Détection + abstraction
│   │   ├── backends/
│   │   │   ├── jack.js
│   │   │   ├── pipewire.js
│   │   │   ├── coreaudio.js
│   │   │   └── wasapi.js
│   │   ├── livekit.js
│   │   ├── opus.js
│   │   └── jitter.js
│   ├── api/                  # Admin REST
│   └── config/
│       └── config.yaml
│
├── client/                   # PWA React
│   └── src/
│       ├── components/
│       │   ├── PTTButton.jsx
│       │   ├── GroupSelector.jsx
│       │   └── UserList.jsx
│       └── hooks/
│           ├── useLiveKit.js
│           └── usePush.js
│
└── install/
    ├── linux.sh
    ├── macos.sh
    └── windows.ps1

Phases de Développement

PHASE 1 — Fondations
─────────────────────
→ LiveKit server (binaire local)
→ Bridge basique Option 1 (carte son USB)
→ PWA React : PTT, un groupe, deux clients
→ Valider latence WebRTC WiFi

PHASE 2 — Fonctionnalités
──────────────────────────
→ Groupes multiples + routing YAML
→ PTT lock + mode continu
→ Interface admin
→ Notifications push

PHASE 3 — Intégrations audio
──────────────────────────────
→ Option 2 : Dante (DVS ou PCIe)
→ Option 3 : AES67 (Linux natif)
→ Scripts install multi-OS
→ Tests charge WiFi (30+ clients)

Points de Vigilance

🔴 Dante + Linux   → DVS non supporté officiellement
                     Prévoir macOS/Windows ou AES67

🔴 iOS             → PWA obligatoire pour notifications
                     À communiquer dès la connexion

🟡 JACK / Xruns   → Kernel RT recommandé en production
                     (PREEMPT_RT sur Linux)

🟡 Réseau WiFi    → AP dédié recommandé
                     QoS/DSCP sur flux audio
                     Tester avec charge réelle
S
Description
No description provided
Readme 1.6 MiB
Languages
JavaScript 86.4%
CSS 9.1%
Shell 4.4%
HTML 0.1%