Sintetizar texto a voz con Festival en Web
En este post doy por hecho que sabemos hacer la instalación del servicio de Festival en nuestro equipo linux, si no es así siempre podéis pasar por Festival, de texto a voz en linux.
Después de unos post "filosóficos" hoy pasamos nuevamente a la parte ténica, en donde con un par de ficheros podremos generar un fichero mp3 sintetizado con Festival mediante un texto de un formulario web.
El ejemplo que expongo a continuación es una página web sencilla que tras rellenar el texto en un textarea lo envía a si misma y retorna la descarga de un fichero mp3 con el texto sintetizado, siempre que tengamos el servicio de festival configurado.
El ejemplo de página web sería:
<?php
if($_POST['texto']){
$filename = md5($_POST['texto']);
$txtFile=$filename;
$mp3File=$filename.".mp3";
$fp = fopen($txtFile, 'w');
fwrite($fp,$_POST['texto']);
fclose($fp);
exec("./lanza.sh $txtFile");
if(file_exists($mp3File)){
$fp = fopen($mp3File,'r');
if (filesize($mp3File)) {
$mp3 = fread($fp, filesize($mp3File));
}
fclose($fp);
}
if(isset($mp3)){
header('Content-Type: audio/x-mp3');
header('Content-Disposition: attachment; filename="'.$mp3File);
header('Content-Length: '. filesize($mp3File));
echo $mp3;
unlink($mp3File);
unlink($txtFile);
}
}else{
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Demo</title>
</head>
<body>
<h1>Demo</h1>
<form action="" method="post">
<textarea name="texto" rows="10" cols="50"></textarea>
<br />
<input type="submit" name="enviar" value="enviar" />
</form>
</body>
</html>
<?
}
?>
Como podemos ver, lanzamos un script para generar el fichero mp3, que es la parte más importante ya que cualquier programador y más si hablamos de alguien experto en PHP puede observar que el código es realmente sencillo. Pero lo más divertido fue crear el script sh para generar el fichero mp3.
#!/bin/sh TEXT=`cat $1` PAR1="(Parameter.set 'Wavefiletype 'riff)n" PAR2="(let ((utt (Utterance Text "$TEXT"))) (begin (utt.synth utt) (utt.save.wave utt "$1.wav"))) n" echo Inicio festival! echo $PAR1$PAR2 | festival -b --pipe --language spanish lame -hf $1.wav $1.mp3 rm $1.wav
Aquí en el script, lo que hacemos es indicarle a Festival que la salida la queremos en un fichero Wav. De todas formas no tenemos todo resuelto! tenemos que generar el mp3, y con lame lo hacemos de una manera sencilla ![]()
Espero que os pueda ser de utilidad esta mini-receta, cualquier duda siempre podéis plasmarla en un comentario.
13 diciembre, 2009 - 17:58
no he entendido nada…
13 diciembre, 2009 - 23:10
@Jesus procuraré a lo largo de esta semana el hacer un nuevo post explicando más al detalle este asunto.
6 marzo, 2012 - 00:10
Saludos
Podrias explicar mas a detalle el archivo sh no lo entiendo muy bien…la salida del mp3 donde la deposita????
Gracias por tu pronta respuesta