In questo articolo, presentiamo la libreria FreeTTS, sviluppata dalla Carnegie Mellon University, che permette di convertire un testo nel suo corrispondente formato audio. La sigla TTS è il noto acronimo di Text To Speech, letteralmente: "dal Testo alla Voce". Più correttamente si tratta di sintesi vocale, un processo che è scandito da alcune fasi:
- analisi della struttura del testo - il testo viene analizzato per determinare l'inizio e la fine delle singole frasi facendo particolare attenzione alla punteggiatura
- processo del testo - il testo viene analizzato per individuare eventuali costrutti del linguaggio, come, ad esempio, abbreviazioni, acronimi e numeri
- conversione del testo in fonema - ciascuna parola del testo viene convertita nel corrispondente fonema, un'unità sonora che rappresenta la base del linguaggio utilizzato
- analisi prosodica - in questa fase, viene determinata l'intonazione, il ritmo e l'accento adeguato per ciascuna frase del testo
- produzione della forma d'onda - i fonemi generati e le informazioni prosodiche, vengono utilizzati per generare la forma d'onda adatta a ciascuna frase del testo
Queste fasi richiedono elaborazioni complesse che possiamo Possiamo ignorare in questo articolo, poiché è la libreria FreeTTS, utilizzando Java Speech API (JSAPI) e altre librerie esterne come Flite, Festival e FestVox, che si occupa di fornirci queste elaborazioni e produrre un audio a partire da un qualunque testo.
FreeTTS è un progetto opensource e la sua licenza, ne permette l'uso e la redistribuzione gratuita senza alcun tipo di restrizione, possiamo scaricarla dal sito ufficiale.
Un caso pratico
I campi di utilizzo del text to speech sono molti e vanno dalla gestione di sportelli vocali, al supporto agli ipovedenti, alle applicazioni mobili.
Nel nostro esempio costruiamo una semplice pagina Web, nella quale l'utente può inserire il proprio testo, e da una servlet, che intercetta il testo e, mediante la libreria FreeTTS, genera l'audio corrispondente.
Al momento, sul sito FreeTTS sono disponibili soltanto 3 voci in lingua inglese. È possibile comunque creare una propria voce utilizzando altre librerie gratuite come FestVox.
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <display-name>SpeechServlet</display-name> <servlet-name>SpeechServlet</servlet-name> <servlet-class>it.html.SpeechServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SpeechServlet</servlet-name> <url-pattern>/SpeechServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
Nel file web.xml
, definiamo la servlet, SpeechServler
, e la home page dell'applicazione, la index.jsp
che sarà costituita da un classico form di tipo POST
, nel quale inseriamo una textarea, in cui l'utente potrà inserire la frase che desidera far leggere al programma.
index.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head><title>Html.it - FreeTTS Example</title></head> <body> <form action="SpeechServlet" method="post"> <textarea rows="15" cols="15" name="testo"></textarea> <input type="submit" value="Leggi!" /> </form> </body> </html>
SpeechServlet
package it.html;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.speech.freetts.Voice;
import com.sun.speech.freetts.VoiceManager;
import com.sun.speech.freetts.util.Utilities;
public class SpeechServlet extends HttpServlet
{
private static final long serialVersionUID = -7063667152016222434L;
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
Voice voice = VoiceManager.getInstance().getVoice(Utilities.getProperty("voice16kName", "kevin16"));
voice.allocate();
voice.speak(req.getParameter("testo"));
res.sendRedirect(res.encodeRedirectURL("index.jsp"));
}
}
La Servlet è costituita da poche righe di codice, ma molto significative.
Voice voice = VoiceManager.getInstance().getVoice(Utilities.getProperty("voice16kName", "kevin16"));
Il metodo getVoice
della classe VoiceManager
, restituisce un'istanza dell'oggetto Voice
. In questo esempio, richiamiamo la voce kevin16
inclusa di default nella libreria.
voice.allocate();
Il metodo allocate
carica la voce in memoria.
voice.speak(req.getParameter("testo"));
Il metodo speak
genera ed esegue l'audio corrispondente alla stringa passata in input; nel nostro caso, il testo inserito dall'utente nella textarea.