Java Speech
Java Speech
Programmer le traitement de la
parole
Jean-Marc Farinone
Xavier Castellani
XIX-1 JMF
Java Speech Le langage Java
Assistant Professor
Conservatoire National des Arts et Métiers
CNAM Paris (France)
XIX-2 JMF
Java Speech Le langage Java
Fundamental notions
• Definition
• 100% pure Java
• 2 design patterns : Bridge and Abstract
Factory
XIX-3 JMF
Java Speech Le langage Java
Multimedia = ?
Reuse in Java
XIX-5 JMF
Java Speech Le langage Java
??
OS and hardware
XIX-6 JMF
Java Speech Le langage Java
Java classes
Native Librairies
OS and hardware
XIX-7 JMF
Java Speech Le langage Java
Native Librairies
OS and hardware
XIX-8 JMF
Java Speech Le langage Java
• It's OK !!
• You reuse other codes
• Some limitations:
– non dynamic loading of classes
(which classes ?)
– security restrictions
– non portability
XIX-9 JMF
Java Speech Le langage Java
XIX-10 JMF
Java Speech Le langage Java
Rappel Java
• Une référence d'interface peut repérer tout
objet ...
• … non pas d'une interface (pourquoi ?)
• … d'une classe qui implémente cet interface.
public interface MonInterface { …}
public class MaClasse implements MonInterface { …}
//
récupéré
XIX-11 JMF
Java Speech Le langage Java
XIX-13 JMF
Java Speech Le langage Java
Plan de l'exposé
• Présentation
• Une application traitant la parole : étude
UML
• La "pile" pour traiter la parole
• Synthèse de la parole : JSML
• Reconnaissance de la parole : JSGF
• Exemples d'applications
• Bibliographie
XIX-14 JMF
Java Speech Le langage Java
chargement et
"écoute" de la page
HTML
Démonstration
XIX-15 JMF
Java Speech Le langage Java
Démonstration
XIX-16 JMF
Java Speech Le langage Java
XIX-17 JMF
Java Speech Le langage Java
XIX-18 JMF
Java Speech Le langage Java
Cas d'utilisation
XIX-19 JMF
Java Speech Le langage Java
Diagramme de composants
• composant = module logique de code
• Souvent regroupé dans un paquetage (c'est
le cas ici pour ... simplifier !)
XIX-20 JMF
Java Speech Le langage Java
XIX-21 JMF
Java Speech Le langage Java
XIX-22 JMF
Java Speech Le langage Java
XIX-23 JMF
Java Speech Le langage Java
Diagramme de déploiement
• = Diagramme de mise en place
• Indique les différents "acteurs logiciels et
matériels" lors de l'utilisation du
programme
XIX-24 JMF
Java Speech Le langage Java
Diagramme de déploiement
XIX-25 JMF
Java Speech Le langage Java
XIX-26 JMF
Java Speech Le langage Java
Diagramme de classes
• Définitions et relations entre les classes
XIX-27 JMF
Java Speech Le langage Java
Diagramme de classe
XIX-28 JMF
Java Speech Le langage Java
Diagramme de collaboration
• Liens entre objets et les messages échangés
entre eux.
XIX-29 JMF
Java Speech Le langage Java
Diagramme de collaboration
XIX-30 JMF
Java Speech Le langage Java
Diagramme de séquences
• Description d'un scénario d'utilisation du
logiciel
XIX-31 JMF
Java Speech Le langage Java
XIX-32 JMF
Java Speech Le langage Java
Diagramme d'états
• Description du comportement d'un objet i.e.
les différents états dans lequel il peut être
durant l'exécution du logiciel, les causes (et
les conséquences) d'un changement d'état.
• = Cycle de vie d'un objet
XIX-33 JMF
Java Speech Le langage Java
XIX-34 JMF
Java Speech Le langage Java
Un exercice de conception
Programmer le traitement de la
parole
XIX-36 JMF
Java Speech Le langage Java
Java Speech
• = Spécification des acteurs du monde du
traitement de la parole dans les programmes
IHM (SUN + Apple Computer, AT&T,
Dragon Systems, IBM, Novell, Philips
Speech Processing, and Texas Instruments
Incorporated)
• Sun ne fournit pas d'implémentation
complète de Java Speech
• Voir à
http://java.sun.com/products/java-
media/speech
XIX-38 JMF
Java Speech Le langage Java
XIX-39 JMF
Java Speech Le langage Java
XIX-40 JMF
Java Speech Le langage Java
XIX-42 JMF
Java Speech Le langage Java
Notre programme
XIX-43 JMF
Java Speech Le langage Java
Notre programme
Une seconde
ibmjsXXX.jar : implantation des API Java Speech installation
XIX-45 JMF
Java Speech Le langage Java
Description en Java
XIX-46 JMF
Java Speech Le langage Java
Implantation en Java
• A l'aide d'une classe
package cnam.valC.speech;
import javax.speech.recognition.*;
/**
* A Grammar defines a set of tokens (words) that may
* be spoken and the patterns in which those tokens may
* be spoken. Different grammar types (dictation vs.
* rule) define the words and the patterns in different
* ways.
*/
public class MaClasse implements Grammar {
/**
* Request notifications of events from any Result that
* matches this Grammar.
*/
public void addResultListener(ResultListener listener)
{// le code spécifique …}
...
}
XIX-47 JMF
Java Speech Le langage Java
Description/Implantation en Java
• Le compilateur vérifie que la classe donne
bien un corps à la méthode spécifiée par
l'interface
• => L'interface a indiqué complètement la
signature de la méthode à implanter
• => tous les développeurs savent que c'est
cette méthode qui est appelée
• => Le langage, les environnements aussi !!
XIX-48 JMF
Java Speech Le langage Java
Package = {classes} U
{interfaces} U {exceptions}
XIX-49 JMF
Java Speech Le langage Java
XIX-50 JMF
Java Speech Le langage Java
XIX-51 JMF
Java Speech Le langage Java
Le synthétiseur de la parole
• Est fonction d'une langue (français,
allemand, anglais).
• Les divers états d'un synthétiseur sont
l'activation, la mise en pause, la reprise et
l'arrêt de la lecture.
XIX-52 JMF
Java Speech Programme (complet) de synthèse de la parole Le langage Java
import javax.speech.*;
import javax.speech.synthesis.*;
import java.util.Locale;
Explication du programme
Le synthétiseur de la parole
(suite)
• On peut, dynamiquement, changer certaines
caractéristiques comme :
- le volume sonore : du chuchotement au
volume maximum.
- la vitesse d'élocution
- la tessiture (hauteur moyenne et intervalle
autour de cette moyenne) de la voix
- le style de voix (homme, femme, robot,
agé, jeune, enrhumé, heureux, ...)
XIX-55 JMF
Java Speech Le langage Java
Démonstration JSML
"Bienvenue à ce séminaire. Bonjour
<EMP LEVEL="strong">mesdames</EMP>, bonjour
<EMP LEVEL="reduced">, messieurs</EMP>
<BREAK MSECS="1000" />
avec la balise SAYAS, le sigle<SAYAS SUB="S S deux zI">SSII</SAYAS>
<BREAK MSECS="1000" />
sans balise SSII
<BREAK MSECS="1000" />
<PROS PITCH="100">essai d'une voix grave</PROS>
<PROS PITCH="200">essai d'une voix aiguë</PROS>
<BREAK MSECS="1000" />
<PROS VOL="0.1">en parlant très doucement</PROS>
<BREAK MSECS="1000" />
<PROS VOL="0.9">ou encore très fort</PROS>
<BREAK MSECS="1000" />
fin du message"
• 2bienvenue.bat
XIX-57 JMF
Java Speech Le langage Java
Programmation JSML
import javax.speech.*;
import javax.speech.synthesis.*;
XIX-58 JMF
Java Speech Le langage Java
XIX-59 JMF
Java Speech Le langage Java
XIX-60 JMF
Java Speech Le langage Java
Reconnaissance de la parole
XIX-61 JMF
Java Speech Le langage Java
Reconnaissance de la parole
XIX-64 JMF
Java Speech Le langage Java
Démonstration
• Dialogue entre l'humain et l'ordinateur
ordinateur> Bonjour humain, mon nom est ordinateur, quel est votre nom ?
humain> Je m'appelle prénom nom
ordinateur> Bonjour prénom nom
humain> Répétez après moi
ordinateur> Je t'écoute
humain> au revoir
ordinateur> A bientôt
• 3demoJS
XIX-65 JMF
Java Speech Le langage Java
XIX-66 JMF
Java Speech Le langage Java
Reconnaissance de la parole
XIX-67 JMF
Java Speech Le langage Java
Les "Grammars"
• Une grammaire (Grammar) doit être créée et activée pour
un reconnaisseur (Recognizer) afin qu'il sache ce qu'il
doit écouter principalement.
• DictationGrammar : grammaire de dictée = ce qui permet
de reconnaitre les mots d'une langue naturelle (pour les
dictées dans les mails, les traitements de texte, ...)
• RuleGrammar = grammaire de règles = grammaire hors
contexte (construite à l'aide de JSGF) donnée par un
programmeur décrivant des phrases susceptibles d'être
dites par un utilisateur.
XIX-68 JMF
Java Speech Le langage Java
Reconnaissance de la parole
(suite)
• Les états d'un reconnaisseur sont
l'activation, la désactivation.
• Il gère les diverses grammaires qu'il utilise
• Java Speech utilise la technique des
auditeurs lorsqu'une phrase a été reconnue.
XIX-69 JMF
Java Speech Le langage Java
• Réponse :
– interface, méthodes spécifiées dans cet
interface, classe qui doit implanter cette
interface, Vector de listeners dans l'objet.
XIX-71 JMF
Java Speech Le langage Java
Grammaire de dictée
(Dictation Grammar)
• Une telle grammaire impose peu de
contraintes i.e. s'intéresse à tout ce qui peut
être dit dans une langue donnée
• Dictation Grammar = "grammaire" d'un
langage naturel (français, anglais, etc.)
• Nécessite plus de ressources système que
les rule grammar
XIX-72 JMF
Java Speech Le langage Java
Grammaire de dictée
(Dictation Grammar)
• On ne créée pas, dans le programme, de
dictation grammar : on récupère une telle
grammaire à "l'aide des couches basses"
• Peut être optimisées pour certains domaines
(médecine, commercial, etc.)
XIX-73 JMF
Java Speech Le langage Java
Grammaire de règles
(Rule Grammar)
• Java Speech permet :
– de définir des grammaires (de règles) qui
décrivent ce qu'un utilisateur peut dire
– d'associer un traitement aux phrases reconnues.
• Grammaires de règles sont définies par
JSGF (Java Speech Grammar Format)
• Spécifications de JSGF à :
http://java.sun.com/products/java-
media/speech/forDevelopers/JSGF/index.h
XIX-74 JMF
tml
Java Speech Le langage Java
Programmer la reconnaissance de
la parole
• Les diverses notions vues précédemment
sont modélisées par des objets de classes.
• Ces objets sont construits (par new
UneClasse()) ou récupérés car accessibles
par la bibliothèque Java Speech.
XIX-75 JMF
Java Speech Le langage Java
Reconnaissance : un premier
exemple simple
• Voir à :
http://java.sun.com/products/java-
media/speech/forDevelopers/jsapi-
guide/Recognition.html
grammar javax.speech.demo;
• 4RecSimple.bat
XIX-77 JMF
Java Speech Le langage Java
Reconnaissance : un premier
exemple simple (et complet) 1/3
import javax.speech.*;
import javax.speech.recognition.*;
import java.io.FileReader;
import java.util.Locale;
// Lance ce reconnaisseur
rec.allocate();
Reconnaissance : un premier
exemple simple (et complet) 2/3
// Associe un listener à ce reconnaisseur
rec.addResultListener(new HelloWorld());
XIX-79 JMF
Java Speech Le langage Java
Reconnaissance : un premier
exemple simple (et complet) 3/3
// Reçoit uniquement les événements RESULT_ACCEPTED :
// Ecrit ce qui a été reconnu,
// désalloue les ressources et termine le programme
rec.deallocate();
System.exit(0);
}
}
XIX-80 JMF
Java Speech Le langage Java
Explication de demoJS
• grammaire de texte à reconnaître
hello_fr.gram
grammar hello;
<first> = Henri {Henri}
| Maurice {Maurice}
| Victor {Victor}
;
<last> = Matisse {Matisse}
| Chevalier {Chevalier}
| Hugo {Hugo}
;
<name> = <first> <last>;
public <nameis> = Je m'appelle {name} <name>;
public <begin> = Répétez après moi {begin};
public <stop> = C'est fini {stop};
public <bye> = Au revoir {bye};
XIX-81 JMF
Java Speech Le langage Java
Rule grammar
• | = ou bien
• [ ] optionnel (i.e. 0 ou 1)
• () = regroupement
• * = 0 ou plusieurs
XIX-83 JMF
Java Speech Le langage Java
XIX-84 JMF
Java Speech Le langage Java
Programme reconnaissance de la
parole
• Chargement d'un reconnaisseur de parole
• Chargement de la grammaire
• Associer un auditeur au reconnaisseur
• L'auditeur lance sa méthode
resultAccepted() lorsqu'une règle a été
reconnue.
XIX-85 JMF
Java Speech Le langage Java
Reconnaissance/synthèse de la
parole
• Le fichier de configuration (de propriétés)
entre autre pour les réponses de
l'ordinateur.
res_fr.properties
# file for grammar (pour la reconnaissance)
grammar = hello_fr.gram
XIX-86 JMF
Java Speech Le langage Java
Reconnaissance/synthèse de la
parole (suite)
• Le fichier de grammaire pour les phrases
que doit reconnaître l'ordinateur.
hello_fr.gram
grammar hello;
grammar hello;
<first> = Bruce {Bruce}
| Andrew {Andrew}
| Stuart {Stuart}
;
<last> = Lucas {Lucas}
| Hunt {Hunt}
| Adams {Adams}
La rule grammar
;
<name> = <first> <last>;
public <nameis> = My name is {name} <name>;
anglaise
public <begin> = Repeat after me {begin};
public <stop> = That's all {stop};
public <bye> = Good bye {bye} | So long {bye};
XIX-88 JMF
Java Speech Le langage Java
Multithreading Java
• Un programme Java lance plusieurs
threads à l'exécution.
• Un programme Java se termine lorsque
toutes les threads non démons sont
terminées
• Ce qui explique que le programme suivant
ne se termine pas.
XIX-89 JMF
Java Speech Le langage Java
XIX-90 JMF
Java Speech Le langage Java
XIX-91 JMF
Java Speech Le langage Java
Programme traitant la parole : syntaxe (1/7)
import java.io.*;
import java.util.*;
import javax.speech.*;
import javax.speech.recognition.*;
import javax.speech.synthesis.*;
XIX-92 JMF
static ResultListener ruleListener = new ResultAdapter() {
Java Speech Le langage Java
Programme traitant la parole : syntaxe (2/7)
public void resultAccepted(ResultEvent e) {
try {
// On récupère les balises à l'aide de
l'événement
FinalRuleResult result = (FinalRuleResult) e.getSource();
String tags[] = result.getTags();
// L'utilisateur a dit la phrase correspondant à la
// règle "name" ("Je m'appelle ...", "my name is
...")
if (tags[0].equals("name")) {
// On construit la réponse ("bonjour
…")
// On récupère ce qui correspond à
"hello" dans
// le fichier de configuration des
phrases locales
String s =
resources.getString("hello");
for (int i=1; i<tags.length; i++)
s += " " + tags[i];
// on lance la synthèse
vocale
speak(s);
// L'utilisateur a dit la phrase correspondant à la
// règle "begin"("répéter après moi" ou "repeat after me", …)
} else if (tags[0].equals("begin")) {
// l'ordinateur répond et se prépare
XIX-93 pour la dictée JMF
Java Speech Le langage Java
Programme traitant la parole : syntaxe (3/7)
// L'utilisateur a dit "c'est fini"
} else if (tags[0].equals("stop")) {
// la dictation grammar est désactivée
// au profit de la rule grammar.
dictationGrammar.setEnabled(false);
ruleGrammar.setEnabled(true);
recognizer.commitChanges();
//
// la méthode main()
//
XIX-96 JMF
Java Speech Le langage Java
Programme traitant la parole : syntaxe (6/7)
public static void main(String args[]) {
try {
// Chargement de ressources locales
// la "culture" locale (exemple le français métropolitain fr_FR)
System.out.println("locale is " + Locale.getDefault());
// Synthèse de la parole
// crée un synthesizer correspondant à la culture locale (null),
// lance un message de bienvenu (méthode statique de cette classe)
synthesizer = Central.createSynthesizer(null);
if (synthesizer!=null) synthesizer.allocate();
speak(resources.getString("greeting"));
} catch (Exception e) { e.printStackTrace();System.exit(-1);}
}
}
XIX-98 JMF
Java Speech Le langage Java
Exemples d'applications
XIX-99 JMF
Java Speech Le langage Java
XIX-100 JMF
Java Speech Le langage Java
XIX-101 JMF
Java Speech Le langage Java
Bibliographie
XIX-102 JMF
Java Speech Le langage Java
Bibliographie (suite)
• http://java.sun.com/products/java-media/speech :
page d'accueil Java Speech. Les
technologies Java pour le traitement de la
parole
• Récupérer les archives du groupe de
discussion sur Java Speech à
http://archives.java.sun.com/javaspeech-
interest.html
XIX-103 JMF
Java Speech Le langage Java
Bibliographie (suite)
XIX-104 JMF
Java Speech Le langage Java
Bibliographie (fin)
• http://java.sun.com/products/java-
media/speech/forDevelopers/jsapi-
guide/index.html: le guide de
programmation Java Speech
XIX-105 JMF
Java Speech Le langage Java
Fin
XIX-106 JMF