Usa la API de Text‑to‑Speech con Python

1. Descripción general

1215f38908082356.png

La API de Text-to-Speech permite que los desarrolladores generen una voz similar a la humana. La API convierte texto en formatos de audio como WAV, Ogg Opus o MP3. También admite entradas de lenguaje de marcación de síntesis de voz (SSML) para especificar pausas, números, formato de fecha y hora, y otras instrucciones de pronunciación.

En este instructivo, te enfocarás en el uso de la API de Text‐to‐Speech con Python.

Qué aprenderás

  • Cómo configurar tu entorno
  • Cómo enumerar los idiomas compatibles
  • Cómo obtener una lista de las voces disponibles
  • Cómo sintetizar audio a partir de texto

Requisitos

  • Un proyecto de Google Cloud
  • Un navegador, como Chrome o Firefox.
  • Conocimientos de Python

Encuesta

¿Cómo usarás este instructivo?

Leer Leer y completar los ejercicios

¿Cómo calificarías tu experiencia en Python?

Principiante Intermedio Avanzado

¿Cómo calificarías tu experiencia con los servicios de Google Cloud?

Principiante Intermedio Avanzado .
.

2. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla cuando quieras.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID de tu proyecto (suele identificarse como PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usa el mismo durante todo el proyecto.
  • Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no costará mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Inicia Cloud Shell

Si bien Google Cloud se puede operar de manera remota desde tu laptop, en este codelab usarás Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.

Activar Cloud Shell

  1. En la consola de Cloud, haz clic en Activar Cloud Shell853e55310c205094.png.

8c1dabeca90e44e5.png

Si es la primera vez que inicias Cloud Shell, verás una pantalla intermedia que describe en qué consiste. Si apareció una pantalla intermedia, haz clic en Continuar.

9c92662c6a846a5c.png

El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.

9f0e51b578fecce5.png

Esta máquina virtual está cargada con todas las herramientas de desarrollo necesarias. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que mejora considerablemente el rendimiento de la red y la autenticación. Gran parte de tu trabajo en este codelab, si no todo, se puede hacer con un navegador.

Una vez que te conectes a Cloud Shell, deberías ver que estás autenticado y que el proyecto está configurado con tu ID del proyecto.

  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que tienes la autenticación:
gcloud auth list

Resultado del comando

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Ejecuta el siguiente comando en Cloud Shell para confirmar que el comando de gcloud conoce tu proyecto:
gcloud config list project

Resultado del comando

[core]
project = <PROJECT_ID>

De lo contrario, puedes configurarlo con el siguiente comando:

gcloud config set project <PROJECT_ID>

Resultado del comando

Updated property [core/project].

3. Configuración del entorno

Antes de comenzar a usar la API de Text‐to‐Speech, ejecuta el siguiente comando en Cloud Shell para habilitarla:

gcloud services enable texttospeech.googleapis.com

Debería ver algo como esto:

Operation "operations/..." finished successfully.

Ahora puedes usar la API de Text‐to‐Speech.

Navega a tu directorio principal:

cd ~

Crea un entorno virtual de Python para aislar las dependencias:

virtualenv venv-texttospeech

Activa el entorno virtual:

source venv-texttospeech/bin/activate

Instala IPython y la biblioteca cliente de la API de Text-to-Speech:

pip install ipython google-cloud-texttospeech

Debería ver algo como esto:

...
Installing collected packages: ..., ipython, google-cloud-texttospeech
Successfully installed ... google-cloud-texttospeech-2.16.3 ...

Ahora, tienes todo listo para usar la biblioteca cliente de la API de Text‐to‐Speech.

En los siguientes pasos, usarás un intérprete de Python interactivo llamado IPython, que instalaste en el paso anterior. Para iniciar una sesión, ejecuta ipython en Cloud Shell:

ipython

Debería ver algo como esto:

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.18.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

Ya puedes realizar tu primera solicitud y enumerar los idiomas compatibles...

4. Obtén una lista de los idiomas compatibles

En esta sección, obtendrás la lista de todos los idiomas compatibles.

Copia el siguiente código en tu sesión de IPython:

from typing import Sequence

import google.cloud.texttospeech as tts


def unique_languages_from_voices(voices: Sequence[tts.Voice]):
    language_set = set()
    for voice in voices:
        for language_code in voice.language_codes:
            language_set.add(language_code)
    return language_set


def list_languages():
    client = tts.TextToSpeechClient()
    response = client.list_voices()
    languages = unique_languages_from_voices(response.voices)

    print(f" Languages: {len(languages)} ".center(60, "-"))
    for i, language in enumerate(sorted(languages)):
        print(f"{language:>10}", end="\n" if i % 5 == 4 else "")
        

Tómate un momento para estudiar el código y ver cómo usa el método de la biblioteca cliente list_voices para compilar la lista de lenguajes compatibles.

Llama a la función:

list_languages()

Deberías obtener la siguiente lista (o una más amplia):

---------------------- Languages: 58 -----------------------
     af-ZA     am-ET     ar-XA     bg-BG     bn-IN
     ca-ES    cmn-CN    cmn-TW     cs-CZ     da-DK
     de-DE     el-GR     en-AU     en-GB     en-IN
     en-US     es-ES     es-US     eu-ES     fi-FI
    fil-PH     fr-CA     fr-FR     gl-ES     gu-IN
     he-IL     hi-IN     hu-HU     id-ID     is-IS
     it-IT     ja-JP     kn-IN     ko-KR     lt-LT
     lv-LV     ml-IN     mr-IN     ms-MY     nb-NO
     nl-BE     nl-NL     pa-IN     pl-PL     pt-BR
     pt-PT     ro-RO     ru-RU     sk-SK     sr-RS
     sv-SE     ta-IN     te-IN     th-TH     tr-TR
     uk-UA     vi-VN    yue-HK

En la lista, se muestran 58 idiomas y variantes, como las siguientes:

  • chino y mandarín taiwanés,
  • Australiano, inglés británico, indio y estadounidense,
  • francés de Canadá y Francia,
  • portugués de Brasil y Portugal.

Esta lista no es fija y crece a medida que hay nuevas voces disponibles.

Resumen

En este paso, puedes enumerar los idiomas compatibles.

5. Enumera las voces disponibles

En esta sección, obtendrás la lista de voces disponibles en diferentes idiomas.

Copia el siguiente código en tu sesión de IPython:

import google.cloud.texttospeech as tts


def list_voices(language_code=None):
    client = tts.TextToSpeechClient()
    response = client.list_voices(language_code=language_code)
    voices = sorted(response.voices, key=lambda voice: voice.name)

    print(f" Voices: {len(voices)} ".center(60, "-"))
    for voice in voices:
        languages = ", ".join(voice.language_codes)
        name = voice.name
        gender = tts.SsmlVoiceGender(voice.ssml_gender).name
        rate = voice.natural_sample_rate_hertz
        print(f"{languages:<8} | {name:<24} | {gender:<8} | {rate:,} Hz")
        

Tómate un momento para estudiar el código y ver cómo usa el método de la biblioteca cliente list_voices(language_code) para enumerar las voces disponibles en un idioma determinado.

Ahora, obtén la lista de voces alemanas disponibles:

list_voices("de")

Debería ver algo como esto:

------------------------ Voices: 20 ------------------------
de-DE    | de-DE-Neural2-A          | FEMALE   | 24,000 Hz
de-DE    | de-DE-Neural2-B          | MALE     | 24,000 Hz
...
de-DE    | de-DE-Standard-A         | FEMALE   | 24,000 Hz
de-DE    | de-DE-Standard-B         | MALE     | 24,000 Hz
...
de-DE    | de-DE-Studio-B           | MALE     | 24,000 Hz
de-DE    | de-DE-Studio-C           | FEMALE   | 24,000 Hz
de-DE    | de-DE-Wavenet-A          | FEMALE   | 24,000 Hz
de-DE    | de-DE-Wavenet-B          | MALE     | 24,000 Hz
...

Hay varias voces femeninas y masculinas disponibles, además de voces estándar, WaveNet, Neural2 y Studio:

  • Las voces estándar se generan mediante algoritmos de procesamiento de señales.
  • Las voces de WaveNet, Neural2 y Studio son voces de mayor calidad sintetizadas por modelos de aprendizaje automático que suenan más naturales.

Ahora, obtén la lista de voces en inglés disponibles:

list_voices("en")

Deberías obtener un resultado similar al siguiente:

------------------------ Voices: 90 ------------------------
en-AU    | en-AU-Neural2-A          | FEMALE   | 24,000 Hz
...
en-AU    | en-AU-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-GB    | en-GB-Neural2-A          | FEMALE   | 24,000 Hz
...
en-GB    | en-GB-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-IN    | en-IN-Standard-A         | FEMALE   | 24,000 Hz
...
en-IN    | en-IN-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-US    | en-US-Neural2-A          | MALE     | 24,000 Hz
...
en-US    | en-US-News-K             | FEMALE   | 24,000 Hz
...
en-US    | en-US-Standard-A         | MALE     | 24,000 Hz
...
en-US    | en-US-Studio-M           | MALE     | 24,000 Hz
...
en-US    | en-US-Wavenet-A          | MALE     | 24,000 Hz
...

Además de una selección de múltiples voces de diferentes géneros y calidades, hay varios acentos disponibles: australiano, inglés, indio y estadounidense.

Tómate un momento para enumerar las voces disponibles para tus idiomas preferidos y variantes (o incluso para todos):

list_voices("fr")
list_voices("pt")
list_voices()

Resumen

Este paso te permitió crear una lista de las voces disponibles. Obtén más información sobre los idiomas y voces compatibles.

6. Sintetiza audio a partir de texto

Puedes usar la API de Text‐to‐Speech para convertir una cadena en datos de audio. Puedes configurar el resultado de la síntesis de voz de varias maneras, como seleccionar una voz única o modular el resultado en cuanto al tono, el volumen, la velocidad de la voz y la tasa de muestreo.

Copia el siguiente código en tu sesión de IPython:

import google.cloud.texttospeech as tts


def text_to_wav(voice_name: str, text: str):
    language_code = "-".join(voice_name.split("-")[:2])
    text_input = tts.SynthesisInput(text=text)
    voice_params = tts.VoiceSelectionParams(
        language_code=language_code, name=voice_name
    )
    audio_config = tts.AudioConfig(audio_encoding=tts.AudioEncoding.LINEAR16)

    client = tts.TextToSpeechClient()
    response = client.synthesize_speech(
        input=text_input,
        voice=voice_params,
        audio_config=audio_config,
    )

    filename = f"{voice_name}.wav"
    with open(filename, "wb") as out:
        out.write(response.audio_content)
        print(f'Generated speech saved to "{filename}"')
        

Tómate un momento para estudiar el código y ver cómo usa el método de la biblioteca cliente synthesize_speech para generar los datos de audio y guardarlos como un archivo wav.

Ahora, genera oraciones con distintos acentos:

text_to_wav("en-AU-Neural2-A", "What is the temperature in Sydney?")
text_to_wav("en-GB-Neural2-B", "What is the temperature in London?")
text_to_wav("en-IN-Wavenet-C", "What is the temperature in Delhi?")
text_to_wav("en-US-Studio-O", "What is the temperature in New York?")
text_to_wav("fr-FR-Neural2-A", "Quelle est la température à Paris ?")
text_to_wav("fr-CA-Neural2-B", "Quelle est la température à Montréal ?")

Debería ver algo como esto:

Generated speech saved to "en-AU-Neural2-A.wav"
Generated speech saved to "en-GB-Neural2-B.wav"
Generated speech saved to "en-IN-Wavenet-C.wav"
Generated speech saved to "en-US-Studio-O.wav"
Generated speech saved to "fr-FR-Neural2-A.wav"
Generated speech saved to "fr-CA-Neural2-B.wav"

Para descargar todos los archivos generados a la vez, puedes usar este comando de Cloud Shell desde tu entorno de Python:

!cloudshell download *.wav

Valida y tu navegador descargará los archivos:

44382e3b7a3314b0.png 4dbccf007cd73b91.png

Abre cada archivo y escucha el resultado.

Resumen

En este paso, pudiste usar la API de Text‐to‐Speech para convertir oraciones en archivos wav de audio. Obtén más información para crear archivos de audio de voz.

7. ¡Felicitaciones!

1215f38908082356.png

Aprendiste a usar la API de Text‐to‐Speech con Python para generar una voz similar a la humana.

Limpia

Para limpiar tu entorno de desarrollo, desde Cloud Shell, haz lo siguiente:

  • Si aún estás en la sesión de IPython, vuelve a la shell: exit
  • Deja de usar el entorno virtual de Python: deactivate
  • Borra tu carpeta de entorno virtual: cd ~ ; rm -rf ./venv-texttospeech

Para borrar tu proyecto de Google Cloud de Cloud Shell, haz lo siguiente:

  • Recupera el ID de tu proyecto actual: PROJECT_ID=$(gcloud config get-value core/project)
  • Asegúrate de que este sea el proyecto que quieres borrar: echo $PROJECT_ID
  • Borrar el proyecto: gcloud projects delete $PROJECT_ID

Más información

Licencia

Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.