You are on page 1of 26

voiceBrowser:

un navegador Web para Invidentes

Tecnologas Multimedia en Java: Sntesis y Reconocimiento de Voz

Vicente Miguel Ferrer Gilabert Sistemas Multimedia

Ingeniera Tcnica de Telecomunicaciones, Telemtica Escola Tcnica Superior DEnyinyeria Universitat de Valncia

voiceBrowser: Navegador Web para invidentes

Pgina 2

ndice
1 Motivacin: Multimedia discapacitados. como mtodo de ayuda a Pg 3

2 Tecnologas Reconocimiento y Sntesis de Voz: JSAPI y Pg 4 MSAPI. 2.1 JSAPI (JavaSpeech API) 3 El paquete IBM Speech for Java. 4 Declaracin de un motor de voz. 5 Sntesis de voz. 6 Reconocimiento de voz. 6.1 JSGF (JavaSpeech Grammar Format) 6.2 Reconocimiento de voz en Java. 7 Reproduccin de audio: AU, WAV y MP3 8 voiceBrowser: invidentes. 9 Bibliografa. La idea de un Navegador Web Pg 5 Pg 7 Pg 8 Pg 10 Pg 14 Pg 14 Pg 18 Pg 21 para Pg 22 Pg 26

voiceBrowser: Navegador Web para invidentes

Pgina 3

NAVEGADOR WEB PARA INVIDENTES


1.Motivacin: Multimedia como mtodo de ayuda a discapacitados
Paralelamente, en los ltimos aos se han producido una serie de importantes avances tecnolgicos que han cambiado y todava siguen cambiando radicalmente la forma de comunicacin. Uno de estos avances ha sido Internet que ha hecho reescribir la evolucin de las Tecnologas de la Informacin y la Comunicacin. Otro de los avances, cuya expansin es coetnea a la explosin de Internet ha sido la Multimedia. De hecho, casi desde el principio, ambas tecnologas han estado ntimamente relacionadas. Internet es la mayor base de datos que la humanidad ha tenido a su disposicin en la historia. Internet naci y se mantiene hoy como un medio de presentacin y acceso a la informacin pensada para todos; de una manera sencilla se puede acceder a cualquier tipo de informacin, localizada en cualquier parte del planeta y en medios heterogneos, mediante un conjunto de herramientas de sencillo uso. Sin embargo y como ocurre muchas veces, realmente estas tecnologas no estn al alcance de todos. Las barreras arquitectnicas que un discapacitado se puede encontrar en su desplazamiento por el mundo real, tambin existen, incluso de mayor tamao y ms difcilmente salvables, en el mundo de Internet. No podemos permitir que las personas que padecen algn tipo de discapacidad fsica, no tengan la posibilidad de acceder al mayor compendio de informacin que la humanidad ha visto nunca. La tecnologa debe ponerse al alcance de todos y, para salvar las dificultades que esto pueda acarrear, se debe utilizar la propia tecnologa.
Hasta la llegada de 2001: Una odisea del Espacio premiada por su computadora parlante, HAL, el pblico ha estado esperando que los sistemas guiados por voz se convirtieran en realidad. Quin puede olvidar el ordenador de Juegos de Guerra diciendo Quieres jugar a un juego? Casi cuarenta aos de investigacin y grandes cantidades de dinero invertidas nos permiten, hoy en da, poder disponer de sistemas de reconocimiento y sntesis de voz en ordenadores domsticos, as como implementaciones para los lenguajes de programacin ms comunes, que acercan las tecnologas de guiado por voz a sus potenciales usuarios.

En la prctica, no todo el mundo puede navegar por Internet. De hecho, no todo el mundo puede utilizar un ordenador fcilmente. Las personas que padecen algunos tipos de discapacidad fsica tienen verdaderos problemas para el uso de un ordenador en general y de Internet en concreto. Sin embargo, aqu es donde entran en juego las tecnologas multimedia. Como ejemplo, un discapacitado motriz podra tener verdaderos problemas para utilizar un perifrico tan simple y a la vez tan necesario en las actuales interfaces grficas de usuario, como es el ratn. O en el caso que nos ocupa, el uso de un ordenador por personas con discapacidades visuales puede ser realmente difcil. Y en concreto, el acceso a Internet a travs del Web, por ejemplo, puede ser tarea casi imposible para un ciego o discapacitado visual; Sin embargo, aqu es donde la multimedia, entendida en esta ocasin como integracin de medios puede ayudar a paliar esta situacin. Este discapacitado visual puede utilizar tecnologas de sntesis y reconocimiento de voz que le ayuden a conocer qu es lo que hay en cada pgina web y a decidir qu nueva pgina quiere visitar en cada momento, de manera similar a como lo hacemos las personas que no tenemos mermadas nuestras capacidades visuales.

voiceBrowser: Navegador Web para invidentes

Pgina 4

La idea inicial de mi trabajo es precisamente esa, la de la utilizacin de la Multimedia no como una manera de mostrar contenido de forma enriquecida, sino como una forma de utilizar la combinacin de diferentes medios digitales para facilitar a personas con discapacidad visual la navegacin por Internet. Internet ofrece nuevas posibilidades para el acceso a la informacin, pero a veces el diseo de las pginas web obstruye los contenidos y las hacen inaccesibles, especialmente para las personas con discapacidades visuales. El problema tiene varias vertientes. Por un lado, el propio diseo de las pginas web, que las hacen inaccesibles o simplemente reducen su usabilidad al absurdo para personas invidentes. Por el otro, los navegadores usados para navegar por la red estn pensados para usuarios sin discapacidades visuales. Desde su creacin, Internet ha ofrecido una amplia gama de posibilidades para el acceso a la informacin. A travs de este medio, los datos publicados pueden estar disponibles inmediatamente y a un mismo tiempo desde cualquier parte del mundo. Pero algunas veces el diseo de las pginas y aplicaciones web no son accesibles para todo el mundo. Las personas con discapacidad a menudo son incapaces o encuentran verdaderas dificultades cuando intentan recuperar informacin de la red. El diseo de las pginas Web ha ido sustituyendo e incluso eliminando la funcionalidad y capacidad de comunicacin de informacin de las pginas. Se ha sustituido la informacin por esttica, dificultando el acceso a los contenidos, especialmente para aquellas personas cuyas discapacidades fsicas les impide disfrutar con el diseo: los invidentes. voiceBrowser es un proyecto que pretende facilitar la navegacin por Internet de personas con discapacidades visuales. Est programado en Java utilizando el reconocimiento y sntesis de voz que ofrece la librera JSAPI (Java Speech API) utilizando la implementacin proporcionada por IBM en su producto Via Voice. As mismo, para la reproduccin de determinados clips de audio utiliza la librera de Sun JMF (Java Media Framework) y para el parsing HTML utiliza la librera javax.swing.text.html.

2.Tecnologas Reconocimiento y Sntesis de Voz: JSAPI y MSAPI


Hace unos aos y con el aumento de la capacidad de computacin de los ordenadores, surgieron los primeros programas de reconocimiento de voz. Inicialmente la capacidad de reconocimiento de voz de estos programas era bastante reducida, la fiabilidad del sistema no era demasiado alta; sin embargo, hoy en da la fiabilidad es ms que suficiente para muchas aplicaciones. An as y lejos de lo que pudieran pensar los tecngrafos hace unos aos, todava hoy, las aplicaciones y sistemas de reconocimiento de voz no son habituales y mucho menos, estndares, en los programas informticos. Otro de los aspectos que dificultan el despegue de las tecnologas de reconocimiento del habla es la ausencia de una interfaz de programacin (API) estndar, reconocida realmente por toda la industria. El uso de estndares permitira que los motores de voz de distintos fabricantes puedan trabajar con aplicaciones de otras empresas, de modo que los desarrolladores pueden centrarse en lo que debe hacer su aplicacin.

voiceBrowser: Navegador Web para invidentes

Pgina 5

En la actualidad, los modelos de interfaz de reconocimiento de voz ms extendidos son JSAPI (Java Speech API), de Sun Microsytems; SRAPI (Speech Recognition API), de Novell y SAPI (Speech API), de la propia Microsoft. 2.1.JSAPI: Sun Microsystems defini una librera de programacin que proporciona funcionalidad de sntesis y reconocimiento de voz a su lenguaje de programacin Java. Sin embargo, Sun Microsystems no es especialista en aplicaciones de reconocimiento de voz, y tampoco tena la intencin de invertir los recursos necesarios en desarrollar un motor de reconocimiento. As que proporcion tan solo una interfaz, una estructura de clases, interfaces y mtodos y unas reglas de funcionamiento para su API de reconocimiento de voz, dejando las implementaciones reales en manos de terceras empresas. Esta es, precisamente, la idea del JSAPI (pgina web de JSAPI) Podemos destacar dos consecuencias positivas de esta descentralizacin de la especificacin del API y la implementacin de sus mtodos:

Por un lado, cualquier motor de voz que provea los servicios que requiere el Java Speech API podr ser utilizado en cualquier tipo de aplicacin desarrollada en Java. Esto no slo permite desarrollar aplicaciones de escritorio que implementen mtodos de reconocimiento y sntesis de voz, sino que permite que otro tipo de aplicaciones, distribudas o ejecutadas a travs de Internet, por ejemplo, utilicen herramientas de reconocimiento de voz de la misma forma que se hara si la aplicacin se estuviera ejecutando stand alone. Por otro lado, cualquier desarrollador, empresa o comunidad interesada en el desarrollo de un motor de reconocimiento de voz tiene a su disposicin la posibilidad de dotarlo de un funcionamiento estndar, de un interfaz que permitir que su motor de voz se integre con cualquier aplicacin que ya exista o se disee despus que implemente el Java Speech API.

Entendido de esta manera, el JSAPI puede verse como un intento de Sun Microsystems, no slo de dotar a su lenguaje de funcionalidades de reconocimiento de voz sin emplear grandes cantidades de recursos en el desarrollo de un motor de voz, sino que el verdadero xito del JSAPI es su voluntad de estndar, un slo interfaz de programacin que pueda atacar a cualquier motor de voz. Esta es precisamente la intencin subyacente en cualquier desarrollo de software moderno y especialmente, en cualquier desarrollo Java: la reutilizacin de cdigo y esfuerzos. El Java Speech API es un conjunto de clases abstractas e interfaces que representan un motor de voz para un programador Java, pero que no asume la implementacin de las tareas de reconocimiento y sntesis. De esta manera, el motor puede estar implementado como una solucin hardware o software (o incluso, una combinacin de ambos) Incluso se puede dar la situacin de que diferentes implementaciones de motores pueden tener diferentes caractersticas; de hecho, algunos pueden tener la capacidad de aprender acerca de los patrones del habla de un usuario y otros, pueden elegir no implementar esta funcionalidad.

voiceBrowser: Navegador Web para invidentes

Pgina 6

Java Speech API Motor de voz de terceros (software, hardware o ambos)

Figura 1. La estructura de Java Speech

Tarjeta sonido, altavoces y micrfono del sistema Sun Microsystems facilita las implementaciones vlidas de terceras partes de su Java Speech API en la pgina web del proyecto, en http://java.sun.com/products/javamedia/speech

FreeTTS: Este es un sintetizador de voz de cdigo abierto escrito completamente en Java. IBM Speech for Java: Esta es una implementacin de IBM basada en su motor de reconocimiento del habla Via Voice. Se debe adquirir una copia del software Via Voice para poder utilizarlo. The Cloud Garden: Esta implementacin puede funcionar con cualquier motor de voz basado en el Microsoft Speech API. Lernout and Hauspies TTS for Java Speech API: Este paquete funciona solamente en mquinas Sun y proporcina un gran nmero de caractersticas avanzadas. Festival: Producto escocs basado en Unix. Soporta un gran nmero de interfaces adems de la interfaz basada en Java.

Mediante estas herramientas, la programacin de aplicaciones de reconocimiento de voz, se facilita enormemente. Las tareas ms complejas del reconocimiento y la sntesis de voz desde el punto de vista de la ingeniera, son las transformaciones de la seal analgica recogida por un micrfono en palabras del lenguaje; o bien al revs, la transformacin de texto escrito en voz sintetizada. Con JSAPI desaparece toda la dificultad subyacente al motor de reconocimiento, pues la especificacin de la Interfaz de programacin y del motor de reconocimiento en s, son cosas diferentes. Mediante esta implementacin, el API de JavaSpeech es tan solo una capa que descansa sobre el procesado de voz que provee una tercera empresa, en este caso, IBM gracias a su producto ViaVoice. Mediante una capa de adaptacin, Via Voice ofrece sus servicios de voz a JavaSpeech API. Por ltimo, ser IBM ViaVoice quien se encargar de comunicarse con la tarjeta de sonido a travs de los controladores instalados en el sistema. Ser el propio IBM ViaVoice quien recoger la entrada de audio del micrfono y enviar la salida a los altavoces a travs de la tarjeta de sonido.

voiceBrowser: Navegador Web para invidentes

Pgina 7

Java Speech API IBM Speech for Java IBM ViaVoice Tarjeta sonido, altavoces y micrfono del sistema Figura 2. La estructura de IBM Speech for Java

3.El paquete IBM Speech for Java.


Para comenzar, necesitamos un Motor de Voz que provea funciones de Sntesis y de Reconocimiento. Existen productos basados en Software Libre que proveen implementaciones de las funciones de sntesis de voz del JavaSpeech API, pero ninguno de los examinados en el momento de escribir este documento, provee de funciones de reconocimiento de voz. As pues, no nos queda ms remedio que utilizar el IBM ViaVoice for Java como motor de voz. Ntese que la estructura de bloques del JSAPI de Sun, permite sustituir fcilmente el motor de voz por otro diferente, con lo cual, si en algn momento surgiera alguna implementacin libre de funcionalidad completa, podra sustituirse sin dificultad. As pues, los pasos a seguir para dotar de acceso al motor de voz de IBM por parte del JSAPI, son los siguientes: 1. Instalar ViaVoice de acuerdo con las instrucciones que incluye este producto. 2. Descargar e instalar el paquete IBM Speech for Java. Se puede descargar de manera gratuta desde la web http://alphaworks.ibm.com/tech/speech.Este paquete incluye bsicamente, tres directorios: El directorio hello contiene un ejemplo de uso de ibmjs IBM Speech for Java. El directorio ref como su nombre indica es un directorio de referencia y hello contiene la documentacin del paquete (includo el API en formato JavaDoc. lib

ref

api jsgf jsml

Por ltimo, el directorio que realmente nos interesa es lib. Este directorio contiene las libreras y el jar de la implementacin de IBM Speech for Java. Deberemos aadir este directorio a la variable PATH del sistema y el fichero ibmjs.jar a la variable CLASSPATH.

Echemos un vistazo ahora al propio API de JavaSpeech para familiarizarnos con su estructura. El JSAPI est compuesto, fundamentalmente, de tres paquetes diferentes:

voiceBrowser: Navegador Web para invidentes

Pgina 8

javax.speech: Interfaces y clases abstractas utilizadas fundamentalmente para declarar y crear un motor de voz, as como para controlar eventos asociados con la entrada y salida de audio, control del volumen de captura o reproduccin, etc. javax.speech.recognition: Como su nombre indica, provee las clases e interfaces para declarar un motor de reconocimiento de voz y trabajar con l. javax.speech.synthesis: Tambin en este caso, provee de clases e interfaces para declarar un motor de sntesis de voz y operar con l.

4.Declaracin de un motor de voz.


La declaracin de un motor de voz depender de la accin que queramos realizar: sntesis o reconocimiento de voz. En ambos casos se debe utilizar la clase Central del paquete javax.speech y que provee, mediante el patrn Factora, sendos mtodos que devuelven bien un objeto de tipo Recognizer, bien un objeto de tipo Synthesizer:
static Recognizer createRecognizer(EngineModeDesc require) static Synthesizer createSynthesizer(EngineModeDesc require)

En ambos casos, una invocacin del tipo:


RecognizerModeDesc require = new RecognizerModeDesc(new Locale(es)); Recognizer rec = Central.createRecognizer(EngineModeDesc require); rec.allocate(); rec.resume(); SynthesizerModeDesc require = new SynthesizerModeDesc(new Locale(es)); Synthesizer synth = Central.createSynthesizer(EngineModeDesc require); synth.allocate(); synth.resume();

Devuelve un objeto de reconocimiento y de sntesis de voz, respectivamente. Tanto


Recognizer como Synthesizer son interfaces, que se asocian con el objeto que devuelve Central.createRecongnizer y Central.createSynthesizer. Ambos mtodos static reciben un parmetro de tipo EngineModeDesc, una interface que representa las caractersticas

generales del motor de voz. Si queremos modificar alguna caracterstica concreta del funcionamiento de un motor de reconocimiento o de un motor de sntesis de voz, existen sendas clases que extiende a EngineModeDesc y que implementan caractersticas concretas de sntesis/reconocimiento y que son SynthesizerModeDesc y RecognizerModeDesc. De hecho, podemos modificar algunas caractersticas interesantes del reconocimiento o sntesis de voz mediante estos objetos XXXModeDesc. Por ejemplo:
public void addVoice(Voice v); Voice(String name, int gender, int age, String style);

Se puede utilizar para declarar un motor de Sntesis de Voz que imite a una persona de determinado sexo y edad, por ejemplo:
require.addVoice(new Voice(null, Voice.GENDER_MALE, Voice.AGE_YOUNGER_ADULT, null));

voiceBrowser: Navegador Web para invidentes

Pgina 9

El IBM Speech for Java proporciona implementaciones diferentes para sexo masculino y femeino (valores Voice.GENDER_MALE y Voice.GENDER_FEMALE) as como para un nio (Voice.AGE_CHILD), un adulto (Voice.AGE_YOUNGER_ADULT) o un anciano (Voice.AGE_OLDER_ADULT) Estas clases tambin determinan la lengua en que trabajar el sintetizador o reconocedor de voz. Esto se hace, por ejemplo, mediante un constructor de SynthesizerModeDesc o RecognizerModeDesc que recibe un objeto de tipo Locale. Si en el momento de la obtencin de un objeto reconocedor o sintetizador de voz, no se especifica la lengua de trabajo, Java tratar de generar un Recongnizer o Synthesizer en la lengua por defecto del sistema, que es el objeto de tipo Locale que devuelve la llamada a la funcin java.util.Locale.getDefault(). Por cuestiones de diseo del JavaSpeech API los objetos de tipo Recongnizer o Synthesizer no estn inicialmente listos para funcionar, sino que se deben reservar recursos y posteriormente activar para poder funcionar. Los motores no son activados por defecto, por dos motivos: el primer motivo es que la creacin de un motor es una tarea de alto coste computacional; para mejorar el rendimiento, el API de JavaSpeech permite activar el motor en un hilo diferente mientras el programa principal realiza otras tareas. El segundo motivo es que el motor necesita acceso exclusivo a algunos dispositivos, como el micrfono (para tareas de reconocimiento); este diseo del API permite declarar el motor y activarlo o desactivarlo en tiempo de ejecucion cuando, por ejemplo, se requiriera el acceso a algn dispositivo que utiliza el motor. Las operaciones de activacin y desactivacin pueden realizarse, sobre un objeto de tipo Engine, mediante los mtodos:
public void allocate() throws EngineException, EngineStateError public void deallocate() throws EngineException, EngineStateError

Reserva los recursos necesarios para el motor de reconocimiento o sntesis de voz. Desreserva los recursos utilizados por el motor de reconocimiento o sntesis de voz.

DEALLOCATED DEALLOCATING RESOURCES ALLOCATED ALLOCATING RESOURCES

RESUMED

PAUSED
Figura 3. Posibles estados de un motor de voz

voiceBrowser: Navegador Web para invidentes

Pgina 10

Para terminar con este apartado, otras funciones interesantes que se han de conocer para trabajar con motores de voz estn relacionadas con el concepto de estado del motor. Durante el ciclo de ejecucin de un motor de voz, ste puede encontrarse en diferentes estados: activado, desactivado, pausado, funcionando, activando recursos o desactivando recursos. Estos diferentes estados estn declarados en la interface javax.speech.Engine. Los estados descritos hasta el momento son comunes a los motores de reconocimiento y de sntesis. Adems de estos estados, existen determinados sub-estados propios de cada motor de reconocimiento; por ejemplo, un motor de sntesis que est en estado ALLOCATED, puede estar a su vez en uno de los siguientes estados: QUEUE_EMPTY o QUEUE_NOT_EMPTY, indicando si todava le queda audio en la cola de reproduccin o no. Un motor de reconocimiento de voz que se encuentra en estado ALLOCATED puede a su vez estar en uno de los tres sub-estados: LISTENING, PROCESSING o SUSPENDED, indicando que el motor est esperando, procesando o suspendido. La interface javax.speech.Engine, permite precisamente reservar recursos y desreservar recursos, pausar o activar un motor, as como acceder y modificar las caractersticas del motor mediante una referencia a EngineProperties o del dispositivo de audio mediante la obtencin de una referencia a la clase AudioManager. Tanto los objetos Recongnizer como Sinthesizer extienden la interface Engine y, por tanto, proporcionan una implementacin para todos los mtodos que permiten allocalte y deallocate o pausar y resume un motor de voz, adems de implementar los mtodos correspondientes a los estados especficos para un motor de reconocimiento o para un motor de sntesis de voz. El correcto manejo del estado del motor en nuestra aplicacin es muy importante. As, por ejemplo, si tenemos un motor de sntesis de voz que est sintetizando un determinado texto en un instante de tiempo determinado, deberamos esperar a que esta operacin terminara para pedirle que sintetizara un nuevo texto. Para ello, tendramos que manejar el estado del motor:
synth.waitEngineState(Engine.ALLOCATED && Synthesizer.QUEUE_EMPTY);

5.Sntesis de voz.
Ahora que ya estamos familiarizados con el motor de voz, podemos pasar a abordar la parte de reconocimiento de voz. Veremos cmo implementar funciones bsicas de sntesis de voz, y tambin alguna caracterstica ms avanzada como los mecanismos para modificar la pronunciacin de determinadas frases mediante el JSML (Java Speech Markup Language) que tambin proporciona el API de JavaSpeech. Veamos un ejemplo extrado directamente del cdigo fuente del programa voiceBrowser. El mtodo public static void sintesis(String texto) sintetiza en castellano el texto pasado como parmetro.

voiceBrowser: Navegador Web para invidentes

Pgina 11

public static void sintesis(String texto) { try { //Crear un objeto SynthesizerModeDesc en espaol con //determinadas caractersticas de voz SynthesizerModeDesc modeDesc = new SynthesizerModeDesc(); modeDesc.addVoice(new Voice(null, Voice.GENDER_MALE, Voice.AGE_YOUNGER_ADULT, null)); modeDesc.setLocale(new Locale("es")); //Obtener mediante patrn Factora, una referencia a un //motor de sntesis de voz Synthesizer synth = Central.createSynthesizer(modeDesc); //Reservar los recursos necesarios para el motor y activarlo synth.allocate(); synth.resume(); //Sintetizar el texto en modo Texto Plano (sin considerar //tags de JSML) synth.speakPlainText(texto, null); //Esperar hasta que la sntesis ha terminado synth.waitEngineState(Synthesizer.QUEUE_EMPTY); //Desreservar los recursos empleados por el motor synth.deallocate(); } catch (IllegalArgumentException illegalArgument) { illegalArgument.printStackTrace(); } catch (EngineException engineException) { engineException.printStackTrace(); } catch (EngineStateError stateError) { stateError.printStackTrace(); } catch (AudioException audioException) { audioException.printStackTrace(); }

El cdigo presenta dos partes: una primera parte en la que se declara el motor de sntesis de voz, en espaol, con voz masculina, de adulto joven; en la segunda parte se produce la sntesis en s del texto, mediante el comando:
synth.speakPlainText(texto, null);

Cuya declaracin sera:


public void speakPlainText(String text, SpeakableListener listener) throws EngineStateError

De una manera sencilla se cubren gran parte de las necesidades de sntesis que se pueden tener en una aplicacin. Sin embargo, cuando empezamos a hacer uso de las funciones de sntesis de voz del JSAPI, descubrimos que se requieren ciertas funcionalidades extras que aumenten el control sobre la forma en que se sintetiza la voz. Utilizando los mtodos anteriormente descritos, parece que cualquier texto es sintetizado de misma forma; sin embargo, en el habla real no es as. Cuando hablamos, utilizamos diferentes entonaciones para dar mayor nfasis o valor a una palabra o frase concretas; cuando escribimos, utilizamos abreviaturas o siglas, que no siempre deben ser

voiceBrowser: Navegador Web para invidentes

Pgina 12

deletreadas cuando sean ledas; utilizamos fechas, cantidades numricas, ... Para cubrir estas necesidades, el API de JavaSpeech presenta un sub-API que define un lenguaje de marcas para manipular el modo en que los textos sern sintetizados por el motor de voz. 5.1.JSML (Java Speech Markup Language): El JSML permite definir la forma en que el texto ser sintetizado. Su sintaxis se basa en el estndar SGML que es el estndar general para los lenguajes de marcas. De hecho, JSML es un subconjunto de XML. Por tanto, su sintaxis se parece mucho a la del propio HTML y es fcil de aprender y utilizar. Figura 4. Diagrama de bloques de una aplicacin de reconocimiento de voz

Los lenguajes de especificacin del habla no son una idea nueva. Existieron otros intentos similares antes de JSML y de hecho, ste est en parte basado en lenguajes anteriores. Por ejemplo, los laboratorios Bell junto con la Universidad de Edimburgo desarrollaron juntos un lenguaje de especificacin de sntesis llamado STML, que sirvi de base para gran parte de la especificacin del JSML. Sin embargo, JSML no ha conseguido ser aceptado como estndar en el sector. Por ello, Sun ha anunciado el desarrollo de un nuevo estndar de especificacin de sntesis llamado, en clave, SABLE, cuyos datos tcnicos no han sido publicados todava. SABLE combinar caractersticas del JSML de Sun y del STML de los laboratorios Bell y pretende ser el estndar en el futuro. Cualquier documento JSML debe seguir una sintaxis predeterminada. La cabecera que debe utilizar cualquier documento JSML est directamente heredada de XML. As mismo, el documento est enmarcado entre dos tags <JSML> y </JSML>
<?XML version="1.0" encoding="UTF-8"?> <JSML>

y terminara con:

</JSML>

Un documento JSML debe ser un documento XML bien formado, lo cual significa que, adems de poder editarlo con cualquier programa de escritura XML, podemos tambin comprobar su integridad con las mismas herramientas utilizadas en XML. Los elementos JSML estn divididos en tres grupos: Elementos estructurales: Sirven para especificar prrafos y sentencias. Elementos de Produccin: Especifican propiedades prosdicas, pausas, nfasis y otra informacin concerniente a la pronunciacin de palabras o porciones de palabras. Elementos variados: Incluyen marcadores especiales que pueden ser usados para proporcionar instrucciones nativas al propio motor de voz.

voiceBrowser: Navegador Web para invidentes

Pgina 13

Tipo de elemento

Nombre del elemento PARA

Descripcin Especifica que el texto contenido es un prrafo. Especifica que el texto contenido es una sentencia.

Estructural

SENT

<PARA> <SENT>Ana fue a escuela y aprob los exmenes.</SENT> <SENT>Cuando volvi a casa, luca el Sol.</SENT> </PARA>

Especifica cmo se debe pronunciar determinado texto. SAYAS


<SAYAS SUB="I E cubo">IEEE</SAYAS> <SAYAS CLASS="date">Enero 1952</SAYAS> <!--pronunciado Enero de mil novecientos cincuenta y dos --> <SAYAS CLASS="literal">JSML</SAYAS> <!-pronunciado como J S M L -->

EMP Produccin BREAK

Especifica que hay que aplicar cierto tipo de nfasis al texto contenido.
Llvate <EMP LEVEL="moderate">tu</EMP> coche.

Especifica cierto tipo de pausa en la sntesis.


<BREAK SIZE="small" MARK="145"/> <BREAK MSECS="300"/>

Especifica una propiedad de pronunciacin, como la velocidad del habla, el tono o el volumen del texto PROS
<PROS RATE="-30%"><SAYAS SUB="sun punto com">sun.com</SAYAS></PROS> <!-pronunciado como sun punto com un 30% ms despacio --> <PROS RATE="150">Texto a 150 palabras por minuto</PROS>

MARKER Varios ENGINE

Proporciona una notificacin a la lnea de ejecucin de la aplicacin Java cuando el motor de sntesis alcanza la posicin en que se encuentra el tag.
Pregunta <MARKER MARK="yes_no_prompt"/> s o no

Para proporcionar instrucciones nativas al motor de sntesis utilizado.


Me convierto <ENGINE ENGID="Acme Voice"> en otro </ENGINE> y vuelvo a ser yo <!- Texto pronunciado por otra voz -->

voiceBrowser: Navegador Web para invidentes

Pgina 14

6.Reconocimiento de voz.
La otra parte importante del JavaSpeech API es el reconocimiento de voz. Sin embargo, el estado en relacin al reconocimiento de voz no est siquiera, cercano al avanzado estado de la sntesis de voz. El motivo de esto es muy simple, el reconocimiento de voz es una tarea mucho ms compleja. La tarea de reconocimiento de voz, a grandes rasgos, consiste en que el ordenador captura la voz a travs del micrfono convirtindola despus en informacin digital. El motor de reconocimiento debe reconocer las slabas de entre el conjunto de fonemas que ha recibido. Estas slabas deben ser entonces combinadas para formar las palabras que inicialmente se haba pronunciado. Estas operaciones a priori bastante complejas en s mismas, todava aumentan su complejidad cuando consideramos caractersticas ms concretas del habla humana, como las diferentes voces, la pronunciacin, las diferencias dialectales dentro de una misma lengua: Diferentes personas tienen diferentes tonos de voz, hablan a diferentes velocidades, utilizan diferentes entonaciones, ... De hecho, podramos diferenciar de una manera genrica, dos tipos de dificultades tcnicas en relacin al reconocimiento de voz:

Problemas relacionados con las diferentes caractersticas de la voz de cada persona: Como ya hemos dicho, diferentes personas tienen diferentes tonos de voz, diferente pronunciacin, existen diferencias dialectales dentro de una misma lengua, ... Problemas relacionados con la complejidad de las estructuras del lenguaje: El reconocimiento de voz supone la identificacin de palabras. Pero el lenguaje es mucho ms complejo que la simple utilizacin de palabras una despus de otra; el lenguaje tiene estructuras cuya identificacin en ocasiones, es incluso esencial para entender el sentido completo de la frase. As pues, los motores de reconocimiento actuales deben incorporar mtodos para reconocer gramticas y, por supuesto, el JavaSpeech API no slo las soporta, sino que son un elemento imprescindible.

6.1.JSGF (JavaSpeech Grammar Format):Un sistema de declaracin de gramticas simplifica la tarea del motor de reconocimiento limitando el nmero de posibles palabras y frases que se deben considerar cuando se intenta determinar qu ha dicho el usuario. Las gramticas tambin facilitan la tarea del programador de aplicaciones de voz, reduciendo y agrupando los posibles casos que se deben tener en cuenta. Existen dos tipos de gramticas:

Gramticas basadas en reglas: Estn compuestas de tokens y reglas. Cuando un usuario habla, la entrada es comparada con las reglas y los tokens de la gramtica con el fin de identificar los patrones esperados. La aplicacin de reconocimiento de voz debe proporcionar una gramtica basada en reglas al motor, normalmente durante la inicializacin de este. Gramticas de dictado: Estas gramticas definen miles de palabras que el usuario puede decir de una manera libre. Se tratara de gramticas integradas

voiceBrowser: Navegador Web para invidentes

Pgina 15

en el propio motor de reconocimiento que identifican el habla sin las restricciones que imponen las gramticas basadas en reglas. Sin embargo, este tipo de mtodos es ms complejo desde un punto de vista tcnico, con lo que son motores ms lentos y cometen muchos errores. La especificacin de JSGF soporta reconocimiento de voz mediante gramticas basadas en reglas, no soportando las gramticas de dictado por estar en un estado de desarrollo mucho ms temprano e inmaduro. Sin embargo, JSGF soporta gramticas dinmicas. Esto significa que las gramticas que utiliza una aplicacin que hace uso de JSAPI pueden ser modificadas en tiempo de ejecucin, segn las necesidades de la aplicacin. Esto permite aumentar la flexibilidad del sistema, as como optimizar las aplicaciones que requieren reconocimiento de voz, adaptando las capacidades de reconocimiento gramatical a cada contexto. Vamos a analizar la sintaxis del Java Speech Grammar Format ms detenidamente: 1. Cabecera de la gramtica: Si definimos un fichero de gramticas externo a nuestra aplicacin donde declaramos las diferentes construcciones gramaticales aceptadas por el programa, este fichero debe tener un nombre identificativo nico, declarado en su cabecera siguiente la sintaxis:
#JSGF V1.0 grammar packageName.simpleGrammarName; ISO8859-9 es;

El nombre de los paquetes de gramticas es equivalente al nombre de los paquetes en Java; por tanto un nombre completo para una gramtica ser una lista de identificadores de paquete separados por puntos. Utilizar estos convencionalismos puede reducir el nmero de conflictos entre paquetes. Dentro de una gramtica podemos importar el contenido de otra u otras gramticas. La declaracin de una importacin agrega una o todas las reglas pblicas de gramtica a nuestra gramtica local:
//Aade todas las reglas pblicas import <fullyQualifiedGrammar.*>; /Aade la regla nameRule del paquete fullyQualifiedGrammar import <fullyQualifiedGrammar.nameRule>;

2. Cuerpo de la gramtica: En el cuerpo de la gramtica es donde se declaran las reglas del motor de reconocimiento. Una regla gramatical debe presentar la siguiente sintaxis:
[public] <ruleName> = ruleExpansion ;

Una regla se puede declarar con o sin el modificador public . Una regla que no sea declarada explcitamente como public ser implcitamente privada. En esencia este modificador afectar a la importacin de reglas en otros ficheros de gramticas. Las reglas declaradas como public pueden ser importadas, las reglas privadas no podrn ser importadas, slo podrn ser accedidas localmente.

voiceBrowser: Navegador Web para invidentes

Pgina 16

El nombre de una regla gramatical debe ser nico en un mismo mbito. Si una regla importada y una regla local tienen el mismo nombre, se podran diferenciar (como en Java) utilizando el nombre totalmente cualificado de la regla.

3. Cuerpo de una regla gramatical: En el campo ruleExpansion del patrn sintctico anterior es donde se encuentra la verdadera potencia del JSGF. En l se puede declarar la estructura gramatical que debe tener una locucin para que JavaSpeech considere que casa con esta regla gramatical. Una expresin gramatical puede estar formada por: - una palabra - varias palabras relacionadas entre s mediante operadores - una referencia a otra regla gramatical.

Secuencias: Una regla puede ser definida como una secuencia de expresiones vlidas. Una secuencia de expresiones vlidas, separadas entre s mediante espacios en blanco es, as mismo, una expresin vlida. Debido a que tanto palabras como referencias a otras reglas son expresiones gramaticales vlidas, las siguientes definiciones de reglas son tambin vlidas:
<donde> = Vivo en Madrid; <frase> = este <object> es <OK>;

Para poder reconocer una secuencia, cada elemento debe ser pronunciado en el orden definido y obedeciendo a las condiciones impuestas en cada regla gramatical. As, para reconocer la regla <donde> el usuario debe decir las palabras Vivo en Madrid en el orden exacto. El segundo ejemplo mezcla palabras con referencias a otras reglas; para reconocer la regla <frase> el usuario debe pronunciar este seguido de una expresin que case con la regla <object>, entonces es y finalmente algo que case con <OK> Una secuencia vaca no es legal. Sin embargo, existe la Secuencia vaca.
<d> = ; // no legal <e> = <VOID>; // legal

Alternativas: Una regla puede ser definida como un conjunto de expresiones alternativas separadas por una barra vertical '|' y opcionalmente por espacios en blanco. Por ejemplo:
<objeto> = lpiz | avin | monitor | <otherObjects>;

Para que el motor reconozca la regla <objeto> el usuario debe decir una y slo una de las palabras separadas mediante la barra vertical, o bien, alguna expresin que case con la regla <otherObjects> Una alternativa vaca no es legal.
<name> = Michael | | Mary; // not legal

Agrupaciones:

voiceBrowser: Navegador Web para invidentes

Pgina 17

Parntesis: Cualquier expresin legal puede ser explcitamente agrupada utilizando parntesis '()'. Una agrupacin mediante parntesis supone considerar de manera atmica aqullo que est contenido entre los parntesis de apertura y cierre. Veamos un ejemplo:
<accion> = por favor (abre | cierra | borra);

Para que el motor reconozca la regla <accion> el usuario debe pronunciar las palabras por favor seguidas de una de entre las alternativas entre parntesis, es decir, o bien abre o cierra o borra, pero no dos de ellas, por ejemplo. Un ejemplo ms elaborado:

Esta regla admitira frases diferentes como abre la ventana ahora, cierra la puerta despus. Un parntesis sin contenido no est permitido
( ) // no legal

<comando> = (abre | cierra) la (ventana |puerta) (ahora | despus);

Corchetes: Cualquier expresin legal puede ser explcitamente agrupada mediante corchetes '[]'. Una expresin situada entre corchetes puede, opcionalmente, ser pronunciada o no por el usuario. Por ejemplo:
<halago> = amigo mo | oh mi gran amigo | compaero del alma; public <comando> = [ <halago> ] ven a recogerme;

Permite al usuario decir ven a recogerme y opcionalmente frases como compaero del alma ven a recogerme o bien amigo mo ven a recogerme Unos corchetes sin contenido no est permitido:
[ ] // no legal

Asterisco *: Una expresin legal seguida de un smbolo asterisco, significa que la expresin puede ser pronunciada cero o ms veces. Veamos un ejemplo:
<numtelf> = cinco* dos tres ocho seis;

El motor admitira como vlido tanto dos tres ocho seis como cinco cinco cinco dos tres ocho seis.
<halago> = amigo mo | oh mi gran amigo | compaero del alma; public <comando> = <halago>* ven a recogerme;

En este caso, la regla <comando> casara con frases diferentes como: ven a recogerme, amigo mo compaero del alma ven a recogerme o compaero del alma oh mi gran amigo ven a recogerme.

Operador Suma +: Una expresin legal seguida de un smbolo asterisco significa que la expresin puede ser pronunciada una o ms veces (pero al menos una vez). Veamos un ejemplo:
<comando> = (por favor)+ no me digas eso;

voiceBrowser: Navegador Web para invidentes

Pgina 18

El motor admitira frases como por favor no me digas eso o por favor por favor no me digas eso.

Tags: Los tags son un mecanismo para aadir informacin especfica de cara a la aplicacin a partes concretas de la definicin de la regla. Las aplicaciones tpicamente utilizan los tags para simplificar o mejorar el proceso de reconocimiento. Los tag son texto encerrado entre llaves de conjunto '{}' Los tags no afectan al reconocimiento de una gramtica. Los tags solamente son adjuntados al objeto devuelto por el reconocedor de voz a la aplicacin. De esta manera, el programador puede saber que el texto pronunciado por el usuario, casa con una determinada parte de la regla gramatical o bien con otra. Veamos un ejemplo:
<comando>= por favor (abre {OPEN} | cierra {CLOSE}) la ventana;

Mediante el uso de tags podremos saber, a nivel de cdigo Java y en tiempo de ejecucin, si el usuario ha dicho por favor abre la ventana o bien por favor cierra la ventana, ambas expresiones vlidas de la regla gramatical anterior pero que no seran diferenciables de otro modo. 6.2.Reconocimiento de voz en Java Ahora que ya conocemos el JSGF podemos ver ejemplos concretos de cdigo Java que permite el reconocimiento de voz basado en reglas. Para ello, vamos a utilizar cdigo que forma parte del Proyecto desarrollado como ejemplo para la asignatura, el voiceBrowser. Empecemos definiendo previamente una gramtica vlida, utilizando algunos de los elementos vistos anteriormente:
#JSGF V1.0 ISO8859-9 es; grammar voiceBrowser.linksGrammar; public <empezar> = empezar {empezar}; public <detener> = detener {detener}; public <continuar> = continuar {continuar}; public <releer> = releer {releer}; public <leer_opciones> = leer texto {leer_texto} | leer enlaces {leer_enlaces} | leer todo {leer_todo};

Ahora vamos a programar la parte de la aplicacin Java que permitir reconocer las reglas gramaticales definidas en voiceBrowser.linksGrammar. Para ello debemos realizar dos operaciones claramente diferenciadas en el API de JavaSpeech: 1. Declaracin e inicializacin del motor de reconocimiento de voz. Lo haremos en el mtodo main de la aplicacin, dado que nuestro ejemplo es muy simple (para aplicaciones ms complejas se suele definir un mtodo que realice esta tarea). En la parte de inicializacin del motor de reconocimiento tambin: - Cargaremos de forma esttica la gramtica que vamos a utilizar. - Agregaremos un ResultListener, que deber ser un objeto que extienda la clase ResultAdapter.

voiceBrowser: Navegador Web para invidentes

Pgina 19

public class RecognizerMultimedia extends ResultAdapter { private static Recognizer recognizer; public static void main(String[] args) { try { recognizer.allocate(); FileReader grammar = new FileReader("grammar.txt"); RuleGrammar ruleGrammar = recognizer.loadJSGF(grammar); ruleGrammar.setEnabled(true); recognizer.addResultListener(new RecognizerMultimedia()); System.out.println("[Motor de Reconocimiento] Listo"); recognizer.commitChanges(); recognizer.requestFocus(); recognizer.resume(); } catch (EngineException engineException) { engineException.printStackTrace(); } catch (EngineStateError stateError) { stateError.printStackTrace(); } catch (AudioException audioException) { audioException.printStackTrace(); } catch (GrammarException grammarException) { grammarException.printStackTrace(); } catch (FileNotFoundException fileNotFoundException) { fileNotFoundException.printStackTrace(); } catch (IOException ioException) { ioException.printStackTrace(); }

2. La segunda tarea ser la definicin de un mtodo que sea llamado cada vez que el motor reconozca una regla de nuestra gramtica. Para ello, nuestra clase debe extender la clase ResultAdapter, de manera que cada vez que el motor reconozca una regla gramatical, llamar al mtodo public void resultAccepted(ResultEvent e), que forma parte de la clase ResultAdapter y en cuya reimplementacin deberemos interpretar cul ha sido la regla gramatical que ha pronunciado el usuario. La creacin del objeto Recognizer es similar a la creacin de un objeto Synthesizer. Utilizamos la clase Central para obtener un objeto del tipo esperado, pasndole al mtodo createRecognizer un objeto de tipo Local que especifica la lengua del objeto de reconocimiento de voz:
recognizer = Central.createRecognizer(new EngineModeDesc(new Locale("es")));

Una vez hemos hecho esto, cargamos la gramtica que vamos a utilizar. La gramtica debe estar definida en el fichero que pasamos como parmetro al mtodo loadJSGF(Reader r) del objeto Recognizer. Esta gramtica debe ser activada despus
FileReader grammar = new FileReader("grammar.txt"); RuleGrammar ruleGrammar = recognizer.loadJSGF(grammar); ruleGrammar.setEnabled(true);

voiceBrowser: Navegador Web para invidentes

Pgina 20

Despus, completamos la inicializacin del objeto de reconocimiento de voz activando los cambios, proporcionando el foco al objeto Recognizer y ponindolo en estado RESUMED:
recognizer.commitChanges(); recognizer.requestFocus(); recognizer.resume();

Adems, para poder tratar los eventos de reconocimiento de voz del objeto Recognizer, le debemos aadir un ResultListener, y en la implementacin del mtodo resultAccepted(ResultEvent re) interpretaremos los textos reconocidos por el motor.
recognizer.addResultListener(new RecognizerMultimedia());

public class RecognizerMultimedia extends ResultAdapter { private static Recognizer recognizer; public void resultAccepted(ResultEvent re) { try { StringBuffer strBufferTokens = new StringBuffer(); StringBuffer strBufferTags = new StringBuffer(); Result result = (Result)(re.getSource()); ResultToken tokens[] = result.getBestTokens(); if (tokens != null) { for (int i = 0; i <= tokens.length; i++) strBufferTokens.append( tokens[i].getSpokenText() + " "); } System.out.println("Tokens: " + strBufferTokens.toString()); String tags[] = ((FinalRuleResult)(re.getSource())).getTags(); if (tags != null) { for (int i = 0; i <= tags.length; i++) strBufferTags.append(tags[i] + " "); } System.out.println("Tags: " + strBufferTokens.toString()); } catch (Exception e) { e.printStackTrace(); }

Cuando un patrn de habla es reconocido como parte de la gramtica, se lanza un evento de tipo result y el mtodo public void resultAccepted(ResultEvent re) del objeto que se ha aadido como oyente de este tipo de eventos es llamado. El objeto ResultEvent contiene toda la informacin que se necesita para saber qu frase de la gramtica ha sido pronunciada por el usuario. Podemos obtener, tanto el nombre de las reglas gramaticales, como los Tags (si los hubiera) de esas reglas.

voiceBrowser: Navegador Web para invidentes

Pgina 21

Nombre de las reglas:


Result result = (Result)(re.getSource()); ResultToken tokens[] = result.getBestTokens();

Tags:
String tags[] = ((FinalRuleResult)(re.getSource())).getTags();

7.Reproduccin de audio: AU, WAV y MP3


Java es un lenguaje tremendamente completo, cuya mayor virtud de cara al programador es la facilidad con que se pueden aadir nuevas funcionalidades al API bsica que trae el JDK, con tan solo aadir al CLASSPATH el fichero jar que incorpora la implementacin del API en cuestin. Con la creacin de Java, Sun Microsystems cre tambin un formato de audio propio que utilizaran las aplicaciones programadas en su lenguaje. El origen de Java estuvo totalmente influenciado por su cometido principal: servir como lenguaje para Internet. Tambin bajo esta premisa se desarroll su formato de audio propio, el formato AU; es un formato, pues, de baja calidad pero muy alta tasa de compresin, idneo para Internet, pero muchas veces inadecuado para otro tipo de aplicaciones. Dada esta limitacin del formato AU, cuando ms tarde se descubri la potencia de Java, no slo en aplicaciones orientadas a Web, sino tambin en aplicaciones de escritorio, se desarroll un nuevo proyecto que ampliara las caractersticas Multimedia del lenguaje. El resultado es el JMF (Java Media Frame), un paquete que provee caractersticas multimedia avanzadas tanto en audio como en vdeo, con soporte para reproduccin de audio y vdeo en diferentes formatos, soporte para el control de dispositivos de adquisicin de datos multimedia como cmaras de vdeo o tarjetas de sonido, soporte para formatos multimedia en tiempo real como RTP y RTCP, etc. Un paquete realmente completo, de hecho es uno de los ms potentes de toda la familia de paquetes del J2SE. En un trabajo como este, donde se profundiza en una de las tecnologas multimedia de Java relacionadas con el audio que NO est incluida en el JMF, he querido acercarme de una manera muy somera a las tecnologas de Audio incluidas en el paquete JMF. Ni siquiera vamos a explicar la filosofa de funcionamiento del Java Media Frame, bastante compleja en s misma y que nos llevara varias pginas de explicacin, tan slo vamos a ver con qu facilidad podemos reproducir audio en formato AU, WAV o MP3 en una aplicacin Java. Para un conocimiento ms extenso de las tecnologas del Java Media Frame, me remito a su propia documentacin en la pgina web del paquete http://java.sun.com/products/java-media/jmf/2.1.1/download.html

voiceBrowser: Navegador Web para invidentes

Pgina 22

//Para URL import java.net.*; //Import de la JMF import javax.media.*; public class Audio { public static void main(String args[]) { playerJMF("file:///C:/sound.wav"); playerJMF("file:///C:/sound.au"); playerJMF("file:///C:/sound.mp3"); } private static void playerJMF(String pathJMF) { Player player = null; try { System.out.println("Comienza reproduccin"); URL url = new URL(pathJMF); player = Manager.createPlayer(url); player.start(); System.out.println("Reproduccin finalizada"); } catch (MalformedURLException malformedURL) { malformedURL.printStackTrace(); } catch (IOException ioException) { ioException.printStackTrace(); } catch (NoPlayerException noPlayerException) { noPlayerException.printStackTrace(); }

8.voiceBrowser: La idea de un Navegador Web para invidentes


La Multimedia utilizada como una manera de acercar la tecnologa a aquellas personas que sufren alguna deficiencia sensorial es un tema apasionante. Acercar el acceso a Internet a personas con discapacidades visuales, no slo es algo posible, sino totalmente necesario; como dijimos al principio de este documento, uno de los objetivos ms importantes de la tecnologa es mejorar la calidad de vida de las personas y este objetivo toma su sentido por completo cuando hablamos de discapacitados. voiceBrowser no es ms que una buena idea. En el tiempo dedicado a la realizacin de este proyecto, no ha sido posible disear un navegador con las capacidades suficientes de potencia y usabilidad para considerarse una aplicacin de produccin. Sin embargo, las ideas sobre las que se basa y su propia estructura pueden servir como base para seguir trabajando en este interesantsimo proyecto. Ni qu decir tiene que tanto el cdigo de la aplicacin como este mismo documento estn a disposicin de todo el que quiera utilizarlos, modificarlos o ampliarlos, bajo las licencias GPL [pgina web licencia GPL] para el cdigo fuente de la aplicacin y Creative Commons [pgina web de Creative Commons] para el presente documento. voiceBrowser combina varias tecnologas proveidas por Java para cumplir su

voiceBrowser: Navegador Web para invidentes

Pgina 23

cometido: 1. Reconocimiento y sntesis de voz: Provedo por la JavaSpeech API y cuyas definiciones se encuentran en los paquetes del J2SDK
javax.speech; javax.speech.recognition; javax.speech.synthesis;

Las funciones de voz ya han sido sobradamente explicadas a lo largo de los puntos anteriores de este documento, por lo que no se har hincapi aqu. 2. Procesado HTML: El propio J2SDK de Sun provee de manera nativa, herramientas tanto para realizar conexiones a servidores Web y obtener las pginas deseadas (paquete java.net) como para procesar estas pginas Web (paquetes javax.swing.text.html y javax.swing.text.html.parser) Estas herramientas de parsing que trae por defecto el API de Java 2, permiten trabajar con documentos HTML, identificar los tags que los componen, los atributos de los diferentes tags y otras tareas similares, aunque no proporcionan demasiada potencia Existe una implementacin de una librera de parsing HTML mucho ms potente que las clases que incorpora el J2SDK. Esta librera se llama Xerces e incorpora muchas clases de parsing de elementos web concretos. 3. Presentacin de la pgina HTML en pantalla: De esto se encarga un control Swing de Java que permite mostrar documentos de texto, de texto enriquecido (RTF) y documentos HTML (con ciertas limitaciones). Se trata de la clase
JEditorPane.

8.1.Procesado HTML en Java. Uso del paquete javax.swing.text.html El paquete javax.swing.text.html provee las clases e interfaces necesarias para trabajar con documentos HTML de una manera no demasiado potente, pero suficiente para muchos cometidos. La aplicacin voiceBrowser utiliza estas funciones de parsing HTML para conocer la estructura de los documentos HTML que accede el usuario para poder proporcionar una versin para invidentes. voiceBrowser funciona de la siguiente manera: 1. Obtiene la pgina web solicitada del servidor Web en Internet. Para ello, utiliza las clases de manejo de Streams de Java, que permiten acceder a una direccin web de una forma tan sencilla como esta:
URL direction = new URL(http://www.google.com); InputStream is = direction.openStream(); InputStreamReader parseIn = new InputStreamReader(is);

2. Crear una clase que extienda a la clase HTMLEditorKit.ParserCallback

voiceBrowser: Navegador Web para invidentes

Pgina 24

del paquete javax.swing.text.html. Esta clase permite definir mtodos que son llamados cada vez que en un documento HTML que est siendo parseado se encuentra un tag. Provee mtodos para tratar el tag de apertura, el tag de cierre y el texto contenido entre los tags de apertura y cierre:
public void handleStartTag(HTML.Tag tag, MutableAttributeSet attributes, int position); public void handleText(char[] text, int position); public void handleEndTag(HTML.Tag tag, int position);

El orden de llamada de los mtodos de HTMLEditorKit.ParserCallback es el siguiente:


<a href=http://www.google.com> Google </a>

<a href= http://www.google.com>

Java llamar al mtodo handleStartTag con tag = HTML.Tag.A attributes = href=http://www.google.com position = offset en la pgina web

Google

Java llamar al mtodo handleText con text = Google position = offset en la pgina web

</a>

Java llamar al mtodo handleEndTag con tag = HTML.Tag.A position = offset en la pgina web

3. Por ltimo, se debe pedir a Java que realice el parseado de la pgina web. Asumiendo que:

Hemos cargado la pgina web original en un objeto de tipo Reader llamado parseIn. Hemos creado una clase que extiende a HTMLEditorKit.ParserCallback, que implementa la lgica de procesado del documento HTML que llamaremos processHTML. El documento despus de ser procesado queremos almacenarlo en un objeto de tipo Writer llamado parseOut.

Podemos ejecutar el siguiente cdigo para realizar el parsing:


ParserGetter kit = new ParserGetter(); HTMLEditorKit.Parser parser = kit.getParser();

voiceBrowser: Navegador Web para invidentes

Pgina 25

BufferedWriter parseOut = new BufferedWriter(new StringWriter()); HTMLEditorKit.ParserCallback callback = new processHTML(parseOut, direction.toString()); parser.parse(parseIn, callback, true); parseOut.flush(); parseIn.close(); parseOut.close();

4. Una vez realizado esto, el documento HTML original habr sido procesada segn la implementacin de la clase processHTML y el resultado estar almacenado en el objeto de tipo Writer parseOut.

voiceBrowser: Navegador Web para invidentes

Pgina 26

9.Bibliografa

Potts, Stephen - Pestikov, Alex - Kopack, Mike. Chapter 12: Procesing Speech with Java. En: Java 2 Unleashed, Sixth Edition (ISBN:0-67232394-X).

Ed. Pearson Education. Versin electrnica:

http://www.developer.com/java/article.php/1471001

Java Speech API Programmers Guide, Versin 1.0 [en lnea]. 26 de Octubre de 1998. Disponible en Web:

http://java.sun.com/products/javamedia/speech/forDevelopers/jsapi-guide/index.html

Java Speech API Specification Document, Versin 1.0 [en lnea]. Disponible en Web:

http://java.sun.com/products/javamedia/speech/forDevelopers/jsapi-doc/index.html

Java Speech Grammar Format Specification, Versin 1.0 [en lnea]. Disponible en Web:

http://java.sun.com/products/javamedia/speech/forDevelopers/JSGV/index.html

Java Speech Markup Language Specification, Versin 0.5 [en lnea]. Disponible en Web:

http://java.sun.com/products/javamedia/speech/forDevelopers/JSML/index.html

Java Speech API, Jarkko Enden [en lnea]. Disponible en Web formato PDF:

http://www.cs.helsinki.fi/u/campa/teaching/jarkko-final.pdf

You might also like