Text aus einem Foto mit Glossaren übersetzen und sprechen (Advanced)


Auf dieser Seite wird beschrieben, wie Sie Text in einem Bild erkennen, Übersetzungen personalisieren und synthetische Sprache aus Text generieren. In dieser Anleitung wird Cloud Vision verwendet, um Text in einer Bilddatei zu erkennen. Anschließend wird gezeigt, wie Sie mithilfe von Cloud Translation eine benutzerdefinierte Übersetzung des erkannten Textes bereitstellen. Schließlich wird mithilfe von Text-to-Speech ein maschinelles Diktat des übersetzten Textes bereitgestellt.

Ziele

  1. Von der Cloud Vision API erkannten Text an die Cloud Translation API übergeben

  2. Cloud Translation-Glossare erstellen und verwenden, um Cloud Translation API-Übersetzungen zu personalisieren

  3. Mit der Text-to-Speech API eine Audiodarstellung für übersetzten Text erstellen

Kosten

Für jede Google Cloud API gilt eine eigene Preisstruktur.

Preisdetails finden Sie im Preisleitfaden zu Cloud Vision, im Preisleitfaden zu Cloud Translation und im Preisleitfaden zu Text-to-Speech.

Vorbereitung

Folgende Voraussetzungen müssen erfüllt sein:

  • Sie haben ein Projekt in der Google Cloud Console mit der Vision API, der Cloud Translation API und der Text-to-Speech API aktiviert.
  • Sie haben Grundkenntnisse in der Programmierung mit Python.

Codebeispiele herunterladen

In dieser Anleitung wird Code im Verzeichnis samples/snippets/hybrid_glossaries der Cloud-Clientbibliotheken für Python verwendet.

Führen Sie die folgenden Befehle über das Terminal aus, um den Code für diese Anleitung herunterzuladen und zu öffnen.

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

Clientbibliotheken einrichten

In dieser Anleitung werden Vision-, Translation- und Text-to-Speech-Clientbibliotheken verwendet.

Führen Sie die folgenden Befehle über das Terminal aus, um die relevanten Clientbibliotheken zu installieren.

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

Berechtigungen für die Glossarerstellung einrichten

Zum Erstellen von Translation-Glossaren ist ein Dienstkontoschlüssel mit den Cloud Translation API-Bearbeiter-Berechtigungen erforderlich.

So richten Sie einen Dienstkontoschlüssel mit den Cloud Translation API-Bearbeiterberechtigungen ein:

  1. Erstellen Sie ein Dienstkonto:

    1. Rufen Sie in der Google Cloud Console die Seite Dienstkonten auf.

      Zur Seite „Dienstkonten“

    2. Wählen Sie Ihr Projekt aus.

    3. Klicken Sie auf Dienstkonto erstellen.

    4. Geben Sie im Feld Dienstkontoname einen Namen ein. Die Google Cloud Console füllt das Feld Dienstkonto-ID anhand dieses Namens aus.

    5. Optional: Im Feld Beschreibung des Dienstkontos können Sie eine entsprechende Beschreibung eingeben.

    6. Klicken Sie auf Erstellen und fortfahren.

    7. Klicken Sie auf das Feld Rolle auswählen und wählen Sie Cloud Translation > Cloud Translation API-Bearbeiter aus.

    8. Klicken Sie auf Fertig, um das Erstellen des Dienstkontos abzuschließen.

      Schließen Sie das Browserfenster nicht. Sie verwenden es in der nächsten Aufgabe.

  2. Laden Sie einen JSON-Schlüssel für das gerade erstellte Dienstkonto herunter:

    1. Klicken Sie in der Google Cloud Console auf die E-Mail-Adresse des von Ihnen erstellten Dienstkontos.
    2. Klicken Sie auf Schlüssel.
    3. Klicken Sie auf Schlüssel hinzufügen > Neuen Schlüssel erstellen.
    4. Klicken Sie auf Erstellen. Daraufhin wird eine JSON-Schlüsseldatei auf Ihren Computer heruntergeladen.

      Bewahren Sie die Schlüsseldatei sicher auf, da sie zur Authentifizierung als Ihr Dienstkonto verwendet werden kann. Sie können diese Datei beliebig verschieben und umbenennen.

    5. Klicken Sie auf Schließen.

  3. Legen Sie im Ordner hybrid_glossaries des Terminals die Variable GOOGLE_APPLICATION_CREDENTIALS mit dem folgenden Befehl fest. Ersetzen Sie path_to_key durch den Pfad zur heruntergeladenen JSON-Datei, die den neuen Dienstkontoschlüssel enthält.

    Linux oder macOS

    export GOOGLE_APPLICATION_CREDENTIALS=path_to_key

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path_to_key

Bibliotheken importieren

In dieser Anleitung werden die folgenden Systeme und Clientbibliotheken importiert.

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

Projekt-ID festlegen

Sie müssen ein Google Cloud-Projekt für jede Anfrage mit einer Google Cloud API verknüpfen. Legen Sie im Terminal die Umgebungsvariable GOOGLE_CLOUD_PROJECT fest, um Ihr Google Cloud-Projekt zu bestimmen.

Ersetzen Sie im folgenden Befehl PROJECT_NUMBER_OR_ID durch Ihre Google Cloud-Projektnummer oder -ID. Führen Sie den folgenden Befehl über das Terminal aus.

Linux oder macOS

export GOOGLE_CLOUD_PROJECT=PROJECT_NUMBER_OR_ID

Windows

set GOOGLE_CLOUD_PROJECT=PROJECT_NUMBER_OR_ID

In dieser Anleitung wird die folgende globale Projekt-ID-Variable verwendet.

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

Vision zum Erkennen von Text in einem Bild verwenden

Verwenden Sie die Vision API, um Text in einem Bild zu erkennen und daraus zu extrahieren. Die Vision API verwendet Optische Zeichenerkennung (Optical Character Recognition, OCR) zur Unterstützung von zwei Features zur Texterkennung: Erkennung von dichtem Text oder DOCUMENT_TEXT_DETECTION und Erkennung von dünn besetztem Text oder TEXT_DETECTION.

Der folgende Code zeigt die Verwendung des Vision API-Features DOCUMENT_TEXT_DETECTION zur Erkennung von Text mit hoher Dichte in einem Foto.

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

Translation mit Glossaren verwenden

Nachdem Sie Text aus einem Bild extrahiert haben, verwenden Sie Translation-Glossare, um die Übersetzung des extrahierten Textes zu personalisieren. Glossare enthalten vordefinierte Übersetzungen, die die Übersetzungen der festgelegten Begriffe in der Cloud Translation API überschreiben.

Anwendungsfälle für Glossare:

  • Produktnamen: "Google Home" muss beispielsweise mit "Google Home" übersetzt werden.

  • Mehrdeutige Wörter: Das Wort "Schnecke" kann beispielsweise eine Backware oder ein Tier sein. Wenn Sie wissen, dass Sie Wörter zum Thema Gebäck übersetzen, können Sie ein Glossar in der Cloud Translation API verwenden, damit die richtige Übersetzung für Backwaren und nicht die für das Tier verwendet wird.

  • Entlehnte Wörter: Beispielsweise wird das französische Wort "Bouillabaisse" im Deutschen mit "Bouillabaisse" übersetzt; es wurde aus dem Französischen entlehnt. Ein Deutscher, dem der kulturelle Kontext Frankreichs fehlt, weiß vielleicht nicht, dass Bouillabaisse ein Fischeintopf ist. Glossare können Übersetzungen überschreiben, sodass das französische Wort "Bouillabaisse" im Deutschen mit "Fischeintopf" übersetzt wird.

Glossardatei erstellen

Die Cloud Translation API akzeptiert Glossardateien der Formate TSV, CSV und TMX. In dieser Anleitung wird eine CSV-Datei verwendet, die in Cloud Storage hochgeladen wurde, um Sätze äquivalenter Begriffe zu definieren.

So erstellen Sie eine Glossardatei im CSV-Format:

  1. Legen Sie die Sprache einer Spalte fest. Verwenden Sie dafür in der ersten Zeile der CSV-Datei den Sprachcode gemäß ISO-639 oder BCP-47.

    fr,en,

  2. Geben Sie Paare äquivalenter Begriffe in jeder Zeile der CSV-Datei an. Trennen Sie Begriffe durch Kommas. Im folgenden Beispiel wird die englische Übersetzung für mehrere kulinarische französische Wörter definiert.

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

  3. Definieren Sie Varianten eines Worts. Bei der Cloud Translation API wird zwischen Groß- und Kleinschreibung unterschieden. Sonderzeichen wie akzentuierte Wörter werden berücksichtigt. Achten Sie darauf, dass Ihr Glossar Varianten eines Worts berücksichtigt. Dazu können Sie verschiedene Schreibweisen des Worts explizit definieren.

    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. Laden Sie das Glossar in einen Cloud Storage-Bucket hoch. Für die Zwecke dieser Anleitung ist es nicht erforderlich, eine Glossardatei in einen Cloud Storage-Bucket hochzuladen oder einen Cloud Storage-Bucket zu erstellen. Verwenden Sie stattdessen die öffentlich verfügbare Glossardatei, die für diese Anleitung erstellt wurde, um Cloud Storage-Kosten zu vermeiden. Senden Sie den URI einer Glossardatei in Cloud Storage an die Cloud Translation API, um eine Glossarressource zu erstellen. Der URI der öffentlich verfügbaren Glossardatei für diese Anleitung ist gs://cloud-samples-data/translation/bistro_glossary.csv. Klicken Sie zum Herunterladen des Glossars auf den obigen URI-Link, aber öffnen Sie ihn nicht in einem neuen Tab.

Glossarressource erstellen

Wenn Sie ein Glossar verwenden möchten, müssen Sie mit der Cloud Translation API eine Glossarressource erstellen. Wenn Sie eine Glossarressource erstellen möchten, senden Sie den URI einer Glossardatei in Cloud Storage an die Cloud Translation API.

Achten Sie darauf, einen Dienstkontoschlüssel mit den Cloud Translation API-Bearbeiter-Berechtigungen zu verwenden und Ihre Projekt-ID über das Terminal festzulegen.

Mit dem folgenden Feature wird eine Glossarressource erstellt. Mit dieser Glossarressource können Sie die Übersetzungsanfrage im nächsten Schritt dieser Anleitung personalisieren.

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

Mit Glossaren übersetzen

Nachdem Sie eine Glossarressource erstellt haben, können Sie diese Glossarressource verwenden, um Übersetzungen von Text zu personalisieren, den Sie an die Cloud Translation API senden.

Das folgende Feature verwendet die zuvor erstellte Glossarressource, um die Übersetzung von Text zu personalisieren.

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

Text-to-Speech mit Speech Synthesis Markup Language (SSML) verwenden

Nachdem Sie nun eine Übersetzung von in einem Bild erkannten Text personalisiert haben, können Sie die Text-to-Speech API verwenden. Sie kann synthetische Audiodaten des übersetzten Textes erstellen.

Die Text-to-Speech API generiert synthetisches Audio entweder aus einem String aus Nur-Text-Dateien oder aus einem String mit Speech Synthesis Markup Language (SSML). SSML ist eine Auszeichnungssprache, die das Annotieren von Text mit SSML-Tags unterstützt. Mit SSML-Tags können Sie beeinflussen, wie die Text-to-Speech API synthetische Spracherstellung formatiert.

Mit dem folgenden Feature wird ein SSML-String in eine MP3-Datei mit synthetischer Sprache umgewandelt.

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)

Zusammenfassung

In den vorherigen Schritten haben Sie Features in hybrid_glossaries.py definiert, die Vision, Translation und Text-to-Speech verwenden. Nun können Sie sie verwenden, um synthetische Sprache des übersetzten Textes aus dem folgenden Foto zu generieren.

Mit dem folgenden Code werden die in hybrid_glossaries.py definierten Features aufgerufen, um folgende Aufgaben auszuführen:

  • Eine Glossarressource für die Cloud Translation API erstellen

  • Die Vision API verwenden, um Text im obigen Bild zu erkennen

  • Eine Übersetzung des erkannten Textes über das Cloud Translation API-Glossar ausführen

  • Synthetische Text-to-Speech-Sprache des übersetzten Textes erzeugen

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)

Code ausführen

Geben Sie den folgenden Befehl im geklonten Verzeichnis "hybrid_glossaries" im Terminal an, um den Code auszuführen:

python hybrid_tutorial.py

Die Ausgabe sieht so aus:

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

Wechseln Sie nach der Ausführung von hybrid_glossaries.py aus dem Verzeichnis hybrid_glossaries zum Verzeichnis resources. Suchen Sie im Verzeichnis "resources" nach der Datei example.mp3.

Hören Sie sich den folgenden Audioclip an, um zu überprüfen, ob die Datei example.mp3 gleich klingt.


Fehlermeldungen beheben

Bereinigen

Löschen Sie das Projekt mit der Google Cloud Console, wenn Sie es nicht benötigen. Dadurch werden zusätzliche Kosten für die in dieser Anleitung verwendeten Ressourcen für Ihr Cloud-Rechnungskonto vermieden.

Projekt löschen

  1. Öffnen Sie in der Google Cloud Console die Seite "Projekte".
  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Herunterfahren, um das Projekt zu löschen.

Nächste Schritte

Glückwunsch! Sie haben gerade Vision OCR verwendet, um Text in einem Bild zu erkennen. Dann haben Sie ein Translation-Glossar erstellt und eine Übersetzung mit diesem Glossar durchgeführt. Anschließend haben Sie Text-to-Speech verwendet, um synthetisches Audio des übersetzten Textes zu generieren.

So erweitern Sie Ihr Wissen über Vision, Cloud Translation und Text-to-Speech: