Je vous propose de faire parler vos Sonos en utilisant une conversion « text to speech », c-à-d en leur faisant lire un texte quelconque. A noter que ce tutoriel n’est pas limité à Jeedom et peut s’utiliser de manière générale. Ainsi, si vous deviez changer de système domotique (QUOI !?), ces explications resteraient applicables.
Ce tutoriel détaille donc la mise en oeuvre des classes PHP crées par DJMomo et disponibles sur Github. Malgré l'aide apportée parle tuto de Fabien sur le blog de Planète Domotique, j’ai beaucoup souffert pour la mise en place: pas mal d’infos manquaient, beaucoup de choses semblaient aller de soi, et lorsque comme moi on a un faible niveau technique, c’est la galère assurée. Ainsi, pour vous éviter de souffrir à votre tour, je vous propose ce tuto que je vais tenter de détailler au mieux.
A noter encore que les classe PHP mises en oeuvre sont les mêmes que celles utilisées dans le plugin Sonos que l’on trouve sur le Market. Malheureusement, ce plugin est peu documenté et ne semble plus maintenu. Alors à défaut de pouvoir l’utiliser, je me suis lancé dans l’installation des classes PHP en dehors de Jeedom. Si vous avez une meilleure approche, une façon simple d’exploiter le plugin Sonos, je suis preneur et je mettrai ce tuto à jour avec vos infos.
Démarche
Voici dans les grandes lignes le principe de fonctionnement : le script TTS va prendre le texte à lire, l’envoyer pour conversion en « vocal » à Google Translate et récupérer un fichier MP3 qui sera placé en queue de lecture du lecteur Sonos désigné. Le Sonos va interrompre sa lecture (s’il est en train de jouer de la musique), lire le fichier MP3 et reprendre ensuite le morceau de musique là où il l’a suspendu. Pour cela, nous avons besoin:
- des fichiers PHP pour le script
- d’un répertoire pour stocker le MP3 à lire
- de créer les conditions d’accès des lecteurs Sonos à ce répertoire
Par exemple:
<ding> ceci est le texte lu <ding>. Je trouve ça plus élégant et ça permet d’attirer l’attention au message qui sera lu, ce qui évite le « quoi, qu’est-ce qu’elle a dit ? »
Pour permettre leur compréhension, toutes les commandes à entrer sont commentées entre doubles parenthèses ((commentaire)).
1. création des répertoires pour stocker les fichiers MP3
Nous allons créer les répertoires qui seront nécessaires sur le serveur Jeedom pour placer les fichiers PHP et les fichiers MP3 qui seront créés. Ces répertoires doivent être accessibles par NGINX (le serveur web utilisé par Jeedom) mais de préférence pas dans l’arborescence de Jeedom pour éviter qu’une mise à jour ne les efface un jour, on ne sait jamais:
- ouvrir une fenêtre de terminal
- se connecter en SSH sur le pi:
—> le serveur va vous demander votre mot de passe. Si vous avez laissé le mot de passe par défaut, ce sera : raspberry
Code : Tout sélectionner
SSH XXX.XXX.XXX.XXX -l pi ((XXX.XXX.XXX.XXX est l’adresse IP de votre serveur Jeedom))
- entrez les commandes suivantes:Code : Tout sélectionner
cd / ((vous place tout en haut de l’arborescence de fichiers)) sudo mkdir /usr/share/nginx/www/sonos ((crée un répertoire "sonos". Il accueillera les fichiers PHP)) sudo mkdir /usr/share/nginx/www/sonos/audio sudo mkdir /usr/share/nginx/www/sonos/audio/fr ((ce répertoire accueillera les fichiers MP3))
2. création des conditions d’accès des lecteurs Sonos
Les Sonos sont une plateforme Windows, ils ne peuvent pas accéder seuls au disque du serveur Linux. Il faut donc leur créer un share Samba et indiquer son existence aux Sonos.
2.1 mise en place d’un partage Samba pour les Sonos
Pour mettre en place ce partage Samba, nous allons:
- créer un utilisateur Sonos sur le serveur Jeedom
- installer Samba sur le serveur Jeedom
- partager avec Samba les répertoires créés en étape 1
- déclarer notre utilisateur Sonos comme utilisateur de Samba et lui donner les droits d’accès au partage créé ci-dessus
1. créer un utilisateur "sonos" sur le serveur:
toujours dans la fenêtre de terminal sur le serveur Jeedom:
Code : Tout sélectionner
sudo adduser sonos ((crée l’utilisateur nommé sonos. Vous pouvez lui donner le nom que vous voulez))
sudo passwd sonos ((créer un mot de passe pour l’utilisateur sonos. Entrez un mot de passe et notez-le quelque-part !))
Code : Tout sélectionner
su - sonos ((on prend l’identité de l’utilisateur sonos))
cd /usr/share/nginx/www/sonos ((et on se rend à l’endroit où se trouvent les fichiers à lire))
ls -la ((on affiche le contenu du répertoire))
exit ((on quitte l’utilisateur sonos et on se trouve de nouveau en utilisateur pi))
3. installer Samba:
Avant d’installer Samba, nous allons vérifier qu’il ne l’est pas déjà :
Code : Tout sélectionner
dpkg --get-selections | grep samba
Code : Tout sélectionner
samba-common install
Sinon il faut l'installer:
Code : Tout sélectionner
sudo apt-get install samba
Nous allons à présent modifier la configuration de Samba. Et avant toute chose, nous allons la sauver pour nous mettre à l’abri de toute mauvaise manipulation:
Code : Tout sélectionner
cd / ((nous ramène tout en haut de l’arborescence de fichiers))
sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.original ((copie le fichier de configuration et lui donne un nouveau nom))
Pour éditer le fichier de configuration samba:
Code : Tout sélectionner
sudo nano /etc/samba/smb.conf ((lance l’éditeur de texte))
Code : Tout sélectionner
[global]
workgroup = jeedom
netbiosname = jeedom
server string = Samba Server %v
load printers = no
log file = /var/log/samba/log.%m
max log size = 50
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
interfaces = l0 eth0
security = user
password level = 12
username level = 12
encrypt passwords = yes
username map = /etc/samba/smbusers
Code : Tout sélectionner
[muscishare] ((donnez ici le nom que vous voulez, ce sera le nom par lequel Sonos verra le répertoire partagé))
path = /usr/share/nginx/www/sonos/audio/fr ((ici, le chemin d’accès vers le répertoire partagé))
valid user = sonos ((nous donnons l’accès à notre utilisateur sonos créé précédemment))
guest ok = no ((par sécurité, nous n’acceptons pas l’utilisateur guest))
read only = yes ((l’utilisateur sonos ne peut que lire le contenu du répertoire, pas y écrire))
printable = no
- tapez « control - X » : quitte le mode d’édition
- confirmez l’enregistrement des modifications en tapant « y »
- confirmez le nom du fichier en pressant ENTER
Nous allons à présent modifier le fichier des utilisateurs Samba pour déclarer notre utilisateur sonos:
(si le fichier smbusers n’existe pas encore, cette manipulation le créera)
Code : Tout sélectionner
sudo nano /etc/samba/smbusers ((édite ou créer le fichier smbusers))
- Modifications à apporter:
Code : Tout sélectionner
root = administrator admin nobody = guest pcguest smbguest sonos = sonos
- Sauver et quitter le fichier smbusers.
- Entrer la commande:
--> entrer un mot de passe qui sera utilisé dans la configuration du sonos
Code : Tout sélectionner
sudo pdbedit -a -u sonos
- Relancer samba pour qu'il prenne la nouvelle configuration en compte:
Code : Tout sélectionner
sudo /etc/init.d/samba restart
Maintenant que le partage Samba et l’utilisateur sonos sont créés, il faut déclarer cette nouvelle source de musique aux lecteurs Sonos. Cela se fait par l’application Sonos (sur Mac, PC ou smartphone, ça marche aussi):
- ouvrez l’application Sonos sur le mac ou un iPhone
- naviguez dans les Préférences / bibliothèque musicale puis cliquez sur le + pour ajouter une bibliothèque. Paramètres:
- emplacement: //jeedom/musicshare ((avec [musicshare] le nom du répertoire qui est déclaré dans /etc/samba/smb.conf))
- username: sonos
- password: le mot de passe que vous avez choisi
3. mise en place des fichiers PHP
Nous allons récupérer les fichiers PHP, les adapter à notre installation et les placer dans un répertoire accessible à NGINX.
3.1 récupérer les fichiers PHP:
- depuis votre navigateur web, récupérez les fichiers PHP sur Github
- vous devez avoir 2 fichiers:
- sonos.class.php : la classe qui contient les commandes et la conversion tts,
- sonos.tts.php: la classe qui lance la conversion TTS pour les lecteurs Sonos
Des informations doivent être modifiées dans le fichier sonos.tts.php: l’adresse IP du lecteur Sonos qui doit lire les messages, et le répertoire où trouver ces messages. Pour connaître l’adresse IP de votre lecteur Sonos: lancez l’application Sonos sur votre PC. Sous Mac, c’est dans le menu Sonos / à propos de Sonos. Sous PC, je ne sais pas mais vous devriez trouver un menu similaire qui vous donnera:
Si vous avez plusieurs lecteurs Sonos (et c’est quand-même le but!), vous pouvez faire plusieurs copies du fichier sonos.tts.php et leur donner un nom spécifique à chacune, par exemple:
sonos.tts.salon.php
sonos.tts.bureau.php
sonos.tts.chambre1.php
sonos.tts.chambre2.php
Il faut ensuite éditer chaque fichier et changer les informations suivantes:
Code : Tout sélectionner
$IP_sonos_1= "XXX.XXX.XXX.XXX"; ((mettre ici l’adresse IP de votre lecteur SONOS))
$directory = « XXXXXXXX »; ((mettre ici le nom du dossier partagé Samba que nous avons créé. Dans notre exemple, c’est musicshare))
Code : Tout sélectionner
// Exemple de l'utilisation de la fonction Text-to-speech
require 'sonos. class .php';
$IP_sonos_1 = "192.168.17.22" ; // Adresse IP du Sonos Play1 à contrôler
$directory = "jeedom/TTSdirect" ;
// Indiquer ici le dossier partagé contenant les scrips PHP sonos
// (et qui contiendra le sous-dossier audio)
- bien utiliser un éditeur de texte qui n’ajoute pas de formatage: utilisez textedit ou text wrangler sous Mac, notepad sous Windows
- ne pas modifier l’extension du fichier lors de l'enregistrement (les éditeurs ont une fâcheuse tendance à rajouter un .txt , vous devez vous assurer que l’extension reste .php)
- bien respecter la syntaxe du fichier (espaces, ponctuation. Les lignes doivent se terminer par un point virgule).
Code : Tout sélectionner
sudo nano sonos.tts.bureau.php
- sur votre Mac ou votre PC linux, ouvrez une deuxième fenêtre de terminal (mais ne vous loggez pas sur le Pi, ce terminal reste local sur votre machine !)
- entrez la commande:
scp -r /Users/Serge/Downloads/*.php pi@192.168.1.100: /usr/share/nginx/www/sonos
- /Users/Serge/Downloads/ par le chemin du répertoire qui contient les fichiers PHP à transférer
- 192.168.1.100 par l’adresse IP de votre serveur Jeedom
3.4 modification des droits
Pour éviter la désagréable erreur 403 de NGINX qui signale que NGINX n’a pas les droits d’accès aux répertoires ou aux fichiers, nous allons changer le propriétaire des fichiers. Dans votre terminal sur le serveur Jeedom:
Entrez la commande
Code : Tout sélectionner
namei -l /usr/share/nginx/www/sonos/audio/fr
qui affiche les droits sur toute l’arborescence qui mène au dernier répertoire (ici /fr):
Code : Tout sélectionner
pi@jeedom ~ $ namei -l /usr/share/nginx/www/sonos/audio/fr
f: /usr/share/nginx/www/sonos/audio/fr
drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxr-xr-x root root share
drwxr-xr-x root root nginx
drwxrwxr-x www-data www-data www
drwxrwxrwx root root sonos
drwxrwxrwx root root audio
drwxrwxrwx root root fr
Entrez les commandes:
Code : Tout sélectionner
sudo chown -R www-data /usr/share/nginx/www/sonos/audio/fr
sudo chown -R www-data /usr/share/nginx/www/sonos/audio
sudo chown -R www-data /usr/share/nginx/www/sonos
Tapez à nouveau la commande name -l pour contrôler le résultat:
Code : Tout sélectionner
pi@jeedom /usr/share/nginx/www/sonos $ namei -l /usr/share/nginx/www/sonos/audio/fr
f: /usr/share/nginx/www/sonos/audio/fr
drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxr-xr-x root root share
drwxr-xr-x root root nginx
drwxrwxr-x www-data www-data www
drwxrwxrwx www-data root sonos
drwxrwxrwx www-data root audio
drwxrwxrwx www-data root fr
4. tests de fonctionnement
Dans un navigateur Internet, entrez un URL du type:
Code : Tout sélectionner
http://192.168.17.4/sonos/sonos.tts.bureau.php?message=ceci est le message à lire
Si tout va bien, vous devez entendre une voix féminine sortir du Sonos et vous susurrer « ceci est le message à lire ».
Si ce n’est pas le cas, vérifiez qu’un fichier a été créé dans /usr/share/nginx/www/sonos/audio/fr du type:
Code : Tout sélectionner
-rw-r--r-- 1 www-data www-data 37624 Feb 6 14:40 TTS-b261dcfd508c8aec0f0765e8983c2ac8.mp3
- fenêtre de terminal vers votre serveur Jeedom
- cd / ((pour remonter tout en haut de l’arborescence))
- cd /usr/share/nginx/www/sonos/audio/fr
- ls -l ((pour afficher la liste des fichiers))
- vérifiez la syntaxe de l’URL de test
- vérifiez les droits d’accès (cf 3.4)
- lancez l’application desktop Sonos
- relancez l’URL de test dans le navigateur en gardant la fenêtre Sonos visible
- vous devez voir le fichier arriver en queue dans la liste de lecture. Cela validera que le fichier est créé, placé en queue et que le Sonos tente de le récupérer. S’il doit y avoir erreur, l’application l’affichera, cela vous aidera à déterminer le problème: format de fichier, droits d’accès , etc...
- voir les logs Samba pour l’accès au répertoire partagé: /etc/Samba/ et /var/log/samba
- contrôler le répertoire dans /usr/share/nginx/www/sonos/ sonos.tts.bureau.php: la variable $directory = "jeedom/TTSdirect » ; doit bien correspondre au chemin déclaré dans Samba
- ré-indexer la musique dans le Sonos (Gérer / mise à jour de la bibliothèque musicale maintenant) et vérifier que le sonos a bien accès au partage Samba sur le Pi en allant lire directement le glass.mp3 depuis l’interface Sonos.
- contrôler que l’API Google fonctionne: poussez le son de votre PC et copiez l’ URL suivant dans votre navigateur: http://translate.google.com/translate_t ... sage&tl=fr
5. insérer un "ding" avant et après les annonces sonores
Pour attirer l'attention sur le message à venir et pour faire plus "pro", j'ai inséré un "ding" avant et après les annonces sonores. Pour cela, j'ai modifié le fichier sonos.class.php, sous la section « Convert Words (text) to Speech (MP3) » :
Code : Tout sélectionner
/**
* Convert Words (text) to Speech (MP3)
*
*/
protected function TTSToMp3($words,$lang)
{
// Directory
$folder = "audio/".$lang;
// Replace the non-alphanumeric characters
// The spaces in the sentence are replaced with the Plus symbol
$words = urlencode($words);
// Name of the MP3 file generated using the MD5 hash
$file = md5($words);
// If folder doesn't exists, create it
if (!file_exists($folder))
mkdir($folder, 0755, true);
// Save the MP3 file in this folder with the .mp3 extension
$file = $folder."/TTS-".$file.".mp3";
// creates a glass sound to place before and after the voice message
$glass = file_get_contents('./audio/fr/glass.mp3');
// If the MP3 file exists, do not create a new request
if (!file_exists($file))
{
ini_set('user_agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0');
$mp3 = file_get_contents('http://translate.google.com/translate_tts?q='.$words.'&tl='.$lang);
file_put_contents($file, $glass);
file_put_contents($file, $mp3,FILE_APPEND);
file_put_contents($file, $glass, FILE_APPEND);
}
return $file;
}
Code : Tout sélectionner
/usr/share/nginx/www/sonos/audio/fr