PAW: synthèse vocale multilingue sous Android7 minute(s) de lecture

En regardant la documentation de PAW, j’ai été agréablement surpris par toute le fonctionnalités offertes par la solution surtout si l’on considère qu’il s’agit d’une version bêta! Mon premier exercice a consisté à créer un synthétiseur vocal un peu a l’image de ce que l’on peut obtenir lorsque nous voyons arriver le Karotz dans un système domotique. Accessible via une URL et un lien HTTP, PAW peut également donner de la voix à la domotique.  Suivez le guide!

Pour atteindre mon but, je me suis mis au script BeanShell. Proche du JavaScript, on peut trouver pas mal d’exemples sur le web. Après quelques plantages liés à la jeunesse du développeur, le résultat me semble pas trop mal. En me basant également sur les exemples fournis avec PAW, j’ai pu arriver à mes fins avec un script qui a les spécificités suivantes:

  • Pouvoir être appelé par une simple requête HTTP
  • Pouvoir passer en paramètre la phrase à prononcer
  • Pouvoir passer en paramètre le volume sonore
  • Pouvoir passer en paramètre la langue

Le volume sonore est un petit plus bien sympathique qui permet de ne pas louper une alerte importante lorsque l’on regarde la télévision par exemple. Quand au choix de la langue, il permet d’utiliser des phrases clés en langues étrangères dans le but d’agrémenter un peu le discours. C’est tellement plus sympa un “let’s go” prononcé avec le bon accent!

Afin de permettre un appel sans se compliquer la vie, le paramètre du volume sonore ainsi que celui de la langue parlée sont optionnels.  Non renseignés, le volume utilisé sera celui de votre téléphone, la langue sera celle paramétrée comme langue par défaut sur votre portable.

Pour obtenir le service attendu et maintenant que le script est là il suffit de le placer sur le serveur et le tour est joué.

Voici le script que je vous propose:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Synthèse vocale</title>
<bsh>

// récupération des éléments de configuration audio du tél
import android.media.AudioManager;
import android.content.Context;

service = server.props.get("serviceContext");
audioMgr = service.getSystemService(Context.AUDIO_SERVICE);
maxVolume = audioMgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
volume = audioMgr.getStreamVolume(AudioManager.STREAM_MUSIC);

//
// récupération des paramètres de l'appel 
//
texte = parameters.get("texte");
vol = parameters.get("vol");
langue = parameters.get("langue");

//
// Gestion du volume 
//
//si le volume n'est pas passé en paramètre on ne le modifie pas
if (vol!=null) {
	audioMgr.setStreamVolume(AudioManager.STREAM_MUSIC, eval(vol), 0);
}

//
// Synthèse vocale   
//

//si la langue n'est pas passée en paramètre on prend celle par défaut du tél
if (langue==null) {
	langue = "";
}

switch (langue) {
	case "en":
		lang = "new Locale(\"en\", \"EN\")";
		break;
	case "fr":
		lang = "new Locale(\"fr\", \"FR\")";
		break;
	case "de":
		lang = "new Locale(\"de\", \"DE\")";
		break;
	case "it":
		lang = "new Locale(\"it\", \"IT\")";
		break;
	case "es":
		lang = "new Locale(\"es\", \"ES\")";
		break;
	default:
		lang = "Locale.getDefault()";
}

//si le texte n'est pas passée en paramètre 
if (texte==null) {
	texte = "";
}

//Ceci est la commande de synthèse vocale...
speak (texte, eval(lang));

//On remet le volume à sa valeur précédente
if (vol!=null) {
	audioMgr.setStreamVolume(AudioManager.STREAM_MUSIC, eval(volume), 0);
}

</bsh>
</head>

<body>

<h1>Synthèse vocale</h1>

<h2>Paramètres</h2>
<p>
La page prend en paramètre d'entrée les éléments suivants:<br>
<ul>
<li>texte : le texte qui doit être énoncé</li>
<li>langue  : la langue qui doit être parlée<br>
	<ul>
        <li>en : anglais</li>
        <li>fr : français</li>
        <li>de : allemand</li>
        <li>it : italien</li>
        <li>es : espagnol</li>
	</ul>
</li>
<li>vol   : le volume sonore de diffusion</li>
</ul>
</p>
<p>
vol   : le volume sonore de diffusion<br>
</p>
<h2>Fonctionnement</h2>
<p>
L'appel se fera donc de la manière suivante: <br>
http://192.168.0.10:8080/scripts/text_to_speech.xhtml?texte=phrase%20de%20test&langue=fr&vol=10<br>
<br>
L'appel pourra se faire plus simplement de la manière suivante si l'on conserve les paramètres par défaut: <br>
http://192.168.0.10:8080/scripts/text_to_speech.xhtml?texte=phrase%20de%20test<br>
</p>
<h2>Valeurs</h2>
<p>
Volume ini du tél : <bsh>$$.print(volume); </bsh><br>
Volume souhaité   : <bsh>$$.print(vol); </bsh><br>
Volume max du tél : <bsh>$$.print(maxVolume); </bsh><br>
</p>
<p>
Langue : <bsh>$$.print(langue); </bsh><br>
</p>
<p>
Texte à dire : <bsh>$$.print(texte); </bsh>
</p>

</body>
</html>

Comme vous le voyez, le script est assez “simple” en fait vu que l’on fait appel à des fonctionnalités existantes de base sur Android et présentées de manière packagées en BeanShell dans PAW.

L’installation se fait de manière très simple.  Le prérequis est bien entendu d’avoir installé au préalable le serveur PAW sur votre téléphone Android comme présenté dans le précédent article:

  • Télécharger le code précédent et le sauvegarder le sur votre disque dur dans un fichier appelé : “text_to_speech.xhtml”
  • Se connecter au serveur PAW.
  • Accéder au gestionnaire de fichiers : Menu Media->File manager

  • Dans le répertoire /sdcard/paw/html de votre téléphone créer le répertoire “actions

  • Indiquer l’endroit de votre disque dur où se trouve le script à uploader sur le serveur PAW en cliquant sur “Parcourir”.

  • Sélectionner le fichier “text_to_speech.xhtml” et cliquer sur “Open”.

  • Effectuer l’upload en cliquant sur “Upload”.

  • Le message suivant vous confirme le chargement du script sur le serveur.

Il ne vous reste plus qu’à renseigner l’URL adéquate dans un scénario pour une Zibase ou bien dans un périphérique HTTP sur un serveur eedomus.

L’URL simplifiée à renseigner sera de la forme:

http://192.168.0.10:8080/actions/text_to_speech.xhtml?texte=phrase%20de%20test

En modifiant bien entendu “192.168.0.10” par l’adresse IP de votre serveur PAW et “phrase%20de%20test” par la phrase que vous souhaitez voir prononcer.

L’URL complète à renseigner sera la même que la précédente mais en renseignant la langue et/ou le volume sonore:

http://192.168.0.10:8080/actions/text_to_speech.xhtml?texte=just%20testing&langue=en&vol=12

En modifiant toujours “192.168.0.10” par l’adresse IP de votre serveur PAW et “phrase%20de%20test” par la phrase que vous souhaitez voir prononcer. Sur mon téléphone le volume va de 0 à 15.  Il faudra vérifier les valeurs admises sur le votre en lançant une première fois le script: cette valeur y est affichée.

Les valeurs possibles des langues dans mon script sont les suivantes:

  • en : anglais
  • fr : français
  • de : allemand
  • it : italien
  • es : espagnol

Pour illustrer cela voici une petite vidéo préparée en déclenchant la synthèse vocale lorsque l’on appuie sur le bouton d’une télécommande.  Le serveur utilisé est ici une Zibase.

 

19 Comments

  1. vincent said:

    Bonjour,

    Merci beaucoup pour ce script, j’aimerais enregistrer la synthese vocale dans un fichier wave ou mp3 afin de l’envoyer sur mes squeezebox.

    Est ce possible?

    Merci
    Cordialement

    20 janvier 2013
    Reply
    • Avatar photo Hervé said:

      Bonsoir,
      Si je comprends bien ce que vous souhaitez faire c’est de ne pas faire parler le téléphone mais de générer à la volée un fichier Wav ou MP3 qui contiendrait la phrase à dire et qui serait donnée à une squeezebox. Si c’est possible avec Android ça devrait être possible avec PAW. Je ne m’y connais pas encore assez malheureusement en développement Android pour pouvoir vous répondre. 🙁

      21 janvier 2013
      Reply
  2. Christian said:

    je suis assez interessé par le sujet de votre article.
    J’ai bien réussi à implanter PAW sur ma tablette
    Je n’arrive pas à faire fonctionner la synthèse vocale apres avoir recopier votre script … n’etant pas tres doué en programmation pour retrouver mes erreurs dus à la recopie du script, pouvez vous m’adresser le fichier de ce script
    merci

    de plus merci de vos articles tres enrichissants
    Cordialement
    Christian

    13 mars 2013
    Reply
  3. Christian said:

    Après de nouveaux essais, j’ai pu faire fonctionner correctement la synthèse vocale.
    Merci
    Cordialement
    Christian
    Permettez vous que j’en parle sur mon blog à l’occasion en donnant bien sur le lien à votre page ?

    13 mars 2013
    Reply
    • Avatar photo Hervé said:

      Bonjour,
      Content que ça fonctionne! Pas de soucis pour que vous en parliez également surtout avec un lien 😉

      14 mars 2013
      Reply
  4. fx said:

    Bonjour
    j’ai un galaxy y j’ai essayé de faire la manip mais ça ne fonctionne pas… j’essai d’envoyer l url pour tester via mon navigateur, elle m ‘affiche la page synthèse vocale mais au niveau du tel aucun son… mer de ton aide

    15 juin 2013
    Reply
    • Avatar photo Hervé said:

      Bonjour fx,
      As-tu essayé les exemples de base fourni par PAW. Est-ce que tout fonctionne correctement?

      17 juin 2013
      Reply
  5. fx said:

    si je tape mon texte dans la page web de paw et je fais speak ça ne marche pas non plus

    22 juin 2013
    Reply
  6. Fred said:

    Bonjour,

    Je viens de tester votre script et il fonctionne parfaitement. Merci beaucoup !

    Je vois de nouvelles applications s’ouvrir avec ma Zibase !

    J’ai juste eu à corriger une petite erreur au niveau des balises
    langue : la langue qui doit être parlée
    en langue : la langue qui doit être parlée

    Demain je teste les sms !

    20 novembre 2013
    Reply
  7. mickael said:

    bonjour,
    et bien moi cela ne fonctionne pas,
    j’ai un message suivant qui s’affiche lorsque je lance une url:
    Got the error: Not Found
    while trying to obtain /actions/text_to_speech.xhtml

    j’ai pourtant bien le fichier installé dans le repertoire,
    quelqu’un as t il une idée? merci d’avance

    14 novembre 2014
    Reply
  8. Vincent said:

    Question : Serait-il possible d’utiliser la Camera via PAW dans eedomus ???

    Un grand merci, ma box eedomus me parle maintenant. 🙂

    26 février 2015
    Reply
  9. eole210 said:

    Super instructif ! Respect pour avoir pris le temps de consolider vos tests et recherches sur les possibilités de text-to-speech android. Je m’en vais faire parler ma Zibase via une tablette qui dort depuis longtemeps dans un tiroir mais qui va connaître une deuxième vie.

    Grand merci à vous Hervé.

    29 août 2016
    Reply
  10. eole210 said:

    Je viens de mettre la solution d’Hervé en place, ça fonctionne du tonnerre. Ci-dessous quelques remarques :
    1- Dans l’URL, ‘vol=10’ ne fonctionne pas pour moi, il faut écrire ‘volume=10’ pour que la page d’instructions se réaffiche en retour (sinon on a une page introuvable si je me souviens bien)
    2- Zibase : l’appel d’URL avec des espaces ne fonctionne pas. On voit dans le suivi d’activité une erreur 505 qui est trompeuse (505=refus de la version du client). Ce n’est pas ça, le problème vient de la gestion des espaces. En remplaçant les espaces par des %20, ça fonctionne. Dans mon cas, je faisais des tests avec la phrase “Alerte activée”, j’ai du remplacer cela par “Alerte%20activée” et là pas de problème.
    3- Lors de l’upload du fichier ‘text_to_speech.xhtml’, dans l’explorateur de fichier de PAW, il faut sélectionner les repertoire dans la partie gauche pour s’assurer qu’ils soient bien sélectionnés. J’ai du m’y reprendre à plusieurs fois pour la creation du repertoire ‘actions” et son fichier.
    4-Enfin, j’ai testé avec 2 petites tablettes Android 7 pouces : sur la petite Lenovo à 69€ (achetée en 2015), j’ai des temps de réponse horribles qui rendent cette tablette inexploitable. Par contre, avec la petite Samsung Galaxy achetée vers 2015, autour de 100 euros, c’est niquel.

    Question : comment connaître la valeur du volume max de sa tablette/telephone ? J’ai trouvé que 14 était la valeur max, à l’oreille, mais je me demandais si il y avait un autre moyen.

    30 août 2016
    Reply
  11. Chris said:

    Bonjour

    J’ai suivi cet excellent tuto et ça marche très bien. J’ai juste un problème avec les lettres accentuées …
    Pour un ‘ é ‘ la synthese prononce ‘ acopyright ‘
    Exemple ‘fermée é–> ‘fermacopyrighte’
    Une petite idée du problème ?

    26 décembre 2016
    Reply
  12. Chris said:

    Bon je me réponds
    En fait ça marche correctement .
    Mais dans ma domotique ( script dans Jeedom )ça déconne !
    Je vais chercher de ce coté

    26 décembre 2016
    Reply
  13. jeanclic said:

    Bonjour,

    grace à ces tutos, Domoticz sait parler, par ma tablette ! merci.

    Je cherche également à utiliser PAW pour activer/désactiver/vérifier l’état du partage de connexion Wi-Fi de la tablette. J’ai trouvé quelques bouts de code Java, mais je n’ai pas réussi pour le moment à faire fonctionner ce code en bsh avec PAW. (j’utilise parfois ma tablette comme point d’accès).

    Pouvez-vous m’aider ? (le but ultime étant de pouvoir activer/désactiver le partage de connexion de la tablette via un bouton on/off sur Domoticz…)

    Merci d’avance,

    Cordialement,

    Jean

    18 février 2017
    Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Prouvez que vous êtes humain: * Time limit is exhausted. Please reload CAPTCHA.