Mengucapkan alamat dengan SSML

Tutorial ini menunjukkan cara menggunakan Bahasa Markup Sintesis Ucapan (SSML)untuk mengucapkan file teks alamat. Anda dapat me-markup string teks dengan tag SSML untuk mempersonalisasi audio sintetis dari Text-to-Speech.

Teks biasa Rendering teks biasa dengan 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>

Tujuan

Kirim permintaan ucapan sintetis ke Text-to-Speech menggunakan SSML dan library klien Text-to-Speech.

Biaya

Lihat halaman harga Text-to-Speech untuk mengetahui informasi biaya.

Sebelum memulai

Mendownload contoh kode

Untuk mendownload contoh kode, clone sampel GitHub Google Cloud untuk bahasa pemrograman yang ingin Anda gunakan.

Java

Tutorial ini menggunakan kode dalam direktori texttospeech/cloud-client/src/main/java/com/example/texttospeech/ repositori sampel Java Google Cloud Platform.

Untuk mendownload dan membuka kode untuk tutorial ini, jalankan perintah berikut dari 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

Tutorial ini menggunakan kode dalam direktori texttospeech repositori contoh Node.js Google Cloud Platform.

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

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

Python

Tutorial ini menggunakan kode di direktori texttospeech/snippets pada repositori contoh Python Google Cloud Platform.

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

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

Menginstal library klien

Tutorial ini menggunakan library klien Text-to-Speech.

Java

Tutorial ini menggunakan dependensi berikut.

<!--  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

Dari terminal, jalankan perintah berikut.

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

Python

Dari terminal, jalankan perintah berikut.

pip install --upgrade google-cloud-texttospeech

Menyiapkan kredensial Google Cloud Platform

Berikan kredensial autentikasi ke kode aplikasi Anda dengan menetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS. Variabel ini hanya berlaku untuk sesi shell Anda saat ini. Jika Anda ingin variabel diterapkan ke sesi shell berikutnya, tetapkan variabel dalam file startup shell, misalnya dalam file ~/.bashrc atau ~/.profile.

Linux atau macOS

export GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

Ganti KEY_PATH dengan jalur file JSON yang berisi kredensial Anda.

Contoh:

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

Windows

Untuk PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

Ganti KEY_PATH dengan jalur file JSON yang berisi kredensial Anda.

Contoh:

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

Untuk command prompt:

set GOOGLE_APPLICATION_CREDENTIALS=KEY_PATH

Ganti KEY_PATH dengan jalur file JSON yang berisi kredensial Anda.

Mengimpor library

Tutorial ini menggunakan sistem dan library klien berikut.

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Text-to-Speech, lihat library klien Text-to-Speech. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Text-to-Speech Java API.

Untuk mengautentikasi ke Text-to-Speech, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

// 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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Text-to-Speech, lihat library klien Text-to-Speech. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Text-to-Speech Node.js API.

Untuk mengautentikasi ke Text-to-Speech, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

// 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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Text-to-Speech, lihat library klien Text-to-Speech. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Text-to-Speech Python API.

Untuk mengautentikasi ke Text-to-Speech, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

import html

from google.cloud import texttospeech

Menggunakan Text-to-Speech API

Fungsi berikut mengambil string teks yang diberi tag dengan SSML dan nama file MP3. Fungsi ini menggunakan teks yang diberi tag dengan SSML untuk menghasilkan audio sintetis. Fungsi ini menyimpan audio sintetis ke nama file MP3 yang ditetapkan sebagai parameter.

Seluruh input SSML hanya dapat dibaca oleh satu suara. Anda dapat menyetel suara dalam objek VoiceSelectionParams.

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Text-to-Speech, lihat library klien Text-to-Speech. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Text-to-Speech Java API.

Untuk mengautentikasi ke Text-to-Speech, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

/**
 * 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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Text-to-Speech, lihat library klien Text-to-Speech. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Text-to-Speech Node.js API.

Untuk mengautentikasi ke Text-to-Speech, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

/**
 * 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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Text-to-Speech, lihat library klien Text-to-Speech. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Text-to-Speech Python API.

Untuk mengautentikasi ke Text-to-Speech, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

def ssml_to_audio(ssml_text, outfile):
    # 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
    # outfile: string name of file under which to save audio output
    #
    # Returns:
    # nothing

    # 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(outfile, "wb") as out:
        out.write(response.audio_content)
        print("Audio content written to file " + outfile)

Mempersonalisasi audio sintetis

Fungsi berikut menggunakan nama file teks dan mengonversi isi file menjadi string teks yang diberi tag dengan SSML.

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Text-to-Speech, lihat library klien Text-to-Speech. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Text-to-Speech Java API.

Untuk mengautentikasi ke Text-to-Speech, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

/**
 * 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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Text-to-Speech, lihat library klien Text-to-Speech. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Text-to-Speech Node.js API.

Untuk mengautentikasi ke Text-to-Speech, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

/**
 * 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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Text-to-Speech, lihat library klien Text-to-Speech. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Text-to-Speech Python API.

Untuk mengautentikasi ke Text-to-Speech, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

def text_to_ssml(inputfile):
    # 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: string name of plaintext file
    #
    # Returns:
    # A string of 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

Menyatukan semuanya

Program ini menggunakan input berikut.

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

Meneruskan teks di atas ke text_to_ssml() akan menghasilkan teks yang diberi tag berikut.

<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>

Menjalankan kode

Untuk menghasilkan file audio ucapan sintetis, jalankan kode berikut dari command line.

Java

Linux atau MacOS

Dari direktori java-docs-samples/texttospeech/cloud-client/, jalankan perintah berikut pada command line.

$ mvn clean package

Windows

Dari direktori java-docs-samples/texttospeech/cloud-client/, jalankan perintah berikut pada command line.

$ mvn clean package

Node.js

Linux atau MacOS

Di file hybridGlossaries.js, hapus tanda komentar pada variabel yang dikomentari TODO (developer).

Di perintah berikut, ganti projectId dengan ID project Google Cloud Anda. Dari direktori nodejs-docs-samples/texttospeech, jalankan perintah berikut pada command line.

$ node ssmlAddresses.js projectId

Windows

Di file hybridGlossaries.js, hapus tanda komentar pada variabel yang dikomentari TODO (developer).

Di perintah berikut, ganti projectId dengan ID project Google Cloud Anda. Dari direktori nodejs-docs-samples/texttospeech, jalankan perintah berikut pada command line.

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

Python

Linux atau MacOS

Dari direktori python-docs-samples/texttospeech/snippets, jalankan perintah berikut pada command line.

$ python ssml_addresses.py

Windows

Dari direktori python-docs-samples/texttospeech/snippets, jalankan perintah berikut pada command line.

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

Memeriksa output

Program ini menghasilkan file audio example.mp3 yang berisi ucapan sintetis.

Java

Buka direktori java-docs-samples/texttospeech/cloud-client/resources/.

Periksa direktori resources untuk menemukan file example.mp3.

Node.js

Buka direktori nodejs-docs-samples/texttospeech/resources/.

Periksa direktori resources untuk menemukan file example.mp3.

Python

Buka python-docs-samples/texttospeech/snippets/resources.

Periksa direktori resources untuk menemukan file example.mp3.

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


Memecahkan masalah

  • Jika Anda lupa menetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS pada command line, pesan error akan muncul:

    The Application Default Credentials are not available.

  • Meneruskan nama file yang tidak ada pada text_to_ssml() akan menghasilkan pesan error:

    IOError: [Errno 2] No such file or directory
    

  • Meneruskan parameter ssml_text yang berisi None ke ssml_to_audio() akan menghasilkan pesan error:

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

  • Pastikan Anda menjalankan kode dari direktori yang benar.

Langkah selanjutnya

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Platform Anda untuk resource yang digunakan dalam tutorial ini, gunakan konsol Google Cloud untuk menghapus project jika Anda tidak memerlukannya.

Menghapus project Anda

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