Menerjemahkan dan mengucapkan teks dari foto dengan glosarium (Lanjutan)


Halaman ini menunjukkan cara mendeteksi teks dalam gambar, cara mempersonalisasi terjemahan, dan cara menghasilkan ucapan sintetis dari teks. Tutorial ini menggunakan Cloud Vision untuk mendeteksi teks dalam file gambar. Kemudian, tutorial ini menunjukkan cara menggunakan Cloud Translation untuk memberikan terjemahan kustom dari teks yang terdeteksi. Terakhir, tutorial ini menggunakan Text-to-Speech untuk menyediakan dikte mesin untuk teks terjemahan.

Tujuan

  1. Teruskan teks yang dikenali oleh Cloud Vision API ke Cloud Translation API.

  2. Buat dan gunakan glosarium Cloud Translation untuk mempersonalisasi terjemahan Cloud Translation API.

  3. Buat representasi audio dari teks terjemahan menggunakan Text-to-Speech API.

Biaya

Setiap Google Cloud API menggunakan struktur harga yang terpisah.

Untuk mengetahui detail harga, baca panduan harga Cloud Vision, panduan harga Cloud Translation, dan panduan harga Text-to-Speech

Sebelum memulai

Pastikan Anda memiliki:

Mendownload contoh kode

Tutorial ini menggunakan kode dalam direktori samples/snippets/hybrid_glossaries Library Klien Cloud untuk Python.

Untuk mendownload dan membuka kode untuk tutorial ini, jalankan perintah berikut dari terminal.

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

Menyiapkan library klien

Tutorial ini menggunakan library klien Vision, Translation, dan Text-to-Speech.

Untuk menginstal library klien yang relevan, jalankan perintah berikut dari terminal.

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

Menyiapkan izin untuk pembuatan glosarium

Pembuatan glosarium Translation memerlukan penggunaan kunci akun layanan dengan izin "Cloud Translation API Editor".

Untuk menyiapkan kunci akun layanan dengan izin Cloud Translation API Editor, lakukan hal berikut:

  1. Membuat akun layanan

    1. Di konsol Google Cloud, buka halaman Akun Layanan.

      Buka Akun Layanan

    2. Pilih project Anda

    3. Klik Buat akun layanan.

    4. Di kolom Nama akun layanan, masukkan nama. Konsol Google Cloud akan mengisi kolom ID akun layanan berdasarkan nama ini.

    5. Opsional: Di kolom Deskripsi akun layanan, masukkan deskripsi akun layanan.

    6. Klik Buat dan lanjutkan.

    7. Klik kolom Pilih peran dan pilih Cloud Translation > Cloud Translation API Editor

    8. Klik Selesai untuk menyelesaikan pembuatan akun layanan.

      Jangan tutup jendela browser Anda. Anda akan menggunakannya pada langkah berikutnya.

  2. Download kunci JSON untuk akun layanan yang baru saja Anda buat:

    1. Di konsol Google Cloud, klik alamat email untuk akun layanan yang telah dibuat.
    2. Klik Kunci.
    3. Klik Tambahkan kunci, lalu klik Buat kunci baru.
    4. Klik Buat. File kunci JSON akan didownload ke komputer Anda.

      Pastikan Anda menyimpan file kunci dengan aman karena file tersebut dapat digunakan untuk melakukan autentikasi sebagai akun layanan Anda. Anda dapat memindahkan dan mengganti nama file ini sesuai keinginan Anda.

    5. Klik Tutup.

  3. Dari folder hybrid_glossaries di terminal, tetapkan variabel GOOGLE_APPLICATION_CREDENTIALS menggunakan perintah berikut. Ganti path_to_key dengan jalur ke file JSON yang didownload yang berisi kunci akun layanan baru Anda.

    Linux atau macOS

    export GOOGLE_APPLICATION_CREDENTIALS=path_to_key

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path_to_key

Mengimpor library

Tutorial ini menggunakan impor sistem dan impor library klien berikut.

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

Menetapkan project ID

Anda harus mengaitkan project Google Cloud dengan setiap permintaan ke Google Cloud API. Tentukan project Google Cloud dengan menetapkan variabel lingkungan GOOGLE_CLOUD_PROJECT dari terminal.

Di perintah berikut, ganti PROJECT_NUMBER_OR_ID dengan nomor atau ID project Google Cloud Anda. Jalankan perintah berikut dari terminal.

Linux atau macOS

export GOOGLE_CLOUD_PROJECT=PROJECT_NUMBER_OR_ID

Windows

set GOOGLE_CLOUD_PROJECT=PROJECT_NUMBER_OR_ID

Tutorial ini menggunakan variabel ID project global berikut.

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

Menggunakan Vision untuk mendeteksi teks dari gambar

Menggunakan Vision API untuk mendeteksi dan mengekstrak teks dari gambar. Vision API menggunakanPengenalan Karakter Optik (OCR) untuk mendukung dua fitur deteksi teks: deteksi teks padat, atauDOCUMENT_TEXT_DETECTION , dan deteksi teks renggang, atau TEXT_DETECTION.

Kode berikut menunjukkan cara menggunakan fitur DOCUMENT_TEXT_DETECTION Vision API untuk mendeteksi teks dalam foto dengan teks padat.

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

Menggunakan Terjemahan dengan glosarium

Setelah mengekstrak teks dari gambar, gunakan Glosarium terjemahan untuk mempersonalisasi terjemahan teks yang diekstrak. Glosarium menyediakan terjemahan standar yang akan menggantikan terjemahan Cloud Translation API untuk persyaratan yang ditentukan.

Kasus penggunaan glosarium meliputi:

  • Nama produk: Misalnya, 'Google Home' harus diterjemahkan ke 'Google Home'.

  • Kata ambigu: Misalnya, kata 'bat' dapat berarti peralatan olahraga atau hewan. Jika Anda menerjemahkan kata-kata tentang olahraga, sebaiknya gunakan glosarium untuk memasukkan terjemahan olahraga 'bat' ke Cloud Translation API, bukan terjemahan hewan.

  • Kata-kata pinjaman: Misalnya, 'bouillabaisse' dalam bahasa Prancis diterjemahkan menjadi 'bouillabaisse' dalam bahasa Inggris; bahasa Inggris meminjam kata 'bouillabaisse' dari bahasa Prancis. Seorang penutur bahasa Inggris yang kurang memiliki konteks budaya Prancis mungkin tidak tahu bahwa bouillabaisse adalah hidangan sup ikan Prancis. Daftar istilah dapat mengganti terjemahan, sehingga 'bouillabaisse' dalam bahasa Prancis diterjemahkan menjadi 'fish stew' dalam bahasa Inggris.

Membuat file glosarium

Cloud Translation API menerima file glosarium TSV, CSV, atau TMX. Tutorial ini menggunakan file CSV yang diupload ke Cloud Storage untuk menentukan kumpulan istilah yang setara.

Untuk membuat file CSV glosarium:

  1. Tentukan bahasa kolom menggunakan kode bahasa ISO-639 atau BCP-47 di baris pertama file CSV.

    fr,en,

  2. Cantumkan pasangan istilah yang setara di setiap baris file CSV. Pisahkan istilah dengan tanda koma. Contoh berikut mendefinisikan terjemahan bahasa Inggris untuk beberapa kata kuliner Prancis.

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

  3. Menentukan varian kata. Cloud Translation API peka huruf besar/kecil dan peka terhadap karakter khusus seperti kata beraksen. Pastikan glosarium Anda menangani variasi sebuah kata dengan menentukan ejaan yang berbeda secara eksplisit.

    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. Upload glosarium ke bucket Cloud Storage. Untuk keperluan tutorial ini, Anda tidak perlu mengupload file glosarium ke bucket Cloud Storage atau membuat bucket Cloud Storage. Sebagai gantinya, gunakan file glosarium yang tersedia secara publik yang dibuat untuk tutorial ini untuk menghindari timbulnya biaya Cloud Storage. Kirim URI file glosarium di Cloud Storage ke Cloud Translation API untuk membuat referensi glosarium. URI file glosarium yang tersedia secara publik untuk tutorial ini adalah gs://cloud-samples-data/translation/bistro_glossary.csv. Untuk mendownload glosarium, klik link URI di atas, tetapi jangan buka di tab baru.

Membuat referensi glosarium

Untuk menggunakan glosarium, Anda harus membuat referensi glosarium dengan Cloud Translation API. Untuk membuat referensi glosarium, kirim URI file glosarium di Cloud Storage ke Cloud Translation API.

Pastikan Anda menggunakan kunci akun layanan dengan izin "Cloud Translation API Editor" dan pastikan Anda telah menetapkan project ID dari terminal ini.

Fungsi berikut membuat referensi glosarium. Dengan referensi glosarium ini, Anda dapat mempersonalisasi permintaan terjemahan pada langkah berikutnya dalam tutorial ini.

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

Menerjemahkan dengan glosarium

Setelah membuat referensi glosarium, Anda dapat menggunakan referensi glosarium untuk mempersonalisasi terjemahan teks yang Anda kirim ke Cloud Translation API.

Fungsi berikut menggunakan referensi glosarium yang telah dibuat sebelumnya untuk mempersonalisasi terjemahan teks.

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

Menggunakan Text-to-Speech dengan Bahasa Markup Sintesis Ucapan

Setelah mempersonalisasi terjemahan teks yang terdeteksi gambar, Anda siap menggunakan Text-to-Speech API. Text-to-Speech API dapat membuat audio sintetis untuk teks terjemahan Anda.

Text-to-Speech API menghasilkan audio sintetis dari string teks biasa atau string teks yang diberi markup dengan Bahasa Markup Sintesis Ucapan (SSML). SSML adalah bahasa markup yang mendukung anotasi teks dengan tag SSML. Anda dapat menggunakan tag SSML untuk memengaruhi cara Text-to-Speech API memformat pembuatan ucapan sintetis.

Fungsi berikut mengubah string SSML menjadi file MP3 ucapan sintetik.

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)

Menggabungkan semuanya

Pada langkah sebelumnya, Anda telah menentukan fungsi di hybrid_glossaries.py yang menggunakan Vision, Translation, dan Text-to-Speech. Sekarang, Anda siap menggunakan fungsi ini untuk menghasilkan ucapan sintetis teks terjemahan dari foto berikut.

Kode berikut memanggil fungsi yang ditentukan di hybrid_glossaries.py untuk:

  • membuat referensi glosarium Cloud Translation API

  • gunakan Vision API untuk mendeteksi teks dalam gambar di atas

  • melakukan terjemahan glosarium Cloud Translation API dari teks yang terdeteksi

  • membuat ucapan sintetik Text-to-Speech dari teks yang diterjemahkan

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)

Menjalankan kode

Untuk menjalankan kode, masukkan perintah berikut di terminal di direktori hybrid_glossaries yang di-clone:

python hybrid_tutorial.py

Output berikut akan muncul:

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

Setelah menjalankan hybrid_glossaries.py, buka direktori resources dari direktori hybrid_glossaries. Periksa direktori resource untuk menemukan file example.mp3.

Dengarkan klip audio berikut untuk memastikan file example.mp3 Anda terdengar sama.


Pemecahan masalah pesan error

  • 403 IAM permission 'cloudtranslate.glossaries.create' denied.

    Penggunaan kunci akun layanan tanpa izin "Cloud Translation API Editor" akan menyebabkan pengecualian ini.

  • KeyError: 'GOOGLE_CLOUD_PROJECT'

    Tidak menetapkan variabel GOOGLE_CLOUD_PROJECT akan menyebabkan error ini.

  • 400 Invalid resource name project id

    Penggunaan nama glosarium yang berisi karakter selain huruf kecil, angka, titik, titik dua, atau tanda hubung, atau menggunakan kunci akun layanan tanpa izin "Cloud Translation API Editor" akan menimbulkan pengecualian ini.

  • File filename was not found.

    Menetapkan variabel GOOGLE_APPLICATION_CREDENTIALS ke jalur file yang tidak valid akan memunculkan pengecualian ini.

  • Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application

    Tidak menetapkan variabel GOOGLE_APPLICATION_CREDENTIALS akan menyebabkan pengecualian ini.

  • Forbidden: 403 POST API has not been used or is disabled

    Memanggil Cloud Translation API, Cloud Vision API, atau Text-to-Speech API tanpa mengaktifkan API-nya akan memicu peringatan ini.

  • AttributeError: 'module' object has no attribute 'escape'

    Python 2.7.10 atau versi yang lebih lama tidak kompatibel dengan HTML. Untuk memperbaiki error ini, gunakan lingkungan virtual Python. Lingkungan virtual akan menggunakan versi terbaru Python.

  • UnicodeEncodeError

    Python 2.7.10 atau versi yang lebih lama tidak kompatibel dengan HTML. Untuk memperbaiki error ini, gunakan lingkungan virtual Python. Lingkungan virtual akan menggunakan versi terbaru Python.

Pembersihan

Gunakan konsol Google Cloud untuk menghapus project jika Anda tidak membutuhkannya. Jika project Anda dihapus, Anda dapat mencegah timbulnya biaya tambahan pada akun Penagihan Cloud untuk resource yang digunakan dalam tutorial ini.

Menghapus project Anda

  1. Di konsol Google Cloud, buka halaman Project.
  2. Dalam daftar project, pilih project yang ingin dihapus, lalu klik Hapus.
  3. Di kotak dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah berikutnya

Selamat! Anda baru saja menggunakan Vision OCR untuk mendeteksi teks dalam gambar. Kemudian, Anda membuat glosarium Terjemahan dan menerjemahkan dengan glosarium tersebut. Setelah itu, Anda menggunakan Text-to-Speech untuk menghasilkan audio sintetis dari teks terjemahan.

Untuk membangun pengetahuan Anda tentang Vision, Cloud Translation, dan Text-to-Speech: