Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Speech Synthesis Markup Language

Migliorare i nostri prompt in TTS usando SSML
Migliorare i nostri prompt in TTS usando SSML
Link copiato negli appunti

Fino a questo momento ci siamo limitati ad introdurre nei nostri prompt il testo da leggere, senza preoccuparci minimamente di come venisse letto o interpretato. Lo scopo di questa lezione è quello di introdurre alcuni concetti base dello "speech" come la prosodica (ovvero le inflessioni di tono, velocità, accento all'interno del parlato).

Questa opzione ci viene offerta dal SSML, il linguaggo standard W3C che ci permette di gestire lo streaming TTS. Questo linguaggio che si basa su una struttura di tipo XML, all'interno di questa struttura è inoltre possibile inserire ulteriori elementi strutturali come <p> per i paragrafi, e <s> per le frasi.

SSML, inoltre, si occupa della normalizzazione, ovvero convertire il testo scritto in output vocale tenendo conto del tipo di dato, ad esempio quando nel testo troviamo "123456" questo testo può essere letto come sequenza di numeri, oppure, come valuta etc.

i file SSML possono essere integrati all'interno di un prompt in VoiceXML oppure utilizzati in un documento seprarato, in questo secondo caso utilizzeremo un prolog di questo tipo:

listato 5.1: Documento SSML

<?xml version="1.0"?>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.w3.org/2001/10/synthesis
   http://www.w3.org/TR/speech-synthesis/synthesis.xsd"
   xml:lang="it-IT">
 ...
</speak>

Il secondo tag che esaminiamo è il tag <break> che introduce una pausa di durata variabile all'interno del nostro testo. Vediamo subito un semplice esempio:

listato 5.2: break

..
<form>
 <block>
  <prompt>
   Questa è una pausa media:
   <break/>
   Questa è una pausa da dieci millisecondi:
   <break time="10ms"/>
   Pausa gestita attraverso gli indicatori "strong/x-strong":
   <break strength="x-strong"/>
  </prompt>
 </block>
</form>
..

In questo semplice esempio vediamo due cose: primo, che i tag SSML sono contenuti all'interno di un prompt e secondo che il nostro tag break supporta diverse tipologie di attributi di lunghezza che sono:

  • msecs: dove possiamo indicare la lunghezza in millisecondi
  • size: dove possiamo indicare la lunghezza utilizzando "small","medium", "large" oppure "none". Notare che questo tipo di attributo non è attualmente supportato dalle specifiche 2.0
  • strenght: dove la lunghezza viene espressa utilizzando gli indicatori "x-weak", "weak", "medium", "strong", "x-strong" or "none"
  • time: dove possiamo in questo caso possiamo indicarne la durata in secondi (s) o millisecondi (ms)

Dopo la pausa un altro importante tag è quello che ci permette di leggere un testo secondo la sua pronuncia, e non come viene scritto.

Questo tipo di approccio è molto utile soprattutto quando ci troviamo difronte ad un testo importato da un'altra fonte (rss, un record di un database, un sito etc..) e non abbiamo il controllo diretto sulla creazione del prompt.

In questo caso ci vengono in aiuto diverse metodologie di intervento che risiedono nell'uso del tag <say-as>. Attraverso questo tag possiamo richiamare un formato di lettura predefinito per un certo testo, che sarà dipendente dalla piattaforma sulla quale lavoriamo e dal linguaggio, tra cui:

  • <say-as interpret-as="letters">: legge il testo compreso all'interno del tag facendone lo spelling
  • <say-as interpret-as="vxml:date">: legge il testo numerico (02/02/2006) come una "Due Febbraio Duemilasei"
  • <say-as interpret-as="vxml:number">: legge il testo numerico (2345) come "Duemilatrecentoquarantacinque)
  • <say-as interpret-as="vxml:currency">: legge il testo numerico come valuta (
  • <say-as interpret-as="vxml:time">: legge il testo come ora e minuti

"Say-as" inoltre permette anche di specificare una pronuncia della singola parola o della frase indicandone l'esatta pronuncia.

Un ulteriore metodo per perfezionare la pronuncia di una parola ci è offerto dal tag <phoneme> all'interno del quale possiamo indicare l'esatta pronuncia della parola attraverso l'uso dei fonemi.

Gli attributi supportati sono: alphabet="..." che ci permette di specificare l'alfabeto di riferimento (normalmente si usa l'alfabeto standard IPA , e ph="..." che come valora supporta l'inserimento dei diversi fonemi.

listato 5.3: phoneme

<phoneme alphabet="ipa" ph="təmei̥ɾou̥"> tomato </phoneme>

Sempre parlando di normalizzazione del testo, un altro metodo ci è offerto dal tag <sub> che indica al processore TTS di sostituire il testo contenuto nel tag con quello all'interno dell'attributo alias.

listato 5.4: sub

<sub alias="World Wide Web Consortium">W3C</sub>

Come abbiamo detto nelle righe introduttive un altro metodo è quello di utlizzare la prosodia per dare rilievo ad una certa parte di testo, modificando l'intonazione della lettura, o cambiando voce durante la lettura. In questo caso utilizzeremo il tag <prosody> che contiene diversi possibili attributi, tra cui:

  • range: che indica l'estensione della voce
  • pitch: che indica la tonalità della voce
  • rate: che indica la velocità con cui verrà letto il testo
  • range: che indica il volume di lettura

vediamo subito un esempio:

listato 5.5: prosody

 <prompt>
 <prosody pitch="100%" volume="100%" rate="100%" >
 Arrivederci e grazie di aver utilizzato il nostro sistema.
 </prosody>
 </prompt>

pitch e rate supportano possono essere espressi in: percentuali (con un "+" e "-" opzionali"), oppure indicatori quali "x-high", "high", "medium", "low", "x-low", o "default", o valori espressi in "Hz".

volume può essere espresso in percentuale(con un "+" e "-" opzionali"), oppure attraverso indicatori quali "silent", "x-soft", "soft", "medium", "loud", "x-loud", or "default", o valori numerici tra 0.0 e 100.0.

L'altro modo prevede di dare un'enfasi ad una parte del testo o cambiare voce:

listato 5.6: voce e enfasi

 <prompt>
  <voice name="nome della voce 1">
  <prosody pitch="100%" volume="100%" rate="100%" >
  <emphasis level="strong">Arrivederci Marco </emphasis> e grazie di aver utilizzato il nostro sistema.
  </prosody>
  </voice>
  <voice name="nome della voce 2">
  La telefonata è terminata la preghiamo di ragganciare.
  </voice>
 </prompt>

In questo caso abbiamo utilizzato due tag diversi: il primo <voice> ci consente di cambiare la voce (con tutte le caratteristiche associate quali sesso, timbro etc..), il secondo <emphasis> permette di modificare l'enfasi con la quale viene letto una sezione di testo.

Il cambio di voce è possibile solo per quei motori che supportano diverse voci per l'engine TTS nella lingua corrente. In questo caso si dovrà scegliere il valore di "voice" tra i nomi delle voci disponibili.

La maggior parte dei motori di TTS, inoltre, leggono anche la punteggiatura e modificano automaticamente le inflessioni della voce per adattarsi al testo, ad esempio in caso di punti interrogativi ed esclamativi, o introducendo delle pause come nel caso delle virgole, punti, punti e virgola e due punti.

Ogni qual volta pensiamo di utlizzare SSML per modificare il nostro testo è buona norma controllare quali tag e quali formati di attributi vengono supportati dalla piattaforma che intendiamo utilizzare, questo è possibile farlo andando a leggere la documentazione associata ai marcatori SSML del singolo produttore, questo per evitarci spiacevoli sorprese una volta in produzione.

Ti consigliamo anche