Avant toute chose merci de (re)prendre connaissance de la charte et de la respecter.
Pour résumer :
- Avant de poser une question, je cherche si la réponse existe
- Je suis poli, courtois et je respecte tout un chacun sur le forum
- Si un post m'agace : je m'en éloigne plutôt que de répondre d'une façon qui pourrait être mal interprétée


Il n'est jamais du luxe que de rappeler des choses simples :
Courtoisie, amabilité, politesse et bonne humeur sont les maîtres mots pour un forum sympathique, bienveillant et accueillant :)

Toute la communauté vous remercie

TTS SONOS

Avatar de l’utilisateur
Sshafi
Actif
Messages : 3891
Inscription : 01 juil. 2014, 16:08
Localisation : Albi

TTS SONOS

Message par Sshafi » 16 nov. 2016, 15:38

Tuto de @crinq

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
Je vais détailler tout ceci au fur et à mesure. Pour ma part, j’ai mis en place une variante des fichiers PHP originaux qui va insérer un « ding » avant et après le texte à lire (comme à la gare).
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:

    Code : Tout sélectionner

    SSH XXX.XXX.XXX.XXX -l pi  ((XXX.XXX.XXX.XXX est l’adresse IP de votre serveur Jeedom))
    —> le serveur va vous demander votre mot de passe. Si vous avez laissé le mot de passe par défaut, ce sera : raspberry

    - 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
Cette partie du tutoriel reprend en grande partie les infos que j’ai trouvé sur le forum Sonos: http://forums.sonos.com/showthread.php?t=13224 . Merci donc à l’utilisateur Dougalf pour sa contribution.

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 !))
2. vérifier que l'utilisateur sonos peut accéder aux fichiers musicaux:

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))
Si tout va bien, vous devez voir le contenu du répertoire, ou au moins les fichiers cachés . et .. si le répertoire est vide (ce qui devrait être le cas puisque nous n’y avons encore rien mis).

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
Si l'affichage est :

Code : Tout sélectionner

samba-common     install
alors samba est installé.

Sinon il faut l'installer:

Code : Tout sélectionner

sudo apt-get install samba
4. configurer 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))
En cas de mauvaise manipulation, il suffira de renommer le fichier smb.conf.original en smb.conf pour retrouver la configuration initiale.
Pour éditer le fichier de configuration samba:

Code : Tout sélectionner

sudo nano /etc/samba/smb.conf   ((lance l’éditeur de texte))
Les modifications à apporter sont:

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
Tout à la fin du fichier, nous allons ajouter les répertoires à partager:

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
Pour sauver les modifications et quitter l’éditeur de texte nano:
  • tapez « control - X » : quitte le mode d’édition
  • confirmez l’enregistrement des modifications en tapant « y »
  • confirmez le nom du fichier en pressant ENTER
5. modifier ou créer le fichier des utilisateurs samba:

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:

    Code : Tout sélectionner

    sudo pdbedit -a -u sonos
    --> entrer un mot de passe qui sera utilisé dans la configuration du sonos
  • Relancer samba pour qu'il prenne la nouvelle configuration en compte:

    Code : Tout sélectionner

    sudo /etc/init.d/samba restart
2.2 ajouter la bibliothèque musicale du share Samba et ré-indexer la musique

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
Après l’opération, l’interface doit montrer:
Image


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
3.2 adapter les fichiers PHP:

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:

Image

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))
La section à modifier ressemble à ceci:

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)
Attention lors de l’édition à:
  • 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).
Alternativement, l’édition peut se faire directement sur le Pi avec la commande :

Code : Tout sélectionner

sudo nano sonos.tts.bureau.php
3.3 transfert des fichiers 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
En remplaçant:
  • /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
Si vous utilisez une machine Windows, vous n’avez pas de terminal avec les commandes Unix. Vous pouvez utiliser soit un client FTP (mais cela veut dire qu’il faut installer un serveur FTP sur votre serveur Jeedom), soit utiliser l’utilitaire Winscp ( http://winscp.net/eng/docs/lang:fr)

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
On voit ici que seul l’utilisateur root a accès aux répertoires /sonos/audio/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
Ces commandes changent le propriétaire des répertoires qui devient l’utilisateur www-data.
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
en veillant bien à remplacer l’adresse IP par l’adresse de votre serveur et à modifier le nom de du fichier PHP pour refléter le nom de votre fichier.

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
Pour cela:
  • 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))
Si aucun fichier n’est créé:
  • vérifiez la syntaxe de l’URL de test
  • vérifiez les droits d’accès (cf 3.4)
Si un fichier est créé mais pas lu:
  • 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...
En cas de problème:
  • 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;
       }
Le fichier que j'ai utilisé est le son de verre frappé par une cuillère bien connu des utilisateurs de Mac ou d'iPhone. Vous trouverez le fichier sur votre Mac sous system > library > sounds > glass.aiff Il faut le convertir en MP3 à l'aide d'iTunes (importez le dans iTunes puis choisissez l'option "convertir en MP3") et le placer dans le répertoire :

Code : Tout sélectionner

/usr/share/nginx/www/sonos/audio/fr
sur le Pi. Attention, le fichier doit être nommé glass.mp3. Bien-sûr, vous pouvez le nommer comme vous le souhaitez à condition d'adapter le code ci-dessus avec le nom que vous avez choisi. Et bien-sûr vous pouvez prendre n'importe quel son qui vous fait plaisir (rendez-vous sur soundcloud.com pour trouver des sons sympas), la seule contrainte est que votre fichier doit être en format mp3.
??? Menfin ...
VM ESXi # Aeon Lab Gen5 | RFXtrx433E | ...
Trucs & Astuces

Verrouillé

Revenir vers « Utilisation & Astuces »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité