PAW: synthèse vocale multilingue sous Android

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.

Image de prévisualisation YouTube

 

Ceci pourrait vous intéresser:

12 commentaires

  1. vincent a dit:

    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
    Répondre
    • Hervé a dit:

      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
      Répondre
  2. a dit:

    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
    Répondre
  3. a dit:

    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
    Répondre
    • Hervé a dit:

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

      14 mars 2013
      Répondre
  4. fx a dit:

    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
    Répondre
    • Hervé a dit:

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

      17 juin 2013
      Répondre
  5. fx a dit:

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

    22 juin 2013
    Répondre
  6. Fred a dit:

    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
    Répondre
  7. mickael a dit:

    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
    Répondre

Laisser un commentaire

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


5 − 1 =