Enunciar direcciones con SSML

En este tutorial se explica cómo usar el lenguaje de marcas de síntesis de voz (SSML) para enunciar un archivo de texto de direcciones. Puedes marcar una cadena de texto con etiquetas SSML para personalizar el audio sintético de Text-to-Speech.

Texto sin formato Renderización de texto sin formato con SSML
123 Street Ln
<speak>123 Street Ln</speak>
1 Number St
<speak>1 Number St</speak>
1 Piazza del Fibonacci
<speak>1 Piazza del Fibonacci</speak>

Objetivo

Envía una solicitud de voz sintética a Text-to-Speech mediante SSML y las bibliotecas de cliente de Text-to-Speech.

Costes

Consulta la página de precios de Text-to-Speech para obtener información sobre los costes.

Antes de empezar

Descargar los códigos de ejemplo

Para descargar los ejemplos de código, clona los Google Cloud ejemplos de GitHub del lenguaje de programación que quieras usar.

Java

En este tutorial se usa código del directorio texttospeech/cloud-client/src/main/java/com/example/texttospeech/ del repositorio de ejemplos de Java de Google Cloud Platform.

Para descargar el código de este tutorial y desplazarte hasta él, ejecuta los siguientes comandos en el terminal.

git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
cd java-docs-samples/texttospeech/cloud-client/src/main/java/com/example/texttospeech/

Node.js

En este tutorial se usa código del directorio texttospeech del repositorio de ejemplos de Node.js de Google Cloud Platform.

Para descargar el código de este tutorial y desplazarte por él, ejecuta los siguientes comandos desde el terminal.

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
cd texttospeech/

Python

En este tutorial se usa código del directorio texttospeech/snippets del repositorio de ejemplos de Python de Google Cloud Platform.

Para descargar el código de este tutorial y desplazarte hasta él, ejecuta los siguientes comandos en el terminal.

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
cd samples/snippets

Instalar la biblioteca cliente

En este tutorial se usa la biblioteca de cliente Text-to-Speech.

Java

En este tutorial se usan las siguientes dependencias:

<!--  Using libraries-bom to manage versions.
See https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/The-Google-Cloud-Platform-Libraries-BOM -->
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>libraries-bom</artifactId>
      <version>26.32.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-texttospeech</artifactId>
  </dependency>
</dependencies>

Node.js

En el terminal, ejecuta el siguiente comando.

npm install @google-cloud/text-to-speech

Python

En el terminal, ejecuta el siguiente comando.

pip install --upgrade google-cloud-texttospeech

Configurar las credenciales de Google Cloud Platform

Provide authentication credentials to your application code by setting the environment variable GOOGLE_APPLICATION_CREDENTIALS. This variable applies only to your current shell session. If you want the variable to apply to future shell sessions, set the variable in your shell startup file, for example in the ~/.bashrc or ~/.profile file.

Linux o macOS

export GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

Replace KEY_PATH with the path of the JSON file that contains your credentials.

For example:

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Windows

For PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

Replace KEY_PATH with the path of the JSON file that contains your credentials.

For example:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

For command prompt:

set GOOGLE_APPLICATION_CREDENTIALS=KEY_PATH

Replace KEY_PATH with the path of the JSON file that contains your credentials.

Importar bibliotecas

En este tutorial se usan las siguientes bibliotecas de sistema y de cliente.

Java

Para saber cómo instalar y usar la biblioteca de cliente de Text-to-Speech, consulta el artículo sobre las bibliotecas de cliente de Text-to-Speech. Para obtener más información, consulta la documentación de referencia de la API Text-to-Speech Java.

Para autenticarte en Text-to-Speech, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

// Imports the Google Cloud client library
import com.google.cloud.texttospeech.v1.AudioConfig;
import com.google.cloud.texttospeech.v1.AudioEncoding;
import com.google.cloud.texttospeech.v1.SsmlVoiceGender;
import com.google.cloud.texttospeech.v1.SynthesisInput;
import com.google.cloud.texttospeech.v1.SynthesizeSpeechResponse;
import com.google.cloud.texttospeech.v1.TextToSpeechClient;
import com.google.cloud.texttospeech.v1.VoiceSelectionParams;
import com.google.common.html.HtmlEscapers;
import com.google.protobuf.ByteString;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

Node.js

Para saber cómo instalar y usar la biblioteca de cliente de Text-to-Speech, consulta el artículo sobre las bibliotecas de cliente de Text-to-Speech. Para obtener más información, consulta la documentación de referencia de la API Text-to-Speech Node.js.

Para autenticarte en Text-to-Speech, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

// Imports the Google Cloud client library
const textToSpeech = require('@google-cloud/text-to-speech');

// Import other required libraries
const fs = require('fs');
//const escape = require('escape-html');
const util = require('util');

Python

Para saber cómo instalar y usar la biblioteca de cliente de Text-to-Speech, consulta el artículo sobre las bibliotecas de cliente de Text-to-Speech. Para obtener más información, consulta la documentación de referencia de la API Text-to-Speech Python.

Para autenticarte en Text-to-Speech, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

import html

from google.cloud import texttospeech

Usar la API Text-to-Speech

La siguiente función toma una cadena de texto etiquetada con SSML y el nombre de un archivo MP3. La función usa el texto etiquetado con SSML para generar audio sintético. La función guarda el audio sintético en el nombre de archivo MP3 designado como parámetro.

Toda la entrada de SSML solo se puede leer con una voz. Puedes definir la voz en el objeto VoiceSelectionParams.

.

Java

Para saber cómo instalar y usar la biblioteca de cliente de Text-to-Speech, consulta el artículo sobre las bibliotecas de cliente de Text-to-Speech. Para obtener más información, consulta la documentación de referencia de la API Text-to-Speech Java.

Para autenticarte en Text-to-Speech, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

/**
 * Generates synthetic audio from a String of SSML text.
 *
 * <p>Given a string of SSML text and an output file name, this function calls the Text-to-Speech
 * API. The API returns a synthetic audio version of the text, formatted according to the SSML
 * commands. This function saves the synthetic audio to the designated output file.
 *
 * @param ssmlText String of tagged SSML text
 * @param outFile String name of file under which to save audio output
 * @throws Exception on errors while closing the client
 */
public static void ssmlToAudio(String ssmlText, String outFile) throws Exception {
  // Instantiates a client
  try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) {
    // Set the ssml text input to synthesize
    SynthesisInput input = SynthesisInput.newBuilder().setSsml(ssmlText).build();

    // Build the voice request, select the language code ("en-US") and
    // the ssml voice gender ("male")
    VoiceSelectionParams voice =
        VoiceSelectionParams.newBuilder()
            .setLanguageCode("en-US")
            .setSsmlGender(SsmlVoiceGender.MALE)
            .build();

    // Select the audio file type
    AudioConfig audioConfig =
        AudioConfig.newBuilder().setAudioEncoding(AudioEncoding.MP3).build();

    // Perform the text-to-speech request on the text input with the selected voice parameters and
    // audio file type
    SynthesizeSpeechResponse response =
        textToSpeechClient.synthesizeSpeech(input, voice, audioConfig);

    // Get the audio contents from the response
    ByteString audioContents = response.getAudioContent();

    // Write the response to the output file
    try (OutputStream out = new FileOutputStream(outFile)) {
      out.write(audioContents.toByteArray());
      System.out.println("Audio content written to file " + outFile);
    }
  }
}

Node.js

Para saber cómo instalar y usar la biblioteca de cliente de Text-to-Speech, consulta el artículo sobre las bibliotecas de cliente de Text-to-Speech. Para obtener más información, consulta la documentación de referencia de la API Text-to-Speech Node.js.

Para autenticarte en Text-to-Speech, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

/**
 * Generates synthetic audio from a String of SSML text.
 *
 * Given a string of SSML text and an output file name, this function
 * calls the Text-to-Speech API. The API returns a synthetic audio
 * version of the text, formatted according to the SSML commands. This
 * function saves the synthetic audio to the designated output file.
 *
 * ARGS
 * ssmlText: String of tagged SSML text
 * outfile: String name of file under which to save audio output
 * RETURNS
 * nothing
 *
 */
async function ssmlToAudio(ssmlText, outFile) {
  // Creates a client
  const client = new textToSpeech.TextToSpeechClient();

  // Constructs the request
  const request = {
    // Select the text to synthesize
    input: {ssml: ssmlText},
    // Select the language and SSML Voice Gender (optional)
    voice: {languageCode: 'en-US', ssmlGender: 'MALE'},
    // Select the type of audio encoding
    audioConfig: {audioEncoding: 'MP3'},
  };

  // Performs the Text-to-Speech request
  const [response] = await client.synthesizeSpeech(request);
  // Write the binary audio content to a local file
  const writeFile = util.promisify(fs.writeFile);
  await writeFile(outFile, response.audioContent, 'binary');
  console.log('Audio content written to file ' + outFile);
}

Python

Para saber cómo instalar y usar la biblioteca de cliente de Text-to-Speech, consulta el artículo sobre las bibliotecas de cliente de Text-to-Speech. Para obtener más información, consulta la documentación de referencia de la API Text-to-Speech Python.

Para autenticarte en Text-to-Speech, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

def ssml_to_audio(ssml_text: str) -> None:
    """
    Generates SSML text from plaintext.
    Given a string of SSML text and an output file name, this function
    calls the Text-to-Speech API. The API returns a synthetic audio
    version of the text, formatted according to the SSML commands. This
    function saves the synthetic audio to the designated output file.

    Args:
        ssml_text: string of SSML text
    """

    # Instantiates a client
    client = texttospeech.TextToSpeechClient()

    # Sets the text input to be synthesized
    synthesis_input = texttospeech.SynthesisInput(ssml=ssml_text)

    # Builds the voice request, selects the language code ("en-US") and
    # the SSML voice gender ("MALE")
    voice = texttospeech.VoiceSelectionParams(
        language_code="en-US", ssml_gender=texttospeech.SsmlVoiceGender.MALE
    )

    # Selects the type of audio file to return
    audio_config = texttospeech.AudioConfig(
        audio_encoding=texttospeech.AudioEncoding.MP3
    )

    # Performs the text-to-speech request on the text input with the selected
    # voice parameters and audio file type
    response = client.synthesize_speech(
        input=synthesis_input, voice=voice, audio_config=audio_config
    )

    # Writes the synthetic audio to the output file.
    with open("test_example.mp3", "wb") as out:
        out.write(response.audio_content)
        print("Audio content written to file " + "test_example.mp3")

Personalizar el audio sintético

La siguiente función toma el nombre de un archivo de texto y convierte el contenido del archivo en una cadena de texto etiquetada con SSML.

Java

Para saber cómo instalar y usar la biblioteca de cliente de Text-to-Speech, consulta el artículo sobre las bibliotecas de cliente de Text-to-Speech. Para obtener más información, consulta la documentación de referencia de la API Text-to-Speech Java.

Para autenticarte en Text-to-Speech, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

/**
 * Generates SSML text from plaintext.
 *
 * <p>Given an input filename, this function converts the contents of the input text file into a
 * String of tagged SSML text. This function formats the SSML String so that, when synthesized,
 * the synthetic audio will pause for two seconds between each line of the text file. This
 * function also handles special text characters which might interfere with SSML commands.
 *
 * @param inputFile String name of plaintext file
 * @return a String of SSML text based on plaintext input.
 * @throws IOException on files that don't exist
 */
public static String textToSsml(String inputFile) throws Exception {

  // Read lines of input file
  String rawLines = new String(Files.readAllBytes(Paths.get(inputFile)));

  // Replace special characters with HTML Ampersand Character Codes
  // These codes prevent the API from confusing text with SSML tags
  // For example, '<' --> '&lt;' and '&' --> '&amp;'
  String escapedLines = HtmlEscapers.htmlEscaper().escape(rawLines);

  // Convert plaintext to SSML
  // Tag SSML so that there is a 2 second pause between each address
  String expandedNewline = escapedLines.replaceAll("\\n", "\n<break time='2s'/>");
  String ssml = "<speak>" + expandedNewline + "</speak>";

  // Return the concatenated String of SSML
  return ssml;
}

Node.js

Para saber cómo instalar y usar la biblioteca de cliente de Text-to-Speech, consulta el artículo sobre las bibliotecas de cliente de Text-to-Speech. Para obtener más información, consulta la documentación de referencia de la API Text-to-Speech Node.js.

Para autenticarte en Text-to-Speech, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

/**
 * Generates SSML text from plaintext.
 *
 * Given an input filename, this function converts the contents of the input text file
 * into a String of tagged SSML text. This function formats the SSML String so that,
 * when synthesized, the synthetic audio will pause for two seconds between each line
 * of the text file. This function also handles special text characters which might
 * interfere with SSML commands.
 *
 * ARGS
 * inputfile: String name of plaintext file
 * RETURNS
 * a String of SSML text based on plaintext input
 *
 */
function textToSsml(inputFile) {
  let rawLines = '';
  // Read input file
  try {
    rawLines = fs.readFileSync(inputFile, 'utf8');
  } catch (e) {
    console.log('Error:', e.stack);
    return;
  }

  // Replace special characters with HTML Ampersand Character Codes
  // These codes prevent the API from confusing text with SSML tags
  // For example, '<' --> '&lt;' and '&' --> '&amp;'
  let escapedLines = rawLines;
  escapedLines = escapedLines.replace(/&/g, '&amp;');
  escapedLines = escapedLines.replace(/"/g, '&quot;');
  escapedLines = escapedLines.replace(/</g, '&lt;');
  escapedLines = escapedLines.replace(/>/g, '&gt;');

  // Convert plaintext to SSML
  // Tag SSML so that there is a 2 second pause between each address
  const expandedNewline = escapedLines.replace(/\n/g, '\n<break time="2s"/>');
  const ssml = '<speak>' + expandedNewline + '</speak>';

  // Return the concatenated String of SSML
  return ssml;
}

Python

Para saber cómo instalar y usar la biblioteca de cliente de Text-to-Speech, consulta el artículo sobre las bibliotecas de cliente de Text-to-Speech. Para obtener más información, consulta la documentación de referencia de la API Text-to-Speech Python.

Para autenticarte en Text-to-Speech, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

def text_to_ssml(inputfile: str) -> str:
    """
    Generates SSML text from plaintext.
    Given an input filename, this function converts the contents of the text
    file into a string of formatted SSML text. This function formats the SSML
    string so that, when synthesized, the synthetic audio will pause for two
    seconds between each line of the text file. This function also handles
    special text characters which might interfere with SSML commands.

    Args:
        inputfile: name of plaintext file
    Returns: SSML text based on plaintext input
    """

    # Parses lines of input file
    with open(inputfile) as f:
        raw_lines = f.read()

    # Replace special characters with HTML Ampersand Character Codes
    # These Codes prevent the API from confusing text with
    # SSML commands
    # For example, '<' --> '&lt;' and '&' --> '&amp;'

    escaped_lines = html.escape(raw_lines)

    # Convert plaintext to SSML
    # Wait two seconds between each address
    ssml = "<speak>{}</speak>".format(
        escaped_lines.replace("\n", '\n<break time="2s"/>')
    )

    # Return the concatenated string of ssml script
    return ssml

Analizar todos los datos en conjunto

Este programa usa la siguiente entrada.

123 Street Ln, Small Town, IL 12345 USA
1 Jenny St & Number St, Tutone City, CA 86753
1 Piazza del Fibonacci, 12358 Pisa, Italy

Si se envía el texto anterior a text_to_ssml(), se genera el siguiente texto etiquetado.

<speak>123 Street Ln, Small Town, IL 12345 USA
<break time="2s"/>1 Jenny St &amp; Number St, Tutone City, CA 86753
<break time="2s"/>1 Piazza del Fibonacci, 12358 Pisa, Italy
<break time="2s"/></speak>

Ejecutar el código

Para generar un archivo de audio de voz sintética, ejecuta el siguiente código desde la línea de comandos.

Java

Linux o macOS

En el directorio java-docs-samples/texttospeech/cloud-client/, ejecuta el siguiente comando en la línea de comandos.

$ mvn clean package

Windows

En el directorio java-docs-samples/texttospeech/cloud-client/, ejecuta el siguiente comando en la línea de comandos.

$ mvn clean package

Node.js

Linux o macOS

En el archivo hybridGlossaries.js, descomenta las variables TODO (developer) comentadas.

En el siguiente comando, sustituye projectId por el ID de tu proyecto. Google Cloud En el directorio nodejs-docs-samples/texttospeech, ejecuta el siguiente comando en la línea de comandos.

$ node ssmlAddresses.js projectId

Windows

En el archivo hybridGlossaries.js, descomenta las variables TODO (developer) comentadas.

En el siguiente comando, sustituye projectId por el ID de tu proyecto. Google Cloud En el directorio nodejs-docs-samples/texttospeech, ejecuta el siguiente comando en la línea de comandos.

$env: C:/Node.js/node.exe C: ssmlAddresses.js projectId

Python

Linux o macOS

En el directorio python-docs-samples/texttospeech/snippets, ejecuta el siguiente comando en la línea de comandos.

$ python ssml_addresses.py

Windows

En el directorio python-docs-samples/texttospeech/snippets, ejecuta el siguiente comando en la línea de comandos.

$env: C:/Python3/python.exe C: ssml_addresses.py

Comprobar el resultado

Este programa genera un archivo de audio example.mp3 de voz sintética.

Java

Ve al directorio java-docs-samples/texttospeech/cloud-client/resources/.

Comprueba si hay un archivo example.mp3 en el directorio resources.

Node.js

Ve al directorio nodejs-docs-samples/texttospeech/resources/.

Comprueba si hay un archivo example.mp3 en el directorio resources.

Python

Ve a python-docs-samples/texttospeech/snippets/resources.

Comprueba si hay un archivo example.mp3 en el directorio resources.

Escucha el siguiente clip de audio para comprobar que el sonido de tu archivo example.mp3 es el mismo.


Solucionar problemas

  • Si olvidas definir la variable de entorno GOOGLE_APPLICATION_CREDENTIALS en la línea de comandos, se generará el siguiente mensaje de error:

    The Application Default Credentials are not available.

  • Si se pasa text_to_ssml() el nombre de un archivo que no existe, se genera el siguiente mensaje de error:

    IOError: [Errno 2] No such file or directory
    

  • Si se pasa ssml_to_audio() a un parámetro ssml_text que contiene None, se genera el siguiente mensaje de error:

    InvalidArgument: 400 Invalid input type. Type has to be text or SSML
    

  • Asegúrate de ejecutar el código desde el directorio correcto.

Siguientes pasos

Limpieza

Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud Platform, usa la Google Cloud consola para eliminar tu proyecto si no lo necesitas.

Eliminar un proyecto

  1. En la Google Cloud consola, ve a la página Proyectos.
  2. En la lista de proyectos, selecciona el proyecto que quieras eliminar y haz clic en Eliminar.
  3. En el cuadro de diálogo, escribe el ID del proyecto y haz clic en Cerrar para eliminar el proyecto.