Site icon Abavala !!!

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.

 

Quitter la version mobile