הקראת כתובות באמצעות SSML

במדריך הזה מוסבר איך להשתמש בשפת סימון לסינתזת דיבור (SSML) כדי להקריא קובץ טקסט של כתובות. אתם יכולים להשתמש בתגי SSML כדי להוסיף סימון למחרוזת טקסט ולהתאים אישית את האודיו הסינתטי מ-Cloud Text-to-Speech.

Plaintext עיבוד 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>

מטרה

שולחים בקשה לסינתזת דיבור ל-Cloud Text-to-Speech באמצעות SSML וספריות הלקוח של Cloud Text-to-Speech.

עלויות

מידע על עלויות זמין בדף התמחור של Cloud TTS.

לפני שמתחילים

הורדת דוגמאות הקוד

כדי להוריד את דוגמאות הקוד, משכפלים את Google Cloud הדוגמאות של GitHub לשפת התכנות שבה רוצים להשתמש.

Java

במדריך הזה נעשה שימוש בקוד בספרייה texttospeech/cloud-client/src/main/java/com/example/texttospeech/ של מאגר הדוגמאות של Java ב-Google Cloud Platform.

כדי להוריד את הקוד של המדריך הזה ולעבור אליו, מריצים את הפקודות הבאות מהטרמינל.

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

במדריך הזה נעשה שימוש בקוד בספרייה texttospeech של מאגר הדוגמאות של Google Cloud Platform Node.js.

כדי להוריד את הקוד של ההדרכה הזו ולעבור אליו, מריצים את הפקודות הבאות מהטרמינל.

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

Python

במדריך הזה נעשה שימוש בקוד בספרייה texttospeech/snippets של מאגר הדוגמאות של Python ב-Google Cloud Platform.

כדי להוריד את הקוד של המדריך הזה ולעבור אליו, מריצים את הפקודות הבאות מהטרמינל.

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

התקנת ספריית הלקוח

במדריך הזה נעשה שימוש בספריית הלקוח Text-to-Speech.

Java

המדריך הזה משתמש בתלות הבאה.

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

מריצים את הפקודה הבאה מהטרמינל.

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

Python

מריצים את הפקודה הבאה מהטרמינל.

pip install --upgrade google-cloud-texttospeech

הגדרת פרטי הכניסה ל-Google Cloud Platform

Provide authentication credentials to your application code by setting the environment variable GOOGLE_APPLICATION_CREDENTIALS. This variable applies only to your current shell session. If you want the variable to apply to future shell sessions, set the variable in your shell startup file, for example in the ~/.bashrc or ~/.profile file.

Linux או macOS

export GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

Replace KEY_PATH with the path of the JSON file that contains your credentials.

For example:

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

Windows

For PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

Replace KEY_PATH with the path of the JSON file that contains your credentials.

For example:

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

For command prompt:

set GOOGLE_APPLICATION_CREDENTIALS=KEY_PATH

Replace KEY_PATH with the path of the JSON file that contains your credentials.

ייבוא ספריות

במדריך הזה נעשה שימוש במערכת ובספריות הלקוח הבאות.

Java

מידע על התקנת ספריית הלקוח של Cloud TTS ושימוש בה מופיע במאמר ספריות הלקוח של Cloud TTS. מידע נוסף מופיע במאמרי העזרה של Cloud TTS Java API.

כדי לבצע אימות ב-Cloud TTS, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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

מידע על התקנת ספריית הלקוח של Cloud TTS ושימוש בה מופיע במאמר ספריות הלקוח של Cloud TTS. מידע נוסף מופיע במאמרי העזרה של Cloud TTS Node.js API.

כדי לבצע אימות ב-Cloud TTS, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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

מידע על התקנת ספריית הלקוח של Cloud TTS ושימוש בה מופיע במאמר ספריות הלקוח של Cloud TTS. מידע נוסף מופיע במאמרי העזרה של Cloud TTS Python API.

כדי לבצע אימות ב-Cloud TTS, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

import html

from google.cloud import texttospeech

שימוש ב-Cloud Text-to-Speech API

הפונקציה הבאה מקבלת מחרוזת טקסט שתויגה באמצעות SSML ואת השם של קובץ MP3. הפונקציה משתמשת בטקסט שתויג באמצעות SSML כדי ליצור אודיו סינתטי. הפונקציה שומרת את האודיו הסינתטי בשם הקובץ MP3 שמוגדר כפרמטר.

כל קלט ה-SSML יכול להיקרא רק על ידי קול אחד. אפשר להגדיר את הקול באובייקט VoiceSelectionParams.

Java

מידע על התקנת ספריית הלקוח של Cloud TTS ושימוש בה מופיע במאמר ספריות הלקוח של Cloud TTS. מידע נוסף מופיע במאמרי העזרה של Cloud TTS Java API.

כדי לבצע אימות ב-Cloud TTS, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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

מידע על התקנת ספריית הלקוח של Cloud TTS ושימוש בה מופיע במאמר ספריות הלקוח של Cloud TTS. מידע נוסף מופיע במאמרי העזרה של Cloud TTS Node.js API.

כדי לבצע אימות ב-Cloud TTS, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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

מידע על התקנת ספריית הלקוח של Cloud TTS ושימוש בה מופיע במאמר ספריות הלקוח של Cloud TTS. מידע נוסף מופיע במאמרי העזרה של Cloud TTS Python API.

כדי לבצע אימות ב-Cloud TTS, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

def ssml_to_audio(ssml_text: str) -> None:
    """
    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
    """

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

התאמה אישית של אודיו סינתטי

הפונקציה הבאה מקבלת את השם של קובץ טקסט וממירה את התוכן של הקובץ למחרוזת טקסט שתויגה באמצעות SSML.

Java

מידע על התקנת ספריית הלקוח של Cloud TTS ושימוש בה מופיע במאמר ספריות הלקוח של Cloud TTS. מידע נוסף מופיע במאמרי העזרה של Cloud TTS Java API.

כדי לבצע אימות ב-Cloud TTS, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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

מידע על התקנת ספריית הלקוח של Cloud TTS ושימוש בה מופיע במאמר ספריות הלקוח של Cloud TTS. מידע נוסף מופיע במאמרי העזרה של Cloud TTS Node.js API.

כדי לבצע אימות ב-Cloud TTS, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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

מידע על התקנת ספריית הלקוח של Cloud TTS ושימוש בה מופיע במאמר ספריות הלקוח של Cloud TTS. מידע נוסף מופיע במאמרי העזרה של Cloud TTS Python API.

כדי לבצע אימות ב-Cloud TTS, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

def text_to_ssml(inputfile: str) -> str:
    """
    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: name of plaintext file
    Returns: 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

סיכום של כל המידע

התוכנית הזו משתמשת בקלט הבא.

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

העברת הטקסט שלמעלה אל text_to_ssml() יוצרת את הטקסט המתויג הבא.

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

הרצת הקוד

כדי ליצור קובץ אודיו של דיבור סינתטי, מריצים את הקוד הבא משורת הפקודה.

Java

‫Linux או MacOS

בספרייה java-docs-samples/texttospeech/cloud-client/, מריצים את הפקודה הבאה בשורת הפקודה.

$ mvn clean package

Windows

בספרייה java-docs-samples/texttospeech/cloud-client/, מריצים את הפקודה הבאה בשורת הפקודה.

$ mvn clean package

Node.js

‫Linux או MacOS

בקובץ hybridGlossaries.js, מבטלים את ההערה של המשתנים TODO (developer) commented-out.

בפקודה הבאה, מחליפים את projectId במזהה הפרויקט. Google Cloud בספרייה nodejs-docs-samples/texttospeech, מריצים את הפקודה הבאה בשורת הפקודה.

$ node ssmlAddresses.js projectId

Windows

בקובץ hybridGlossaries.js, מבטלים את ההערה של המשתנים TODO (developer) commented-out.

בפקודה הבאה, מחליפים את projectId במזהה הפרויקט. Google Cloud בספרייה nodejs-docs-samples/texttospeech, מריצים את הפקודה הבאה בשורת הפקודה.

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

Python

‫Linux או MacOS

בספרייה python-docs-samples/texttospeech/snippets, מריצים את הפקודה הבאה בשורת הפקודה.

$ python ssml_addresses.py

Windows

בספרייה python-docs-samples/texttospeech/snippets, מריצים את הפקודה הבאה בשורת הפקודה.

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

בדיקת הפלט

התוכנית הזו מוציאה קובץ אודיו example.mp3 של דיבור סינתטי.

Java

מנווטים לספרייה java-docs-samples/texttospeech/cloud-client/resources/.

בודקים אם יש קובץ example.mp3 בספרייה resources.

Node.js

מנווטים לספרייה nodejs-docs-samples/texttospeech/resources/.

בודקים אם יש קובץ example.mp3 בספרייה resources.

Python

ניווט אל python-docs-samples/texttospeech/snippets/resources.

בודקים אם יש קובץ example.mp3 בספרייה resources.

כדאי להאזין לקטע האודיו הבא כדי לוודא שקובץ ה-example.mp3 שלך נשמע זהה.


פתרון בעיות

  • אם שכחתם להגדיר את משתנה הסביבה GOOGLE_APPLICATION_CREDENTIALS בשורת הפקודה, תוצג הודעת השגיאה:

    The Application Default Credentials are not available.

  • העברת text_to_ssml() שם של קובץ שלא קיים יוצרת את הודעת השגיאה:

    IOError: [Errno 2] No such file or directory
    

  • העברת פרמטר ssml_to_audio() ssml_text שמכיל None יוצרת את הודעת השגיאה:

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

  • מוודאים שהקוד מופעל מהספרייה הנכונה.

המאמרים הבאים

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud Platform על המשאבים שבהם השתמשתם במדריך הזה, אתם יכולים למחוק את הפרויקט באמצעות מסוףGoogle Cloud אם אתם לא צריכים אותו יותר.

מחיקת פרויקט

  1. במסוףGoogle Cloud , עוברים לדף Projects.
  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על מחיקה.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.