Faire une Radio Web avec des logiciels libres

closeCet article a été publié il y a 13 ans 1 mois 12 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

Voilà le chantier dans lequel je me suis lancé ce week-end. Mais tout d’abord pour faire quoi ? J’aurais l’occasion de vous en reparler, mais je participe dans deux semaines au Printemps de Entreprises qui se déroule à Vannes le 25 mars. Je dois y parler de cloud computng au travers d’une présentation de trente minutes le matin et d’un atelier d’une heure trente l’après-midi.

Même si le délai est un peu court, j’ai décidé de tenter l’aventure consistant à offrir une retransmission en direct de mes interventions. J’entends et je lis très souvent les regrets des uns ou des autres de ne pas avoir pu assister à une conférence (je ne parle pas des miennes bien rares 🙂 ). Il est vrai que ce n’est pas toujours simple entre les impératifs familiaux et professionnel de se ménager un temps pour cela.

Et quand ce n’est pas le temps, c’est la proximité géographique qui fait défaut. Ce n’est pas notre litre de gasoil en route pour les deux euros qui va améliorer cette situation. Il est donc temps de travailler sur ce sujet et je compte m’y investir pas mal dans les mois qui viennent.

Certes, le son c’est bien, mais il manque l’image. La vidéo semble alors la solution, sauf qu’elle est coûteuse en bande passante et ne permet pas de s’immerger dans la conférence, on reste à l’extérieur.

J’utilise le terme immergé volontairement, car ce que je vous proposerais si vous voulez assister à ma conférence sans vous déplacer est de l‘immersion 3D. De bien grands mots qui désignent simplement le fait de venir à la conférence au travers d’une simulation en trois dimensions, autrement dit un univers virtuel. Mais encore une fois j’y reviendrais très prochainement pour vous expliquer tout cela.

Un serveur de streaming

La diffusion de la partie sonore au travers d’un serveur de streaming doit permettre de facilement écouter la partie audio à l’aide de n’importe quel logiciel dédié à la lecture de contenu numérique audio. Parmi eux, on peut citer des outils comme Rhytmbox, Amarok, MPlayer ou encore VLC. Je vous renvoie vers la rubrique ad hoc du site Framasoft pour découvrir d’autres solutions selon votre système d’exploitation.

Diffuser du son, certes, mais le faire avec des logiciels libres c’est mieux. La solution qui revient en général est celle de Icecast. Il s’agit d’un serveur de streaming sous licence GPL. Sa mise en œuvre est relativement simple. Il est disponible dans les dépôts de la plupart des distributions GNU/Linux mais aussi sous Windows. Sa configuration se fait au travers d’un fichier dénommé icecast.xml. Ce dernier est bien documenté.

Le principe est d’envoyer sur le serveur de streaming un flux audio encodé dans le format de son choix (Ogg ou MP3 par exemple). Le serveur se chargera de le diffuser aux auditeurs connectés. Dans mon cas je me suis contenté d’utiliser le serveur de streaming mis à ma disposition par l’association Meza.

J’ai configuré deux points de « montage ». Rien à voir avec ceux de nos disques durs ou autres supports amovibles. Il s’agit ici de définir le nom de la ressource sur laquelle sera diffusée le flux audio. Les eux flux diffuseront le même contenu, mais seront encodés selon deux algorithmes différents : Ogg Vorbis et MP3. Ceci afin d’éviter tout souci de support de l’ogg Vorbis qui est format ouvert par les lecteurs multimédias. Mais si vous utilisez un de ceux que je vous ai proposés, vous n’aurez aucun problème.

Un point de montage se défini par au minimum :

<mount>
  <mount-name>/example.ogg</mount-name>
  <username>othersource</username>
  <password>hackmemore</password>
  <max-listeners>1</max-listeners>
</mount>

Le couple username/password est là pour empêcher que n’importe qui utilise votre serveur pour diffuser un flux audio à votre place. Par défaut, mais cela se modifie dans le fichier icecast.xml, le serveur de streaming écoute et diffuse sur le port 8000.

Icecast permet également d’accéder à un petit site web d’administration. Ce même site permet aux auditeurs de récupérer les URL associées aux flux de la Rradio Web.

Un client de streaming

Nous savons donc désormais diffuser un flux audio a un grand nombre de personnes. Il reste encore à le capturer pour l’envoyer au serveur. Pour cela je me tourne à nouveau vers des logiciels libres. La partie est cette fois plus ardue et j’ai bien cru un moment devoir utiliser la partition sous Seven que j’ai laissé sur mon nouvel ordinateur portable.

En fait, les outils des distributions GNU/Linux m’ont semblé plus « conviviaux » et puissants sous cet environnement. Pourtant, j’ai utilisé entres autres brique VLC disponible dans les deux environnements. Bien sûr sous Windows, j’ai trouvé quantité de logiciels payant ou gratuit qui simplifiaient la tâche. Mais je n’ai pas voulu céder aux sirènes de la facilité. Beaucoup auraient probablement jeté l’éponge dés le début. Il faut « avoir la foi » pour persévérer comme je l’ai fait 🙂 !

Les outils de ma solution sont les suivants :

Au centre de cet ensemble, le logiciel JACK Audio Connection Kit. Je l’ai découvert en feuilletant un site que je vous recommande si vous voulez comme moi vous initier à la musique assistée par ordinateur sous GNU/Linux. J’y ai découvert ce logiciel aux fonctionnalités tout a fait impressionnante. Il permet de connecter des entrées audio (microphone, instruments de musique, lecteur multimédia, etc…) avec des sorties (haut-parleur, enregistreur, etc…). Je vous laisse découvrir des exemples de mises en oeuvre chez LinuxMAO.

qJjack-Control s’appuie sur le serveur JACK et ALSA pour fonctionner. ALSA est le serveur de son « historique » des distributions GNU/Linux et il est désormais souvent complété par PulseAudio qui s’intercale entre ALSA et les applications. Cependant, certaines applications ne sont pas compatibles avec PulseAusio.

Comme qJjack-Control refusait de fonctionner et ne détectait pas ALSA, j’ai suivi (approximativement) ce tutoriel en supprimant complètement PulseAudio. En fin d’article l’auteur donne une solution pour éviter cela, mais je ne l’ai vu que plus tard. Soyez tout de même prudent dans cette opération, vous risquez de vous retrouver sans aucun son. Donc, soyez prêt à y passer du temps en cas de difficulté.

Passé cette étape qJjack-Control s’est mis à fonctionner et reconnaissait mon micro et mes haut-parleurs. Le paramétrage de qJjack-Control est décrit ici avec notamment l’activation de l’option « Temps réel ».

Il me fallait donc utiliser une dernier logiciel pour encoder le flux audio de mon micro et l’envoyer vers le serveur Icecast. Mon choix s’est porté sur le couteau suisse du traitement de flux multimédia VLC. Ce dernier a en effet la possibilité de diffuser une source audio vers un serveur Icecast.

M’étant jusqu’à présent contenté d’utiliser VLC pour ces fonctions de lecteurs audio ou vidéo, je me suis un peu arraché les cheveux pour arriver au résultat final. Si des assistants ont été mis en place pour simplifier la diffusion en streaming, la sauvegarde de configurations m’a paru particulièrement complexe et peu ergonomique. Afin de les conserver, j’ai dû quelque peu ruser et surtout me rabattre sur un bon script bash pour lancer les différentes instances de VLC nécessaires.

Le principe est pourtant simple. On indique à VLC d’utiliser un « périphérique de capture » et on sélectionne JACK Audio Connection Kit. Je laisse les autres paramètres par défaut. Un principe que j’applique quand je ne comprends pas tout à fait ce que je fais. Je clique sur le choix « Diffuser » qui s’affiche en bas dans une liste lorsque l’on clique sur la « flèche » située à côté de « Lire ».

Il est ensuite possible dans les options de diffusion de choisir Icecast, puis de faire « Ajouter » pour saisir les paramètres de connexions au serveur de streaming. Il faut indiquer l’adresse IP ou le nom de celui-ci, le port, le nom du point de montage et le couple login:password.

Il est important de cocher « Activation du transcodage » pour choisir le format et les options d’encodage du flux audio qui sera envoyé.  Faites encore suivant et vous arrivez sur le dernier écran d’options. A cette étape il est important de copier la chaîne indiquée dans la zone « Paramètres généraux du flux de sortie ». Elle sera utilisée dans le fichier bash utilisé pour le lancement de VLC.

En effet à partir de ces dernières j’ai constitué un fichier incluant le lancement de trois instances de VLC avec chacune leur paramétrage de diffusion : ogg, mp3 et enregistrement local au format ogg. La ligne de commande se découpe en trois parties :

La première :

vlc jack://channels=2:ports=.* :jack-input-caching=1000 :file-caching=300

indique à VLC la source à capturer.Vient ensuite la définition du flux de sortie. C’est là que devient utile la chaîne copiée tout à l’heure, car s’est celle que nous allons réutiliser entre deux guillemets simples en la mettant à la suite de –sout . Cela donne :

--sout '#transcode{vcodec=none,acodec=mp3,ab=256,channels=2,samplerate=44100}
:std{access=shout,mux=ogg,dst=login:password@serveur-icecast:8000//exemple.ogg}'

Une fois les trois instances lancées, qJjack-Control les faits apparaître dans les connexions dans la colonne « Clients en écriture » et les relis automatiquement à mes clients en lecture.

Le streaming commence alors immédiatement. Un lien apparaît sur la page web publique. Il permet d’obtenir l’URL du flux ou tout simplement en cliquant dessus d’appeler automatiquement le lecteur audio associé à l’extension .m3u. L’URL prend la forme http://adresse_du_serveur_icecast:8000/nom-du-point-de-montage.m3u.

Vous pouvez inclure dans le nom du point de montage l’indication du format d’encodage en ajoutant .ogg ou .mp3. Certains lecteurs audio peuvent en avoir besoin pour identifier le format d’encodage. L’url finale est alors de la forme http://adresse_du_serveur_icecast:8000/exemple.ogg.m3u.

En plus de la capture du microphone, il est possible d’envoyer de la musique. Pour cela toujours aussi simple, lancer une instance de VLC, remplissez votre playlist et lancer l’écoute.  Une nouvelle instance vlc va apparaître dans la colonne « Clients en lecture ». Il vous suffit de le connecter aux autres instances VLC dans la colonne « Clients en écriture ». Vous pouvez alors jouer sur les niveaux sonores dans VLC pour donner la priorité à la voix ou à la musique.

Pour le mixage, il serait possible d’utiliser un logiciel comme OpenDJmix, mais je n’ai pas essayé de le mettre en oeuvre par manque de temps.

Pour l’instant je constate un décalage de 5 à 10 secondes qu’il va falloir que je parvienne à diminuer, pour limiter le décalage avec l’image de la présentation. Merci de laisser vos suggestions en commentaire ;-).

On peut faire plus simple ?

Tout ceci reste encore artisanal. De plus ici je ne m’attaque qu’à la diffusion vers les auditeurs. Il ne peuvent pas intervenir. On pourrait imaginer une solution basée sur Asterisk l’autocommutateur téléphonique open source et l’utilisation d’un mixte streaming audio et voix sur IP. Mais c’est un autre chantier et qui prendrait bien plus de temps probablement.

Une autre solution que j’ai testé est Internet DJ Console. Malheureusement, il n’a pas voulu fonctionner et provoque une « general protection error » dans libtwolame lorsque j’essaie de le connecter au serveur icecast pour diffuser le flux audio. Je ne renonce pas pour autant mais ce sera pour un peu plus tard.

Ce programme m’a semblé d’une grande richesse fonctionnelle avec une gestion des jingles, l’envoi des annonces sur IRC, etc. Il est même possible d’interfacer un client voix IP du moment qu’il est compatible avec notre ami JACK. Ceci m’apporterait une réponse concrète pour mon soucis d’interaction dans le cadre d’un atelier.

N’hésitez pas à laisser vos retours d’expérience avec des solutions équivalente ou complément d’informations en commentaire !

Philippe Scoffoni

Je barbote dans la mare informatique depuis 30 ans (premier ordinateur à 16 ans, un ORIC ATMOS) et je travaille à mon compte au travers de ma société Open-DSI. J'accompagne les associations, TPE et PME dans leurs choix et dans la mise en oeuvre se solutions informatiques libres.

22 réponses

  1. JB dit :

    Et la prochaine étape ?
    Je te propose la mise en ligne de l’intervention vidéo avec affichage des slides, le tout synchronisé (http://www.smashingmagazine.com/2011/03/11/syncing-content-with-html5-video déniché par l’ami NicoLargo) 😉

  2. JB dit :

    Tu devrais diminuer ton jack-caching, je doute que tu aies besoin de 1000.
    De même, tu devrais pouvoir diminuer ton sout-caching interne.

    Ensuite, je ne suis pas sûr que mettre du mp3 dans du ogg, soit de la plus grande élégance, mais chacun ses goûts 😀
    As-tu essayé avec un encodage en vorbis (acodec=vorb) ?

  3. Alex_neko dit :

    Je te recommande l’utilisation du noyau linux-rt pour amélioré un peu les performances.

  4. Ghis dit :

    Pour la post diffusion de l’emission enrichie de textes, vidéos ou images, n’hésites pas à regarder webradio (plus développé mais un peu plus sexy encore http://scenari-platform.org/projects/webradio/fr/pres/co/ ) ou la relève, encore un peu jeune, webmedia de SCENARI : http://scenari-platform.org/projects/webmedia/fr/pres/co/

    A voir aussi du côté de Kaltura pour l’enrichissement de l’audio, mais je ne sais pas si les outils proposés sont sous licences libres.

  5. Ghis dit :

    Ah tiens, à regarder aussi peut-être ça : http://www.divergence-fm.org/XubuRadio-le-LiveCD-de-Divergence.html ? Est-ce que ça faciliterait la tâche ?

  6. Dahu dit :

    Je te conseille la lecture des projets d’un ami qui fait de la radio libre:
    http://projects.tryphon.eu/

  7. fran' dit :

    Bonjour,

    Dans les solutions packagées de mise en place de radio, basées sur des logiciels libres, il y a les solutions développées par Tryphon (http://www.tryphon.eu/fr/) qui semblent vraiment intéressantes.

  8. Cassé Vincent dit :

    J’ai créé pour le lancement de la webradio de l’association, une petite interface en PHP qui permet de controler liquidsoap (http://savonet.sourceforge.net/)

    Liquidsoap permet de méler différents flux avec un langage de script, ce qui permet d’automatiser des actions (ce qui est plus difficile avec jack).

    Cette interface sera bientôt dispo, elle permet de gérer du live et des playlists automatiques. Je corrige les derniers bugs et j’ajoute encore quelques fonctionnalitées avant de la diffuser.

    Alors, si jamais ca t’intéresse de tester !

  9. Jethro dit :

    Bonjour,

    Félicitations pour cet article, il est toujours intéressant de lire qu’il existe des solutions libres pour faire tourner une radio.

    @Cassé Vincent : Je serais très intéressé pour tester l’interface pour contrôler liquidsoap. Tu peux me contacter par mail : contact [a] technic2radio.fr

  10. Philippe dit :

    Merci @tous pour les liens, je vais regardais tout ça…
    @JB je ne suis pas sûr que mettre du mp3 dans du ogg. J’ai fait ça 🙂 ? J’avoue que je me contente de cliquer sur les options qui me paraissent pertinente. Je vous lais générer un flux en ogg vorbis (ça j’y suis arrivé) et en mp3 pour les lecteurs qui ne supporterait pas le ogg vorbis. Mais on le met dans quoi normalement le mp3 ? J’ai du rater une option 🙂 !
    Tu devrais diminuer ton jack-caching, je doute que tu aies besoin de 1000.
    De même, tu devrais pouvoir diminuer ton sout-caching interne.
    Heu ben j’ai pris les paramètres par défaut de VLC.. Je me doute qu’il me reste tout un travail d’optimisation et de réglage à faire…
    @Cassé Vincent j’i regardé du coté de liquidsoap, mais faute d’interface j’avais laissé tombé. N’hésite pas à m’envoyer des infos.

  11. Vincent Cassé dit :

    Je fais essayer de mettre le projet sur github demain soir ! C’est la premiére fois que je l’utilise (github), il va donc falloir que je m’y habitue.

    Sinon, pour éviter de faire de fausses joies : j’ai principalement fait un logiciel qui répond au besoin de la webradio de mon asso : simple d’utilisation ! donc peu de fonctions !!

    Il permet de gérer une liste de chansons qu’il diffuse en aléatoire quand l’émission n’est pas en live.
    Sinon, il gére les émissions : live – allumer / éteindre le micro, précharger des sons pour envoyer durant l’émission.

    Je l’ai fait en « web » car c’est la technologie que je maitrise le mieux et que je n’avais pas beaucoup de temps. Cependant, le projet n’est fonctionnel que sur le poste où il est hébergé.

    J’ai créé un premier script qui automatise l’installation. Je l’ai testé sur deux postes différents et neufs … mais je ne suis pas sur qu’il marche partout.

    Il faut ubuntu et au moins une carte son intégré

    je vous tiens au courant

  12. Vincent Cassé dit :

    Pour ceux que ca intéresse, je viens de publier les sources de Dish sur github !

    PS : c’est du plus que dev !

  13. Jethro dit :

    @Vincent Cassé : Pourrais-tu poster des screenshots de Dish ?

  14. Cassé Vincent dit :

    Voici les 3 seuls screenshots que j’ai fait pour le moment :

  15. Philippe dit :

    Pour ceux que ça intéresse, une solution qui m’a l’air extrêmement complète : http://www.rivendellaudio.org/index.shtml

  16. Cassé Vincent dit :

    Malheuresement, je trouve rivendell trés complexe à utiliser … et mon but est d’avoir un outil assez simple pour que de nombreuses personnes puissent l’utiliser !

    Airtime est un bon outils, mais j’ai quelques difficultés à gérer le « live » (micro, envoi de sons …)
    Cependant, les reste fonctionne bien.

  17. Cassé Vincent dit :

    Ouai, mais maintenant il manque les outils de gestion automatique de musique en dehors du live.
    J’aimerais un outils simple à utiliser que les gens de l’association puissent réinstaller « assez facilement » sans mon aide ! :S Et là ca devient difficile 🙂

    Je sais, je suis chiant ^^ C’est pour ca que j’ai codé mon propre truc !

  18. Jethro dit :

    En effet il n’existe pas vraiment de logiciel complet et facile d’utilisation sous linux. Mais je pense qu’Airtime de Sourcefabric deviendra quelque chose de vraiment sympa, le logiciel évolue rapidement. Une seule installation et tous les gens de votre association peuvent se connecter via le web depuis n’importe où.

  19. Jethro dit :

    Désolé mais je n’avais pas vu que c’était @Cassé Vincent qui avait écrit le post précédent.
    Ta solution est très intéressante (bien que je n’ai pas réussi à l’utiliser après une installation réussi), il reste encore à la faire évoluer (comme toute solution d’ailleurs !)

  20. Cassé Vincent dit :

    Ouai Airtime a l’air bien parti. Déjà campcaster était pas mal, mais ce manque de gestion du live m’a fait changé d’outils.

    Pour ma solution, je suis preneur de tous les retours ! J’en ai moi même quelques uns puisqu’il est en prod.

    Si tu souhaites aussi un coup de main pour le faire fonctionner, je peux aussi : je ne l’ai testé que sur une interface (un OS spécifique avec une conf spécifique) et je n’ai pas d’autres retours ^^