Script: texto a voz (Google) desde el terminal

El día de hoy comparto con Uds. un script muy útil para convertir un texto a voz utilizando el motor de voz de Google. La ventaja principal de este script es que “evade” el límite de 100 bytes impuesto por Google. En realidad, para ser honestos, respeta este límite pero envía todas las líneas en forma automática con lo cual dicha limitación pasa desapercibida para el usuario. Los más exigentes notarán, no obstante, que la conversión no es de la misma calidad que la que podemos obtener en Google Translate, principalmente debido a este límite y que no es posible pasar el texto entero de un sólo golpe. Como punto positivo, cabe agregar que este script también permite especificar el idioma del texto a convertir.

Hecha la aclaración, veamos cuáles son los pasos a seguir.

Pasos a seguir

1.- Crear un archivo con el nombre t2s.sh.

2.- Copiar el siguiente contenido:

#!/bin/bash

#################################
# Speech Script by Dan Fountain #
# Modified by UsemosLinux       #
# TalkToDanF@gmail.com          #
#################################

INPUT=$*
STRINGNUM=0

ary=(${INPUT:2})
echo "---------------------------"
echo "Speech Script by Dan Fountain"
echo "TalkToDanF@gmail.com"
echo "---------------------------"
for key in "${!ary[@]}"
do
SHORTTMP[$STRINGNUM]="${SHORTTMP[$STRINGNUM]} ${ary[$key]}"
LENGTH=$(echo ${#SHORTTMP[$STRINGNUM]})
#echo "word:$key, ${ary[$key]}"
#echo "adding to: $STRINGNUM"
if [[ "$LENGTH" -lt "100" ]]; then
#echo starting new line
SHORT[$STRINGNUM]=${SHORTTMP[$STRINGNUM]}
else
STRINGNUM=$(($STRINGNUM+1))
SHORTTMP[$STRINGNUM]="${ary[$key]}"
SHORT[$STRINGNUM]="${ary[$key]}"
fi
done

for key in "${!SHORT[@]}"
do
#echo "line: $key is: ${SHORT[$key]}"

echo "Playing line: $(($key+1)) of $(($STRINGNUM+1))"
mplayer "http://translate.google.com/translate_tts?ie=UTF-8&tl=${1}&q=${SHORT[$key]}"
done

3.- Otorgar permisos de ejecución al script:

sudo chmod +x t2s.sh

4.- Ejecutar el script pasando como parámetros: a) el código del idioma correspondiente al texto, b) el texto que se desea convertir. Por ejemplo:

./t2s.sh es Este es un texto muy interesante para convertir.
Consejo: algunos emuladores de terminal permiten pegar texto con sólo arrastrarlo. O sea que es posible seleccionar un texto en Firefox y arrastrarlo al terminal.

Eso es todo, espero que lo disfruten.

Comparte para difundir

Si te ha gustado nuestro contenido ahora puedes ayudar a difundirlo en las redes sociales de manera sencilla usando los siguientes botones:

Envía
Pinea
Print

37 comentarios

  1.   Yoyo dijo

    Como mola, muchas gracias 😉

    Y que linda voz tiene la chica, creo que me enamoré 😛

    1.    darkguzz dijo

      Disculpa me puedes ayudar para el chino?, no me detecta los caracteres chinos, so el pinyin.

  2.   Shadow dijo

    Esto esta bueno como para un script que revise el correo o para una alarma personalizada que al despertar te diga el pronostico y mensajes pendientes xD

  3.   Yoyo dijo

    Aquí hice un vídeo de prueba 😛 https://www.youtube.com/watch?v=O3IeK7PjA_0

    1.    usemoslinux dijo

      Bien! Gracias!

  4.   benctrox dijo

    Se escucha muy bien, solo tube que instalar mpg123 🙂

  5.   portaro dijo

    Tube que instalar mpg123 pero mola mogollón, eso si no acepta algunas palabras dicce a tilde derecho letra etc.

    EHEH

  6.   Pablo Honorato dijo

    La base de datos de virus ha sido actualizada (?)

    1.    jalbrhcp dijo

      apt update && ./t2.sh es La base de datos de virus ha sido actualizada

  7.   Alexander dijo

    Jajaja Excelente, ya le tengo algunos usos, voz sensual sin duda =), gracias por compartir.

  8.   Jorge Moratilla dijo

    Como usuario de Mac OSX, no me ha sido posible usar el Script ya que no tengo puesto el mpg123, por lo que modificando el Script y usando VLC, podemos dejarlo funcionando correctamente en Mac OS X.

    http://pastebin.com/C2Mkp1Qy

    1.    rolo dijo

      el tema es que vlc seguramente queda prendido y no se cierra al terminar de ejecutarse y podrías usar cvlc para evitar que se abra la interfaz gráfica

      1.    rolo dijo

        se le podría poner
        cvlc –play-and-exit “https://translate.google.com/translate_tts?tl=${1}&q=${SHORT[$key]}”
        para que cierre al terminar la reproduccion

  9.   neysonv dijo

    hola chicos me sale este error, a ver si alguien me dice cual es el problema
    Playing line: 1 of 1
    HTTP request failed: 404 Not Found
    [mpg123.c:610] error: Access to http resource http://translate.google.com/translate_tts?tl=hola&q= la failed.

    1.    neysonv dijo

      [code]Playing line: 1 of 1
      HTTP request failed: 404 Not Found
      [mpg123.c:610] error: Access to http resource http://translate.google.com/translate_tts?tl=hola&q= la failed. [/code]

    2.    usemoslinux dijo

      El problema es que estás usando mal el script.
      Cuando lo ejecutes, tenés que pasarle como primer parámetro el idioma del texto, como se muestra en el ejemplo del post.
      Te doy otro ejemplo:
      ./t2s.sh en This is a simple example.
      Fijate que luego de ts2.sh sigue “en” (que significa “english”, o sea inglés). Para español, usá “es” y luego la frase en ese idioma que quieras convertir.
      Abrazo! Pablo.

  10.   anonimo dijo

    conoces el comando speak no? jeje

    espeak -v es-la “hola”

    1.    usemoslinux dijo

      Sí, pero no es lo mismo. Esta voz es mucho mejor. 🙂

      1.    notananonimo dijo

        estamos de acuerdo!
        Saludos!

  11.   Sara dijo

    Para quien tenga problemas con mpg123 -q o no le guste puede cambiar a mplayer

    mpg123 -q “http://translate.google.com/translate_tts?tl=${1}&q=${SHORT[$key]}”

    mplayer “http://translate.google.com/translate_tts?tl=${1}&q=${SHORT[$key]}”

    1.    Guido dijo

      Mejor “mplayer –really-quiet” para que no llene la salida con texto

  12.   Jonathan dijo

    Muí buena idea usar a google para mis aplicaciones me queda como anillo al dedo.
    http://github.com/alfa30/t2v

  13.   darkguzz dijo

    Una pregunta mas; alguien podría decirme como grabar el audio de salida???

    1.    José GDF dijo

      Yo mismo te respondo, porque acabo de conseguirlo. Usando mpg123, he modificado la línea 38 del script, quedando de esta manera:

      mpg123 -q -w audio.wav “http://translate.google.com/translate_tts?tl=${1}&q=${SHORT[$key]}”

      He añadido -w audio.wav. Esto crea un archivo wav con el audio de la frase, pero tal cual lo he dejado, no se escucha. Si además, quieres escuchar la frase, tendrías que añadir otra línea. Quedarías ambas así:

      mpg123 -q -w audio.wav “http://translate.google.com/translate_tts?tl=${1}&q=${SHORT[$key]}” &
      mpg123 -q “http://translate.google.com/translate_tts?tl=${1}&q=${SHORT[$key]}”

      Seguramente se podría hacer de otra manera más eficiente y limpia, pero a mi al menos me funciona.

      1.    darkguzz dijo

        Excelente José GDF, probé tu método con muy buen resultado, saludos.

      2.    soymicmic dijo

        Para ahorrar tráfico en la segunda ejecución podrías reproducir el .wav que has generado en la primera

      3.    José GDF dijo

        Pues sí, usando un reproductor que tengamos instalado. Por ejemplo, con VLC Player sería:

        vlc audio.wav

        Bueno, quien dice vlc, dice cualquier otro reproductor, incluidos los que funcionan por terminal.

        Y para evitar la sobreescritura del archivo a cada uso del script, se debería usar una variable para el nombre. Nombre que pondría el usuario (comando read) antes de empezar… Pero eso ya sería rizar el rizo 😀

  14.   Drarko dijo

    Yo lo hice en PHP (para crear audios para una central telefonica Asterisk*)

    <?php
    $url = 'http://translate.google.com/translate_tts?ie=UTF-8&q={query}%0A&tl=es&prev=input';

    if (count($argv) <= 1) {
    $name = basename($argv[0]);
    die($name .' usage: ' . $name .' <text-to-translate' .PHP_EOL);
    }
    array_shift($argv);
    $query = implode(' ', $argv);
    $filename = str_replace(array(' ', ',', '.'), '-', $query);
    $filename = str_replace('–', '-', $filename);

    $url = str_replace('{query}', rawurlencode($query), $url);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);

    $path = getcwd() .'/' .$filename;
    file_put_contents($path .'.mp3', $result);
    @exec("sox {$path}.mp3 -b 16 -r 8000 -t wavpcm {$path}.wav");
    @unlink($path .'.mp3');

    1.    darkguzz dijo

      Que tal ya he logrado grabar el audio de salida con este comando:
      arecord ~/zhongwen.mp3 & ./t2s.sh zh ni hao;fg
      y al final ctrl+c para detener la grabacion.

      Nunca había usado php
      Pero al ejecutar :
      php5 texto-a-voz.php es Hola
      la konsola aloja esto:
      sox FAIL formats: no handler for file extension `mp3′

      De cualquier se agradece mucho el aporte, lo intentaré mas tarde.

  15.   kirian dijo

    2 aplicaciones para Traductor de idiomas de google + traducción del texto a voz:
    http://www.linuxhispano.net/2014/05/29/traductor-de-google-voz/

  16.   José dijo

    Creo que es la mejor manera de convertir, la voz no esta tan mal como las demás opciones para Linux >_<
    ¿Existe alguna manera de hacer que lea un archivo de texto plano?
    Seria de mucha utilidad para convertir libros enteros a audio

  17.   chuflas dijo

    Pues a mi no me va, no se porqueee, sale esto:

    xxxxx:~/Documentos/Linux$ ./t2s.sh es hola

    —————————
    Speech Script by Dan Fountain
    TalkToDanF@gmail.com
    —————————
    Playing line: 1 of 1
    http_open: HTTP/1.0 400 Bad Request
    http://translate.google.com: No such file or directory

    tengo instalado el mpg123 y he hecho pruebecillas y nada…. gracias de antemano

  18.   Ignacio Cruz Martínez dijo

    Qué tal, este script me ha servido muy bien, tanto para escuchar el sonido como para grabar las palabras del traductor.

    De hecho, he modificado el script para adapatarlo a una necesidad que tengo: Transformar una lista de palabras en texto (lemario) a voz; me guarde la voz en wav, convierta a ogg y les ponga el nombre según la palabra leída.

    Esto lo hice en KDE usando Kdialog para especificar la ruta donde está el archivo con la lista de palabras y el directorio donde quiero que se guarde el audio de voz.

    Cuando finaliza la conversión de WAV a OGG, me crea dos carpetas donde se guardan los wav por un lado y los ogg del otro.

    En un principio me daba bronca porque no me leía correctamente las palabras con acentos, pero encontré que hay que agregar “es&ie=UTF8” en el código. Por un momento olvidé la codificación de caracteres.

    Les dejo el código del script que realicé por si les sirve:

    #######################################################################

    #!/bin/bash

    #################################
    # Lemario de texto a voz #
    # Adaptado por Ignacio Cruz Martínez #
    # el correo es secreto xD #
    #################################

    #cuadro de diálogo de KDE para especificar ruta y nombre del lemario
    soyunarchivo=$(kdialog –inputbox “Escriba la ruta y el nombre del archivo (con extensión si la tiene):”)

    #cuadro de diálogo de KDE para especificar la carpeta destino de los archivos de voz
    ruta=$(kdialog –inputbox “Escriba la ruta para guardar el audio de voz:”)

    #mediante cat se leen todas las líneas del archivo de texto, cada línea consta de una sola palabra
    for i in $(cat $soyunarchivo)
    do
    echo $i

    #conversión a voz mediante google translate, no se olviden de la codificación para que lea acentos
    mpg123 -q -w “$ruta”$i.wav “http://translate.google.com/translate_tts?tl=es&ie=UTF8&q=$i”
    mpg123 -q “http://translate.google.com/translate_tts?tl=es&ie=UTF8&q=$i”

    #usando ffmpeg para convertir los archivos wav a ogg
    ffmpeg -i “$ruta”$i.wav -acodec libvorbis “$ruta”$i.ogg
    done

    #con estas líneas se crean las carpetas para organizar los archivos de voz en WAV u OGG
    mkdir “$ruta”WAV
    mv “$ruta”*.wav “$ruta”WAV

    mkdir “$ruta”OGG
    mv “$ruta”*.ogg “$ruta”OGG

    #cuadro de diálogo KDE para indicar que se terminó el trabajo
    kdialog –msgbox ‘Proceso terminado’

    #####################################################################

    Ahora bien, ¿alguno de ustedes tiene conocimiento sobre la licencia de uso de los archivos de voz generados?

    Limitacione por derechos de autor y cosas relacionadas. Esto me interesa porque pienso usar algunos de estos archivos de voz para apoyar a personas que se van a alfabetizar, básicamente es un proyecto sin ánimo de lucro.

    Y es que esta herramienta tiene la mejor entonación para lenguaje español, lamentablemente en linux no hay algo parecido. Mbrola me ha dado mucha lata para configurarse junto con Gespeaker.

    Gracias y nos vemos.

    1.    usemoslinux dijo

      Ni idea… habría que ver en las licencias de Google Translator.

  19.   Armando dijo

    No me funcionó el Script, al parecer es un problema relacionado con la URL, para quien le interese esta es la URL correcta:
    http://translate.google.com/translate_tts?tl=es&q=Hola

  20.   juajo dijo

    Hola! He estado realizando pruebas con tu script y al ejecutarlo me ha dicho que no encontraba el audio, asique he metido la URL y parece que el señor google ha puesto un captcha…

  21.   ' dijo

    actualicen el script

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.