Traducir y enunciar texto de fotos con glosarios (avanzado)


En esta página se explica cómo detectar texto en una imagen, cómo personalizar traducciones y cómo generar una voz sintética a partir de texto. En este tutorial se usa Cloud Vision para detectar texto en un archivo de imagen. En este tutorial se explica cómo usar Cloud Translation para proporcionar una traducción personalizada del texto detectado. Por último, en este tutorial se usa la función de conversión de texto a voz para proporcionar el dictado automático del texto traducido.

Objetivos

  1. Transfiere texto reconocido por la API Cloud Vision a la API Cloud Translation.

  2. Crea y usa glosarios de Cloud Translation para personalizar las traducciones de la API Cloud Translation.

  3. Crea una representación de audio del texto traducido mediante la API Text-to-Speech.

Costes

Cada API Google Cloud utiliza una estructura de precios diferente.

Para obtener información detallada sobre los precios, consulta la guía de precios de Cloud Vision, la guía de precios de Cloud Translation y la guía de precios de Text-to-Speech.

Antes de empezar

Comprueba que tengas lo siguiente:

Descargar los códigos de ejemplo

En este tutorial se usa código del directorio samples/snippets/hybrid_glossaries de las bibliotecas de cliente de Cloud para Python.

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

git clone https://github.com/googleapis/python-translate.git
cd samples/snippets/hybrid_glossaries/

Configurar bibliotecas de cliente

En este tutorial se usan las bibliotecas de cliente de Vision, Translation y Text-to-Speech.

Para instalar las bibliotecas de cliente pertinentes, ejecuta los siguientes comandos desde el terminal.

pip install --upgrade google-cloud-vision
pip install --upgrade google-cloud-translate
pip install --upgrade google-cloud-texttospeech

Configurar permisos para crear glosarios

Para crear glosarios de traducción, debes usar una clave de cuenta de servicio con permisos de editor de la API Cloud Translation.

Para configurar una clave de cuenta de servicio con permisos de editor de la API Cloud Translation, haz lo siguiente:

  1. Crea una cuenta de servicio:

    1. En la Google Cloud consola, ve a la página Cuentas de servicio.

      Ir a Cuentas de servicio

    2. Selecciona el proyecto.

    3. Haz clic en Crear cuenta de servicio.

    4. En el campo Nombre de cuenta de servicio, escribe un nombre. La consola rellena el campo ID de cuenta de servicio en función de este nombre.Google Cloud

    5. Opcional: En el campo Descripción de la cuenta de servicio, escribe una descripción.

    6. Haz clic en Crear y continuar.

    7. Haz clic en el campo Selecciona un rol y elige Cloud Translation > Editor de la API Cloud Translation.

    8. Haz clic en Hecho para terminar de crear la cuenta de servicio.

      No cierres la ventana del navegador. Lo usarás en el siguiente paso.

  2. Descarga una clave JSON de la cuenta de servicio que acabas de crear:

    1. En la Google Cloud consola, haz clic en la dirección de correo de la cuenta de servicio que has creado.
    2. Haz clic en Teclas.
    3. Haz clic en Añadir clave y, a continuación, en Crear clave.
    4. Haz clic en Crear. Se descargará un archivo de clave JSON en tu ordenador.

      Asegúrate de almacenar el archivo de claves de forma segura, ya que se puede usar para autenticarte como tu cuenta de servicio. Puedes mover y cambiar el nombre de este archivo como quieras.

    5. Haz clic en Cerrar.

  3. En la carpeta hybrid_glossaries del terminal, define la variable GOOGLE_APPLICATION_CREDENTIALS con el siguiente comando. Sustituye path_to_key por la ruta al archivo JSON descargado que contiene la nueva clave de la cuenta de servicio.

    Linux o macOS

    export GOOGLE_APPLICATION_CREDENTIALS=path_to_key

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path_to_key

Importar bibliotecas

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

import html
import os

# Imports the Google Cloud client libraries
from google.api_core.exceptions import AlreadyExists
from google.cloud import texttospeech
from google.cloud import translate_v3beta1 as translate
from google.cloud import vision

Configurar el ID de proyecto

Debes asociar un Google Cloud proyecto a cada solicitud a una API Google Cloud . Designa tu Google Cloud proyecto definiendo la variable de entorno GOOGLE_CLOUD_PROJECT desde el terminal.

En el siguiente comando, sustituye PROJECT_NUMBER_OR_ID por el Google Cloud número o ID de tu proyecto. Ejecuta el siguiente comando desde el terminal.

Linux o macOS

export GOOGLE_CLOUD_PROJECT=PROJECT_NUMBER_OR_ID

Windows

set GOOGLE_CLOUD_PROJECT=PROJECT_NUMBER_OR_ID

En este tutorial se usa la siguiente variable de ID de proyecto global.

# extract GCP project id
PROJECT_ID = os.environ["GOOGLE_CLOUD_PROJECT"]

Usar Vision para detectar texto de una imagen

Usa la API Vision para detectar y extraer texto de una imagen. La API Vision usa el reconocimiento óptico de caracteres (OCR) para admitir dos funciones de detección de texto: la detección de texto denso, o DOCUMENT_TEXT_DETECTION, y la detección de texto disperso, o TEXT_DETECTION.

En el siguiente código se muestra cómo usar la función DOCUMENT_TEXT_DETECTION de la API Vision para detectar texto en una foto con texto denso.

def pic_to_text(infile: str) -> str:
    """Detects text in an image file

    Args:
    infile: path to image file

    Returns:
    String of text detected in image
    """

    # Instantiates a client
    client = vision.ImageAnnotatorClient()

    # Opens the input image file
    with open(infile, "rb") as image_file:
        content = image_file.read()

    image = vision.Image(content=content)

    # For dense text, use document_text_detection
    # For less dense text, use text_detection
    response = client.document_text_detection(image=image)
    text = response.full_text_annotation.text
    print(f"Detected text: {text}")

    return text

Usar la traducción con glosarios

Después de extraer texto de una imagen, usa glosarios de traducción para personalizar la traducción del texto extraído. Los glosarios proporcionan traducciones predefinidas que anulan las traducciones de la API Cloud Translation de los términos designados.

Estos son algunos de los usos del glosario:

  • Nombres de productos: por ejemplo, "Google Home" debe traducirse como "Google Home".

  • Palabras ambiguas: por ejemplo, la palabra "murciélago" puede referirse a un animal o a un objeto deportivo. Si sabes que vas a traducir palabras sobre deportes, puedes usar un glosario para indicar a la API Cloud Translation que la traducción de "bat" es la deportiva, no la del animal.

  • Palabras prestadas: por ejemplo, "bouillabaisse" en francés se traduce como "bouillabaisse" en inglés. El inglés ha tomado prestada la palabra "bouillabaisse" del francés. Un hablante de inglés que no conozca el contexto cultural francés puede que no sepa que la bullabesa es un plato francés de pescado. Los glosarios pueden anular una traducción para que "bouillabaisse" en francés se traduzca como "fish stew" en inglés.

Crear un archivo de glosario

La API Cloud Translation acepta archivos de glosario TSV, CSV o TMX. En este tutorial se usa un archivo CSV subido a Cloud Storage para definir conjuntos de términos equivalentes.

Para crear un archivo CSV de glosario, sigue estos pasos:

  1. Designa el idioma de una columna con los códigos de idioma ISO-639 o BCP-47 en la primera fila del archivo CSV.

    fr,en,

  2. Incluye pares de términos equivalentes en cada fila del archivo CSV. Separa los términos con comas. En el siguiente ejemplo se define la traducción al inglés de varias palabras francesas relacionadas con la cocina.

    fr,en,
    chèvre,goat cheese,
    crème brulée,crème brulée,
    bouillabaisse,fish stew,
    steak frites,steak with french fries,
    

  3. Define variantes de una palabra. La API Cloud Translation distingue entre mayúsculas y minúsculas, y tiene en cuenta los caracteres especiales, como las palabras acentuadas. Asegúrate de que tu glosario gestione las variaciones de una palabra definiendo explícitamente las diferentes formas de escribirla.

    fr,en,
    chevre,goat cheese,
    Chevre,Goat cheese,
    chèvre,goat cheese,
    Chèvre,Goat cheese,
    crème brulée,crème brulée,
    Crème brulée,Crème brulée,
    Crème Brulée,Crème Brulée,
    bouillabaisse,fish stew,
    Bouillabaisse,Fish stew,
    steak frites,steak with french fries,
    Steak frites,Steak with french fries,
    Steak Frites,Steak with French Fries,
    

  4. Sube el glosario a un segmento de Cloud Storage. Para este tutorial, no es necesario que suba un archivo de glosario a un segmento de Cloud Storage ni que cree un segmento de Cloud Storage. En su lugar, usa el archivo de glosario disponible públicamente que se ha creado para este tutorial para evitar que se te apliquen cargos de Cloud Storage. Envía el URI de un archivo de glosario en Cloud Storage a la API Cloud Translation para crear un recurso de glosario. El URI del archivo de glosario disponible públicamente de este tutorial es gs://cloud-samples-data/translation/bistro_glossary.csv. Para descargar el glosario, haz clic en el enlace URI de arriba, pero no lo abras en una pestaña nueva.

Crear un recurso de glosario

Para usar un glosario, debes crear un recurso de glosario con la API Cloud Translation. Para crear un recurso de glosario, envía el URI de un archivo de glosario de Cloud Storage a la API Cloud Translation.

Asegúrate de usar una clave de cuenta de servicio con permisos de "Editor de la API Cloud Translation" y de haber definido el ID de tu proyecto en el terminal.

La siguiente función crea un recurso de glosario. Con este recurso de glosario, puedes personalizar la solicitud de traducción en el siguiente paso de este tutorial.

def create_glossary(
    languages: list,
    project_id: str,
    glossary_name: str,
    glossary_uri: str,
) -> str:
    """Creates a GCP glossary resource
    Assumes you've already manually uploaded a glossary to Cloud Storage

    Args:
    languages: list of languages in the glossary
    project_id: GCP project id
    glossary_name: name you want to give this glossary resource
    glossary_uri: the uri of the glossary you uploaded to Cloud Storage

    Returns:
    name of the created or existing glossary
    """

    # Instantiates a client
    client = translate.TranslationServiceClient()

    # Designates the data center location that you want to use
    location = "us-central1"

    # Set glossary resource name
    name = client.glossary_path(project_id, location, glossary_name)

    # Set language codes
    language_codes_set = translate.Glossary.LanguageCodesSet(language_codes=languages)

    gcs_source = translate.GcsSource(input_uri=glossary_uri)

    input_config = translate.GlossaryInputConfig(gcs_source=gcs_source)

    # Set glossary resource information
    glossary = translate.Glossary(
        name=name, language_codes_set=language_codes_set, input_config=input_config
    )

    parent = f"projects/{project_id}/locations/{location}"

    # Create glossary resource
    # Handle exception for case in which a glossary
    #  with glossary_name already exists
    try:
        operation = client.create_glossary(parent=parent, glossary=glossary)
        operation.result(timeout=90)
        print("Created glossary " + glossary_name + ".")
    except AlreadyExists:
        print(
            "The glossary "
            + glossary_name
            + " already exists. No new glossary was created."
        )

    return glossary_name

Traducir con glosarios

Una vez que hayas creado un recurso de glosario, podrás usarlo para personalizar las traducciones del texto que envíes a la API Cloud Translation.

La siguiente función usa el recurso de glosario que has creado anteriormente para personalizar la traducción del texto.

def translate_text(
    text: str,
    source_language_code: str,
    target_language_code: str,
    project_id: str,
    glossary_name: str,
) -> str:
    """Translates text to a given language using a glossary

    Args:
    text: String of text to translate
    source_language_code: language of input text
    target_language_code: language of output text
    project_id: GCP project id
    glossary_name: name you gave your project's glossary
        resource when you created it

    Return:
    String of translated text
    """

    # Instantiates a client
    client = translate.TranslationServiceClient()

    # Designates the data center location that you want to use
    location = "us-central1"

    glossary = client.glossary_path(project_id, location, glossary_name)

    glossary_config = translate.TranslateTextGlossaryConfig(glossary=glossary)

    parent = f"projects/{project_id}/locations/{location}"

    result = client.translate_text(
        request={
            "parent": parent,
            "contents": [text],
            "mime_type": "text/plain",  # mime types: text/plain, text/html
            "source_language_code": source_language_code,
            "target_language_code": target_language_code,
            "glossary_config": glossary_config,
        }
    )

    # Extract translated text from API response
    return result.glossary_translations[0].translated_text

Usar Text-to-Speech con el lenguaje de marcas de síntesis de voz

Ahora que has personalizado la traducción del texto detectado en la imagen, puedes usar la API Text-to-Speech. La API Text-to-Speech puede crear audio sintético del texto traducido.

La API Text-to-Speech genera audio sintético a partir de una cadena de texto sin formato o de una cadena de texto marcada con lenguaje de marcas de síntesis de voz (SSML). SSML es un lenguaje de marcas que permite anotar texto con etiquetas SSML. Puedes usar etiquetas SSML para influir en la forma en que la API Text-to-Speech formatea la creación de voz sintética.

La siguiente función convierte una cadena de SSML en un archivo MP3 de voz sintética.

def text_to_speech(text: str, outfile: str) -> str:
    """Converts plaintext to SSML and
    generates synthetic audio from SSML

    Args:

    text: text to synthesize
    outfile: filename to use to store synthetic audio

    Returns:
    String of synthesized audio
    """

    # 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(text)

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

    # Instantiates a client
    client = texttospeech.TextToSpeechClient()

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

    # 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

    request = texttospeech.SynthesizeSpeechRequest(
        input=synthesis_input, voice=voice, audio_config=audio_config
    )

    response = client.synthesize_speech(request=request)

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

Visión de conjunto

En los pasos anteriores, has definido funciones en hybrid_glossaries.py que usan Vision, Translation y Text-to-Speech. Ahora puedes usar estas funciones para generar una voz sintética del texto traducido de la siguiente foto.

El siguiente código llama a las funciones definidas en hybrid_glossaries.py para hacer lo siguiente:

  • Crear un recurso de glosario de la API Cloud Translation

  • Usar la API Vision para detectar texto en la imagen anterior

  • Realizar una traducción de glosario de la API Cloud Translation del texto detectado

  • Generar una conversión de texto a voz de la voz sintética del texto traducido

def main() -> None:
    """This method is called when the tutorial is run in the Google Cloud
    Translation API. It creates a glossary, translates text to
    French, and speaks the translated text.

    Args:
    None

    Returns:
    None
    """
    # Photo from which to extract text
    infile = "resources/example.png"
    # Name of file that will hold synthetic speech
    outfile = "resources/example.mp3"

    # Defines the languages in the glossary
    # This list must match the languages in the glossary
    #   Here, the glossary includes French and English
    glossary_langs = ["fr", "en"]
    # Name that will be assigned to your project's glossary resource
    glossary_name = "bistro-glossary"
    # uri of .csv file uploaded to Cloud Storage
    glossary_uri = "gs://cloud-samples-data/translation/bistro_glossary.csv"

    created_glossary_name = create_glossary(
        glossary_langs, PROJECT_ID, glossary_name, glossary_uri
    )

    # photo -> detected text
    text_to_translate = pic_to_text(infile)
    # detected text -> translated text
    text_to_speak = translate_text(
        text_to_translate, "fr", "en", PROJECT_ID, created_glossary_name
    )
    # translated text -> synthetic audio
    text_to_speech(text_to_speak, outfile)

Ejecutar el código

Para ejecutar el código, introduce el siguiente comando en el terminal del directorio clonado hybrid_glossaries:

python hybrid_tutorial.py

Aparecerá el siguiente resultado:

Created glossary bistro-glossary.
Audio content written to file resources/example.mp3

Después de ejecutar hybrid_glossaries.py, ve al directorio resources desde el directorio hybrid_glossaries. Busca un archivo example.mp3 en el directorio de recursos.

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


Solución de problemas de mensajes de error

Eliminar los recursos utilizados

Usa la Google Cloud consola para eliminar tu proyecto si no lo necesitas. Si eliminas el proyecto, evitarás que se apliquen cargos adicionales a tu cuenta de facturación de Cloud por los recursos utilizados en este tutorial.

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.

Siguientes pasos

¡Enhorabuena! Acabas de usar el reconocimiento óptico de caracteres (OCR) de Vision para detectar texto en una imagen. Después, creaste un glosario de traducción y realizaste una traducción con ese glosario. Después, has usado Text-to-Speech para generar audio sintético del texto traducido.

Para ampliar tus conocimientos sobre Vision, Cloud Translation y Text-to-Speech, haz lo siguiente: