JSML – JSpeech Markup Language

Speech ApplicationsDen här sajten startade ju som en tekniksajt en gång i tiden och jag tänkte att jag skulle få upp lite av det material som fanns här då. Det är många år sedan och de flesta tekniker är idag hopplöst obsoleta men det är lite kul att ha dem på plats här i alla fall så jag börjar med att lägga upp en liten genomgång av JSML vilken jag inte tror har uppdaterats sedan 1997 och de flesta länkarna är för evigt döda (en gång på internet betyder inte alls alltid på internet). Någon gång kanske jag får nytta av den här gamla kunskapen i alla fall. Håll tillgodo.

JSML – JSpeech Markup Language (tidigare Java Speech Markup Language) är SUNs bidrag till Markup Language för röstapplikationer på internet. JSML utvecklas inte längre och dagens version är version 0.5 och kom redan 28 augusti 1997.
Såväl VoxML som VoiceXML bygger i grunden på JSML och arvet efter JSML kommer att leva kvar länge ännu i och med VoiceXMLs framgångar på området.
Ta gärna och titta igenom specifikationerna för VoiceXML här och se hur pass mycket av JSML som faktiskt ser ut att kunna leva vidare i den här typen av mobila applikationer.
Läs SUNs specifikationer av JSML här:
http://java.sun.com/products/java-media/speech/
forDevelopers/JSML/

Länkar för dig som vill läsa mer om Java och Java Speech applikationer:
Java Speech API
Java Speech Features
XML Cover Pages
FreeTTS 1.1 Speech Syntesier

Ett exempel text markup med JSML kan se ut som nedan:

<SENT>Computers <EMP>can</EMP> speak.</SENT>

Fördig som arbetat med HTML, SGML eller XML är denna typ av markeringsspråk ingen nyhet. indikerar början på en mening och avslutar densamma. På samma sätt markerar och elementen en sektion som skall tilldelas emfas.
JSML definerar åtta element.

Attribut

Attribut används för att förse element med extra information om detsamma. Varje JSML-element har en uppsättning med definerade attributnamn och, i vissa fall, är attributvärdet låst till vissa strängar.
Exempelvis kan EMP-elementet markera ord med ett nivåattribut med värdet strong:

Listen to my <EMP LEVEL=”strong”>voice.</EMP>

Du kan använda vissa JSML-element inom andra JSML-element, så kallad nesting.

<PARA> text med <EMP> mer text </EMP> </PARA>

Kom ihåg att inga element får överlappa varandra, exemplet nedan visar hur det INTE får se ut:

<PARA> text med <EMP> mer text </PARA> </EMP>

Tomma Element

Ett tomt element har endast en tag och innehåller därmed ingen text. I exemplet nedan resulterar koden till att det uppstår en pause där det tomma elementet för pause uppträder:

I know a, <BREAK SIZE=”large”/>secret.

Eftersom elementet inte markera någon text behöver det ingen slut-tag. Elementet visar att det slutar med ”/>”.

Notation

Alla JSML-element skall skrivas med versaler. Alla JSML-attributvärden är känsliga för om du använder versaler eller gemener, så värdena ”Värde” och ”värde” är INTE samma sak.

Dokumentstruktur

JSML ärett språk som bygger på XML (eXtensible Markup Language) och på grund av detta har JSML en syntax som är standardiserad och som inte är bunden till JSAPI (Java Speech API). Detta innebär att:

JSML är läs- och redigeringsbart av både människa och dator.

XML-editorer kan användas för att förenkla skapandet av JSML-applikationer.

JSML är enkelt för en synthesizer att tolka.

även om det inte är nödvändigt att kunna XML för att förstå eller använda JSML så är följande av intresse:
Om ett JSML-dokument startar med

<?XML version=”1.0″ encoding=”UCS-2″?>

<JSML>

och slutar med

</JSML>

så är JSML-dokumentet ett giltigt XML-dokument. Detta innebär att en tal-synthesizer kan använda en generell XML-tolk för att tolka JSML-text.
Om syntesizern tillhandahåller en DTD (Document Type Definition) för JSML reduceras syntesizerns arbete markant.
Dessa öppnings- och slutelement är valfria att använda i JSML (men använd dem då de ger ett större användningsområde och ger giltig XML-kod).

Kommentarer

Kommentarer i JSML-kod skrivs inom <!– och –&gt tecknen och kan innehålla all text förutom teckensekvensen –.
Kommentarer kan placeras mitt i text som skall presenteras (kommentarerna kommer inte att presenteras):

This is <!– Ett exempel på en kommentar –> fun.

Kommentarer kan placeras inom element.

<BREAK>

Ett tomt element som markerar en pause i talet. SIZE=”medium” är standardattributet om inte SIZE eller MSECS är angivet.

Attribut

MSECS Anger hur många millisekunder pausen skall vara

SIZE Anger längden på pausen med de relativa värdena: none, small, medium eller large

MARK Valfritt attribut som frågar efter en underättelse (notification) när synthesizern kommer fram till elementets text. Attributets värde är den text som skall göras tillgänglig när underättelsen (the notification) uppträder.

BREAK-elementet är ett tomt element som anger korta pauseer i den text som skall talas och som används för att markera fraseringar i det som talas till användaren.
För att indikera vilken typ av pause som är önskvärt så kan du använda attributet SIZE eller attributet MSECS, dock inte båda samtidigt. SIZE-attributet indikerar en pause som är relevant för språkets karrakteristika medans MSECS-attributet indikerar en pause i absolut angiven tid.
I de flesta språk skapas pauser genom förändringar i hur språket talas i hastighet, förändringar i timing med mera. Dessa faktorer är starkt beroende på innehållet i det talade. Till exempel är en pause på 300 millisekunder mer markant i något som talas snabbt än i något som talas långsamt.
Av dessa skäl så bör du, om möjligt, använda attributet SIZE istället för attributet MSECS.

Exempel

<BREAK/>

<BREAK SIZE=”small” MARK=”145″/>

<BREAK MSECS=”300″/>

<EMP>

Elementet EMP anger hur stark emfas som skall läggas på den markerade texten eller på det följande ordet (om EMP används som ett tomt element).

Attribut

LEVEL attributet krävs och anger styrkan i emfasen. Värden: strong, moerate, none och reduced.
LEVEL=”moderate” är default-värdet.

MARK Valfritt attribut som frågar efter en underättelse (notification) när synthesizern kommer fram till elementets text. Attributets värde är den text som skall göras tillgänglig när underättelsen (the notification) uppträder.

Elementet EMP specificerar en del av text som skall talas med emfas.
Attributet LEVEL anger hur stark emfasen skall vara. Värden för LEVEL-attributet är strong (för stark emfas), moderate (för lite emfas), none (för ingen emfas) och reduced (för reducerad emfas).

Exempel:

Listen to <EMP>me.</EMP>

Listen to <EMP LEVEL=”moderate”>me.</EMP>

EMP-elementet kan också användas som ett tomt element som då specificerar att den omedelbart följande texten skall ges emfas.
Följande exempel ger samma resultat som de ovan:

Listen to <EMP/>me.

Listen to <EMP LEVEL=”moderate” MARK=”hands”/>me.

<ENGINE>

Elementet tillhandahåller information från attributet DATA genom attributet ENGID till den identifierade synthesizern.

Attribut

ENGID Identifierarefören röst-synthesizer.

DATA Information som skall anges till den identifierade synthesizern.

MARK Valfritt attribut som frågar efter en <<<notification>>> när synthesizern kommer fram till elementets text. Attributets värdeärdentext som skall göras tillgänglig när underättelsen uppträder.

Elementet ENGINE ger möjlighet att låta applikationen använda en specificerad och identifierad synthesizers modellspecifika möjligheter. Elementet tillhandahåller information, värdet av DATA-attributet, till den röst-synthesizer som är identifierad genom ENGID-attributet. Informationen består oftast av makinspecifika kommandon.
En identifierad röst-synthesizer skall ersätta elementets text med värdet i DATA-attributet, icke identifierade synthesizers skall ignorera värdet i DATA-attributet och presentera texten i elementet.

Exempel

I am <ENGINE ENGID=”KyberMedia Voice” DATA=”Mr Casselbrant”> someone else</ENGINE>

En KyberMedia röst-synthesizer kommer att säga ”I am Mr Casselbrant” och alla andra synthesizers kommer att säga ”I am someone else”. Ett JSML-dokument kan innehålla ENGINE-element för valfritt antal synthesizers och elementen kan nästlas.

Mindre än-tecken och och-tecken (&) angivna i DATA-attributet måste anges med kod för att inte misstas för JSML.
Mindreän tecknet kan anges med något av följande kodexempel (utan citationstecknen):
”<”, ”&#60” eller ”&#x003C”.
Och-tecknet (&) kan anges med följande kod:
”&”, ”&#38” eller ”&#x0026”.
Du kan också placera tecknen i en CDATA-sektion.
CDATA har följande syntax:
<![CDATA[ text som skall vara escaped ]]>
Texten får inte innehålla teckensekvensen ]]>.
Synthesizers hanterar CDATA-sektioner genom att skala bort <![CDATA[ och ]]> markeringarna och genom att ej tolka CDATA-sektionens innehåll som JSML.

Exempel

<ENGINE ENGID=”Croaker 1.0″ DATA=”<ribbit=1>” MARK=”frog start”> no frog sound </ENGINE>

<JSML>

Elementet JSML används för att ange ett JSML-dokuments början och slut och motsvarar <HTML>-elementet i HTML.

Syntax

<JSML>
dokument innehåll
</JSML>

<MARKER>

Tomt element som efterfrågar en underättelse när synthesizern når fram till markeraren. Attributet MARK måste anges.

Attribut

MARK Har ett värde i form av text som är tillgängligt när en marker-händelse inträffar.

Exempel

Answer <MARKER MARK=”yes_no_prompt”> yes or no.</MARKER>

<PARA>

Elementet PARA markerar text som ett stycke.

Attribut

MARK Valfritt attribut som frågar efter en underättelse när synthesizern kommer fram till elementets text. Attributets värdeärdentext som skall göras tillgänglig när underättelsen uppträder.

Syntax

<PARA>This is a paragraph.</PARA><PARA> This is a longer paragraph</PARA>

PARA-element kan inte nästlas med varandra.

I JSML kan man även använda en blankrad för att separera stycken istället för att använda PARA-elementet.
Följande tre exempel resulterar i samma tal:

I am the great JSML guru, yes I am.
And now you are learning to.

Och nu med PARA-elementet:

<PARA>I am the great JSML guru, yes I am.</PARA>
<PARA>And now you are learning to.</PARA>

<PARA>I am the great JSML guru, yes I am.
And now you are learning to.</PARA>

<PROS>

Elementet PROS anger information om den markerade textens metrik. Minst ett av attributen RATE, PITCH, RANGE och VOL måste anges.

Attribut

RATE anger antal ord i minuten.

VOL anger volymen i en skala från 0.0 till 1.0, där 0.0 är tyst och 1.0 är maximal ljudvolym.

PITCH anger hastighetn i Hertz. Numeriskt värde.

RANGE anger nivån på pitch i Hertz. Numeriskt värde.

MARK valfritt attribut som frågar efter en underättelse när synthesizern kommer fram till elementets text. Attributets värdeärdentext som skall göras tillgänglig när underättelsen uppträder.

Elementet PROS ger prosodisk/metrisk kontroll i JSML. Prosodi/metrik är en samling egenskaper i språk som inkluderar dess intonation och frasering med mera.
Om man behärskar prosodin/metriken så kan man uppnå en ökad förståelse av det som talas och få ett naturligare tal.
De numeriska värden som du kan ge attributen i PROS-elementet är flyttal i formen 12, 8.3 eller -0.22.

Attributet RATE kan tilldelas värden enligt följande lista:

n Antalet ord i minuten

+n Ökar antalet ord i minuten med det angivna värder

-n Minskar antalet ord i minuten med det angivna värdet

-n% Minskar antalet ord i minuten procentuellt med det angivna värdet

reset återställer till default-värdet

Exempel

<PROS RATE=”150″>talas med 150 ord i minuten</PROS>

Attributet VOL kan tilldelas värden enligt följande lista:

n Anger volymstyrka (endast 0.0 till 1.0)

+n Ökar volymstyrkan med angivet värde

-n Minskar volymstyrkan med angivet värde

+n% Ökar volymstyrkan med angivet värde i procent

-n% Minskar volymstyrkan med angivet värde i procent

reset återställer till default-värdet

Attributen PITCH och RANGE kan tilldelas värden enligt följande lista:

n Anger nivå i Hertz

+n Ökar nivån med angivet värde

-n Minskar nivån med angivet värde

+n% Ökar nivån med det angivna värdet i procent

-n% Minskar nivån med det angivna värdet i procent

reset återställer till default-värdet

<SAYAS>

Elementet SAYAS talar om hur ett ord eller kort fras skall uttalas.
Ett utav attrubuten SUB, CLASS eller PHON måste anges.

Attribut

SUB Anger ett värde i form av en text som skall talas som ett substitut för texten som är angiven i elementet.

CLASS Indikerar hur texten skall uttalas. Värden som kan anges: date, digits, literal, number och time.

PHON För att ange ett IPA (International Phonetic Alphabet) värde eller JAVA- representationen av \uXXXX, Unicode IPA tecken som skall talas istället för text.

MARK Valfritt attribut som frågar efter en underättelse när synthesizern kommer fram till elementets text. Attributets värdeärdentext som skall göras tillgänglig när underättelsen uppträder.

Det är svårt för en syntesizer att veta hur den skall uttala förkortningar, akronymer, namn, lokal jargong och homografer. Om en JSML-applikation innehåller sådan information som löser en sådan svårighet kan man ge den informationen till synthesizer genom att använda SAYAS-elementet.

SUB (Substitute)
SUB-attributet definierar text som skall talas istället för, som i exemplet nedan:

<SAYAS SUB=”I triple E”>IEEE</SAYAS>

CLASS
När CLASS-attributet värde är date skall texten som ärmarkerad uttalas som ett datum, till exempel:

<SAYAS CLASS=”date”>Jan. 1952</SAYAS>
<!– uttalas som: January nineteen fifty-two –>

Ibland kan det vara nödvändigt att använda attributet SUB istället för CLASS=”date” för att få rätt uttal. Ett exempel är datumnotationen 4/3/97 dubbeltydig i:

<SAYAS CLASS=”date”>4/3/97</SAYAS>

Det kan sägas ”April third nineteen ninety-seven” eller ”March fourth nineteen ninety-seven”. Om det är ett dubbeltydigt uttryck så använder du SUB-attributet för att förtydliga:

<SAYAS SUB=”March fourth nineteen ninety-seven”>4/3/97</SAYAS>

När attributet CLASS har värdet literal bokstaveras bokstäver, siffror och andra tecken.

Exempel

<SAYAS CLASS=”literal”>JSML</SAYAS>
<!– bokstaveras J S M L –>

<SAYAS CLASS=”literal”>12</SAYAS>
<!– bokstaveras till one two –>

<SAYAS CLASS=”literal”>100%</SAYAS>
<!– bokstaveras till one zero zero percent sign –>

När CLASS-attributet har värdet number uttalas den markerade texten som ett tal, till exempel:

<SAYAS CLASS=”number”>12</SAYAS>
<!– uttalas som twelve –>

PHON (Phonetic Pronunciation)
PHON-attributet använder tecknen från IPAs (International Phonetic Alphabet) undergrupp av Unicode för att definiera en ljudsekvens.
För mer information om Unicodes IPA stöd kan du läsa The Unicode Standard 2.0 (The Unicode Consortium Addison-Wesley Developers Press, 1996).
Tänk på att det kan uppsttå problem om du försöker få synthesizern att uttala på ett annat språk än sitt ursprungliga.

<SAYAS PHON=”\u0066\u006F\u028A\u006E\u025B\u0074\u026A
\u006B\u0073″> phonetics </SAYAS>

Du kan inte nästla element i SAYAS-elementet.

Tillåtet

<PROS RATE=”30%”><SAYAS SUB=”sun dot com”>sun.com </SAYAS></PROS>

Inte tillåtet:

<SAYAS SUB=”sun dot com”><PROS RATE=”30%”>sun.com</PROS></SAYAS>

<SENT>

Elementet SENT markerar text som en mening.

Attribut

MARK Valfritt attribut som frågar efter en underättelse när synthesizern kommer fram till elementets text. Attributets värdeärdentext som skall göras tillgänglig när underättelsen uppträder.

Syntax

<SENT>Dog eat dog.</SENT>

SENT-element kan inte nästlas med varandra.

Det var det hela. Jag kommer antagligen att lägga upp liknande för VoxML också däremot får vi se om jag orkar att vid tillfälle ta idu med WML/WAP och VoiceXML som jag hade på originalsajten men som försvann när webbhotellet krashade (De är inte kvar i branchen längre och det finns väl orsak till det kan man tro). Det vore dock kul att ge sig på talstyrt internetsurfande igen. Det finns nog ett antal applikationer där detta är ett reellt verktyg så kanske om tiden tillåter.

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *