GeneralInteligencia ArtificialProgramaciónTecnologíaWeb

Texto a voz con Python y Google Cloud API (Segunda Parte)

Descripción de proyecto

Python Client for Google Cloud Text-to-Speech API, complemento a la entrega anterior Texto a voz (TTS) con Python, gTTS y Flask framework.

Text-to-Speech API te permite convertir palabras y oraciones en datos de audio codificados en Base64 de voz humana natural. Luego, puedes convertir los datos de audio en archivos de audio reproducibles, como MP3, mediante la decodificación de los datos codificados en Base64. La API de Text-to-Speech acepta entradas como texto sin procesar o lenguaje de marcado de síntesis de voz (SSML).

Este código toma como base el provisto por Google (https://github.com/GoogleCloudPlatform/python-docs-samples/blob/HEAD/texttospeech/snippets/synthesize_text.py) con las siguientes mejoras:

  • Incorpora el archivo JSON con las credenciales de la cuenta de servicio de Google Cloud Platform como una variable de entorno. Obviamente, por razones de seguridad, en el repositorio no se adjuntan estas credenciales.
  • Sustituye el texto que va como argumento en el comando por un archivo de texto, asì el código lee el contenido del archivo en lugar de usar el texto directamente desde la línea de comandos.
import argparse
import os

# Define la variable de entorno para apuntar al archivo JSON de las credenciales.
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "zinc-direction-238121-45cc42b35b4c.json"

# [START tts_synthesize_text]
def synthesize_text(text):
    """Synthesizes speech from the input string of text."""
    from google.cloud import texttospeech

    client = texttospeech.TextToSpeechClient()

    input_text = texttospeech.SynthesisInput(text=text)

    # Note: the voice can also be specified by name.
    # Names of voices can be retrieved with client.list_voices().
    voice = texttospeech.VoiceSelectionParams(
        language_code="es-US",
        name="es-US-Neural2-B",
        ssml_gender=texttospeech.SsmlVoiceGender.MALE,
    )

    audio_config = texttospeech.AudioConfig(
        audio_encoding=texttospeech.AudioEncoding.MP3
    )

    response = client.synthesize_speech(
        request={"input": input_text, "voice": voice, "audio_config": audio_config}
    )

    # The response's audio_content is binary.
    with open("output.mp3", "wb") as out:
        out.write(response.audio_content)
        print('Audio content written to file "output.mp3"')


# [END tts_synthesize_text]


# [START tts_synthesize_ssml]
def synthesize_ssml(ssml):
    """Synthesizes speech from the input string of ssml.

    Note: ssml must be well-formed according to:
        https://www.w3.org/TR/speech-synthesis/

    Example: <speak>Hello there.</speak>
    """
    from google.cloud import texttospeech

    client = texttospeech.TextToSpeechClient()

    input_text = texttospeech.SynthesisInput(ssml=ssml)

    # Note: the voice can also be specified by name.
    # Names of voices can be retrieved with client.list_voices().
    voice = texttospeech.VoiceSelectionParams(
        language_code="en-US",
        name="en-US-Standard-C",
        ssml_gender=texttospeech.SsmlVoiceGender.FEMALE,
    )

    audio_config = texttospeech.AudioConfig(
        audio_encoding=texttospeech.AudioEncoding.MP3
    )

    response = client.synthesize_speech(
        input=input_text, voice=voice, audio_config=audio_config
    )

    # The response's audio_content is binary.
    with open("output.mp3", "wb") as out:
        out.write(response.audio_content)
        print('Audio content written to file "output.mp3"')


# [END tts_synthesize_ssml]


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    group = parser.add_mutually_exclusive_group(required=True)

    # Remueve el argumento "--text" y agrega "--file" para el nombre del archivo
    group.add_argument("--file", help="Path to the input text file.")
    group.add_argument("--ssml", help="The ssml string from which to synthesize speech.")

    args = parser.parse_args()

    if args.file:
        # Leer el contenido del archivo
        with open(args.file, "r") as file:
            text = file.read()
        synthesize_text(text)
    else:
        synthesize_ssml(args.ssml)

Este código utiliza la biblioteca «google-cloud-texttospeech 2.14.1» (Google Cloud Texttospeech API client library). Mas información sore este recurso en https://pypi.org/project/google-cloud-texttospeech/

Idiomas y voces compatibles

Text-to-Speech proporciona las siguientes voces. La lista incluye las voces Neural2, Studio, Standard y WaveNet. Las voces Studio, Neural2 y WaveNet son voces de mejor calidad y con precios diferentes. El listado en https://cloud.google.com/text-to-speech/docs/voices?hl=es

Precios

Revisa la calculadora de precios (https://cloud.google.com/products/calculator?hl=es) para verificar el costo de tu proyecto consumiendo esta API. Recuerda que Google Cloud tiene una base de consumo gratuito en muchos de sus servicios.

Credenciales

Para autenticar la aplicación de Python y permitir que acceda a la API de Text-to-Speech de Google Cloud, se necesita proporcionar credenciales válidas. Puedes hacerlo utilizando un archivo de clave de servicio o configurando las variables de entorno adecuadas.

A continuación, te mostraré cómo obtener las credenciales y cómo ajustar tu programa de Python para usarlas:

  1. Obtener credenciales de Google Cloud: a. Ve a la página de «Credenciales» en la consola de Google Cloud: https://console.cloud.google.com/apis/credentials b. Haz clic en el botón «Crear credenciales» y selecciona «Cuenta de servicio clave». c. Elige o crea un proyecto, selecciona «Cuenta de servicio» y «Crear sin rol». d. Luego, selecciona el formato de clave como «JSON» y haz clic en «Crear». Esto descargará un archivo JSON con tus credenciales.
  2. Configurar las credenciales en tu programa de Python: a. Guarda el archivo JSON de las credenciales en el mismo directorio que tu programa de Python. b. Modifica tu programa de Python para que use las credenciales desde el archivo JSON. Para ello, puedes agregar el siguiente código al comienzo de tu script:
import os

# Define la variable de entorno para apuntar al archivo JSON de las credenciales.
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "ruta/a/tu/archivo-de-credenciales.json"

Reemplaza "ruta/a/tu/archivo-de-credenciales.json" con la ruta real donde guardaste el archivo JSON de las credenciales.

Con esto, tu programa de Python debería poder autenticarse correctamente y utilizar la API de Text-to-Speech de Google Cloud para generar el audio desde el texto o SSML proporcionado.

Si aún encuentras problemas de autenticación, asegúrate de que la cuenta de servicio asociada a las credenciales tenga permisos adecuados para acceder a la API de Text-to-Speech. Puedes revisar los permisos de la cuenta de servicio en la consola de Google Cloud y asegurarte de que tenga el rol apropiado para utilizar la API.

Repositorio

Encuentra este código en https://github.com/DaveSV/Google_Cloud_T2S/tree/main

Deja una respuesta

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