Traduzione e sintesi vocale di testo da una foto con i glossari (opzione avanzata)


Questa pagina mostra come rilevare il testo in un'immagine, come personalizzare le traduzioni e come generare un discorso sintetico a partire dal testo. Questo tutorial utilizza Cloud Vision per rilevare il testo in un file immagine. Poi, questo tutorial mostra come utilizzare Cloud Translation per fornire una traduzione personalizzata del testo rilevato. Infine, questo tutorial utilizza Text-to-Speech per fornire la dettatura automatica del testo tradotto.

Obiettivi

  1. Passa il testo riconosciuto dall'API Cloud Vision all'API Cloud Translation.

  2. Crea e utilizza i glossari di Cloud Translation per personalizzare le traduzioni dell'API Cloud Translation.

  3. Creare una rappresentazione audio del testo tradotto utilizzando l'API Text-to-Speech.

Costi

Ogni API Google Cloud utilizza una struttura di prezzi separata.

Per i dettagli sui prezzi, consulta la guida ai prezzi di Cloud Vision, la guida ai prezzi di Cloud Translation e la guida ai prezzi per la sintesi vocale.

Prima di iniziare

Assicurati di avere:

Download degli esempi di codice

Questo tutorial utilizza il codice nella directory samples/snippets/hybrid_glossaries delle librerie client di Cloud per Python.

Per scaricare e accedere al codice di questo tutorial, esegui questi comandi dal terminale.

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

Configurazione delle librerie client

Questo tutorial utilizza le librerie client di Vision, Translation e Text-to-Speech.

Per installare le librerie client pertinenti, esegui questi comandi dal terminale.

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

Configurazione delle autorizzazioni per la creazione del glossario

La creazione di glossari di Translation richiede l'utilizzo di una chiave dell'account di servizio con le autorizzazioni "Editor API Cloud Translation".

Per configurare una chiave dell'account di servizio con le autorizzazioni Editor API Cloud Translation, segui questi passaggi:

  1. Crea un account di servizio:

    1. Nella console Google Cloud, vai alla pagina Account di servizio.

      Vai ad Account di servizio

    2. Seleziona il progetto.

    3. Fai clic su Crea account di servizio.

    4. Inserisci un nome nel campo Nome account di servizio. La console Google Cloud compila il campo ID account di servizio in base a questo nome.

    5. (Facoltativo) Nel campo Descrizione account di servizio, inserisci una descrizione per l'account di servizio.

    6. Fai clic su Crea e continua.

    7. Fai clic sul campo Seleziona un ruolo e seleziona Cloud Translation > Editor API Cloud Translation

    8. Fai clic su Fine per completare la creazione dell'account di servizio.

      Non chiudere la finestra del browser. Lo utilizzerai nel passaggio successivo.

  2. Scarica una chiave JSON per l'account di servizio che hai appena creato:

    1. Nella console Google Cloud, fai clic sull'indirizzo email dell'account di servizio che hai creato.
    2. Fai clic su Chiavi.
    3. Fai clic su Aggiungi chiave, quindi su Crea nuova chiave.
    4. Fai clic su Crea. Sul computer viene scaricato un file di chiave JSON.

      Assicurati di archiviare il file della chiave in modo sicuro perché può essere utilizzato per l'autenticazione come account di servizio. Puoi spostare e rinominare il file come preferisci.

    5. Fai clic su Chiudi.

  3. Dalla cartella hybrid_glossaries nel terminale, imposta la variabile GOOGLE_APPLICATION_CREDENTIALS utilizzando il seguente comando. Sostituisci path_to_key con il percorso del file JSON scaricato contenente la nuova chiave dell'account di servizio.

    Linux o macOS

    export GOOGLE_APPLICATION_CREDENTIALS=path_to_key

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path_to_key

Importazione delle librerie

Questo tutorial utilizza le seguenti importazioni di sistema e delle librerie client.

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

Impostazione dell'ID progetto

Devi associare un progetto Google Cloud a ogni richiesta a un'API Google Cloud. Specifica il tuo progetto Google Cloud impostando la variabile di ambiente GOOGLE_CLOUD_PROJECT dal terminale.

Nel comando seguente, sostituisci PROJECT_NUMBER_OR_ID con il numero o l'ID del tuo progetto Google Cloud. Esegui questo comando dal terminale.

Linux o macOS

export GOOGLE_CLOUD_PROJECT=PROJECT_NUMBER_OR_ID

Windows

set GOOGLE_CLOUD_PROJECT=PROJECT_NUMBER_OR_ID

Questo tutorial utilizza la seguente variabile ID progetto globale.

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

Utilizzo di Vision per rilevare il testo da un'immagine

Utilizza l'API Vision per rilevare ed estrarre il testo da un'immagine. L'API Vision utilizza il riconoscimento ottico dei caratteri (OCR) per supportare due funzionalità di rilevamento del testo: il rilevamento di testo denso o DOCUMENT_TEXT_DETECTION e il rilevamento di testo sparso oppure TEXT_DETECTION.

Il codice seguente mostra come utilizzare la funzionalità DOCUMENT_TEXT_DETECTION dell'API Vision per rilevare il testo in una foto con testo ad alta densità.

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

Utilizzo di Translation con i glossari

Dopo aver estratto il testo da un'immagine, utilizza Glossari di traduzione per personalizzare la traduzione del testo estratto. I glossari forniscono traduzioni predefinite che sostituiscono le traduzioni dei termini designati dell'API Cloud Translation.

I casi d'uso del glossario includono:

  • Nomi di prodotti:ad esempio, "Google Home" deve essere tradotto in "Google Home".

  • Parole ambigue: ad esempio, la parola "pipistrello" può significare un'attrezzatura sportiva o un animale. Se sai che traduci parole sportive, puoi utilizzare un glossario per fornire alla API Cloud Translation la traduzione sportiva di "bat" e non la traduzione animale.

  • Parole presi in prestito: ad esempio, "bouillabaisse" in francese si traduce in "bouillabaisse" in inglese; la lingua inglese ha preso in prestito la parola "bouillabaisse" dalla lingua francese. Una persona anglosassone priva di contesto culturale francese potrebbe non sapere che la bouillabaisse è uno stufato di pesce francese. I glossari possono sostituire una traduzione, in modo che "bouillabaisse" in francese si traduca in "stufato di pesce" in inglese.

Creazione di un file di glossario

L'API Cloud Translation accetta file di glossario TSV, CSV o TMX. Questo tutorial utilizza un file CSV caricato in Cloud Storage per definire gli insiemi di termini equivalenti.

Per creare un file CSV di glossario:

  1. Definisci la lingua di una colonna utilizzando i codici lingua ISO-639 o BCP-47 nella prima riga del file CSV.

    fr,en,

  2. Elenca le coppie di termini equivalenti in ogni riga del file CSV. Separa i termini con virgole. L'esempio seguente definisce la traduzione in inglese di diverse parole culinarie in francese.

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

  3. Definire le varianti di una parola. L'API Cloud Translation è sensibile alle maiuscole e ai caratteri speciali come le parole accentate. Assicurati che il glossario gestisca le varianti di una parola definendo esplicitamente diverse ortografie della parola.

    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. Carica il glossario in un bucket Cloud Storage. Ai fini di questo tutorial, non è necessario caricare un file di glossario in un bucket Cloud Storage né creare un bucket Cloud Storage. Utilizza invece il file di glossario disponibile pubblicamente creato per questo tutorial per evitare costi di Cloud Storage. Invia l'URI di un file di glossario in Cloud Storage all'API Cloud Translation per creare una risorsa di glossario. L'URI del file del glossario disponibile pubblicamente per questo tutorial è gs://cloud-samples-data/translation/bistro_glossary.csv. Per scaricare il glossario, fai clic sul link dell'URI sopra riportato, ma non aprirlo in una nuova scheda.

Creazione di una risorsa di glossario

Per utilizzare un glossario, devi creare una risorsa di glossario con l'API Cloud Translation. Per creare una risorsa di glossario, invia l'URI di un file di glossario in Cloud Storage all'API Cloud Translation.

Assicurati di utilizzare una chiave dell'account di servizio con le autorizzazioni "Editor API Cloud Translation" e di aver impostato l'ID progetto dal terminale.

La seguente funzione crea una risorsa di glossario. Con questa risorsa del glossario, puoi personalizzare la richiesta di traduzione nel passaggio successivo di questo 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

Traduzione con i glossari

Dopo aver creato una risorsa di glossario, puoi utilizzarla per personalizzare le traduzioni del testo da inviare all'API Cloud Translation.

La seguente funzione utilizza la risorsa di glossario creata in precedenza per personalizzare la traduzione del testo.

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

Utilizzo di Text-to-Speech con il linguaggio di markup per la sintesi vocale

Ora che hai personalizzato una traduzione del testo rilevato dalle immagini, puoi utilizzare l'API Text-to-Speech. L'API Text-to-Speech può creare audio sintetico del testo tradotto.

L'API Text-to-Speech genera audio sintetico da una stringa di testo normale o da una stringa di testo sottoposta a markup con Speech Synthesis Markup Language (SSML). SSML è un linguaggio di markup che supporta l'annotazione di testo con tag SSML. Puoi utilizzare i tag SSML per influenzare il modo in cui l'API Text-to-Speech formatta la creazione di contenuti vocali sintetici.

La seguente funzione converte una stringa di SSML in un file MP3 di sintesi vocale.

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)

Riepilogo

Nei passaggi precedenti, hai definito le funzioni in hybrid_glossaries.py che utilizzano Vision, Translation e Text-to-Speech. Ora sei pronto a usare queste funzioni per generare un discorso sintetico del testo tradotto dalla foto seguente.

Il codice seguente chiama le funzioni definite in hybrid_glossaries.py a:

  • crea una risorsa glossario dell'API Cloud Translation

  • usa l'API Vision per rilevare il testo nell'immagine sopra

  • eseguire una traduzione del glossario dell'API Cloud Translation del testo rilevato

  • generare sintesi Text-to-Speech del testo tradotto

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)

Esecuzione del codice

Per eseguire il codice, inserisci questo comando nel terminale nella directory hybrid_glossaries clonato:

python hybrid_tutorial.py

Viene visualizzato il seguente output:

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

Dopo aver eseguito hybrid_glossaries.py, accedi alla directory resources dalla directory hybrid_glossaries. Verifica se nella directory delle risorse è presente un file example.mp3.

Ascolta il seguente clip audio per verificare che il file example.mp3 abbia lo stesso suono.


Risoluzione dei messaggi di errore

Eseguire la pulizia

Utilizza la console Google Cloud per eliminare il progetto se non ti serve. L'eliminazione del progetto evita che al tuo account di fatturazione Cloud vengano addebitati costi aggiuntivi per le risorse utilizzate in questo tutorial.

Eliminazione del progetto

  1. Nella console Google Cloud, vai alla pagina Progetti.
  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare e fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi

Complimenti! Hai appena utilizzato l'OCR di Vision per rilevare il testo in un'immagine. Poi, hai creato un glossario di Translation ed eseguito una traduzione con quel glossario. In seguito, hai utilizzato Text-to-Speech per generare audio sintetico del testo tradotto.

Per sviluppare le tue conoscenze di Vision, Cloud Translation e Text-to-Speech: