שימוש ב-API להמרת טקסט לדיבור (TTS) עם Python

1. סקירה כללית

1215f38908082356.png

Text-to-Speech API מאפשר למפתחים ליצור דיבור שנשמע כמו דיבור אנושי. ה-API ממיר טקסט לפורמטים של אודיו כמו WAV,‏ MP3 או Ogg Opus. הוא תומך גם בקלט של Speech Synthesis Markup Language ‏ (SSML) כדי לציין הפסקות, מספרים, פורמט של תאריך ושעה והוראות אחרות לגבי הגייה.

במדריך הזה נתמקד בשימוש ב-Text-to-Speech API עם Python.

מה תלמדו

  • איך מגדירים את הסביבה
  • איך מציגים רשימה של שפות נתמכות
  • איך מציגים רשימה של קולות זמינים
  • איך מסנתזים אודיו מטקסט

מה תצטרכו

  • פרויקט ב-Google Cloud
  • דפדפן, כמו Chrome או Firefox
  • היכרות עם השימוש ב-Python

סקר

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

רק לקרוא לקרוא ולבצע את התרגילים

איך היית מדרג את חוויית השימוש שלך ב-Python?

מתחילים ביניים מומחים

איזה דירוג מתאים לדעתך לחוויית השימוש שלך בשירותי Google Cloud?

מתחילים ביניים מומחים

‫2. הגדרה ודרישות

הגדרת סביבה בקצב אישי

  1. נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. תמיד אפשר לעדכן את המיקום.
  • מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו אחרי שהוא מוגדר. מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל מסומן כ-PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר לאורך הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. השלמת ה-codelab הזה לא תעלה לכם הרבה, אם בכלל. כדי להשבית את המשאבים ולמנוע חיובים נוספים אחרי שתסיימו את המדריך הזה, תוכלו למחוק את המשאבים שיצרתם או למחוק את הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

מפעילים את Cloud Shell

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-codelab הזה תשתמשו ב-Cloud Shell, סביבת שורת פקודה שפועלת בענן.

הפעלת Cloud Shell

  1. ב-Cloud Console, לוחצים על Activate Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png

אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים עם תיאור של השירות. אם הוצג לכם מסך ביניים, לחצו על המשך.

9c92662c6a846a5c.png

הקצאת המשאבים והחיבור ל-Cloud Shell נמשכים רק כמה רגעים.

9f0e51b578fecce5.png

המכונה הווירטואלית הזו כוללת את כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את רוב העבודה ב-codelab הזה, אם לא את כולה, באמצעות דפדפן.

אחרי שמתחברים ל-Cloud Shell, אמור להופיע אימות ושהפרויקט מוגדר לפי מזהה הפרויקט.

  1. מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שעברתם אימות:
gcloud auth list

פלט הפקודה

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שפקודת gcloud מכירה את הפרויקט:
gcloud config list project

פלט הפקודה

[core]
project = <PROJECT_ID>

אם לא, אפשר להגדיר אותו באמצעות הפקודה הבאה:

gcloud config set project <PROJECT_ID>

פלט הפקודה

Updated property [core/project].

‫3. הגדרת הסביבה

כדי להפעיל את Text-to-Speech API, מריצים את הפקודה הבאה ב-Cloud Shell:

gcloud services enable texttospeech.googleapis.com

אתם אמורים לראות משהו כזה:

Operation "operations/..." finished successfully.

עכשיו אפשר להשתמש ב-Text-to-Speech API.

מנווטים לספריית הבית:

cd ~

יוצרים סביבה וירטואלית של Python כדי לבודד את התלות:

virtualenv venv-texttospeech

מפעילים את הסביבה הווירטואלית:

source venv-texttospeech/bin/activate

מתקינים את IPython ואת ספריית הלקוח של Text-to-Speech API:

pip install ipython google-cloud-texttospeech

אתם אמורים לראות משהו כזה:

...
Installing collected packages: ..., ipython, google-cloud-texttospeech
Successfully installed ... google-cloud-texttospeech-2.16.3 ...

עכשיו אפשר להשתמש בספריית הלקוח של Text-to-Speech API.

בשלבים הבאים תשתמשו במפרש Python אינטראקטיבי שנקרא IPython, שהתקנתם בשלב הקודם. כדי להתחיל סשן, מריצים את הפקודה ipython ב-Cloud Shell:

ipython

אתם אמורים לראות משהו כזה:

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.18.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

הכול מוכן, אפשר לשלוח את הבקשה הראשונה ולראות את רשימת השפות הנתמכות…

4. רשימת השפות הנתמכות

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

מעתיקים את הקוד הבא להפעלה של IPython:

from typing import Sequence

import google.cloud.texttospeech as tts


def unique_languages_from_voices(voices: Sequence[tts.Voice]):
    language_set = set()
    for voice in voices:
        for language_code in voice.language_codes:
            language_set.add(language_code)
    return language_set


def list_languages():
    client = tts.TextToSpeechClient()
    response = client.list_voices()
    languages = unique_languages_from_voices(response.voices)

    print(f" Languages: {len(languages)} ".center(60, "-"))
    for i, language in enumerate(sorted(languages)):
        print(f"{language:>10}", end="\n" if i % 5 == 4 else "")
        

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

מפעילים את הפונקציה:

list_languages()

אמורה להתקבל הרשימה הבאה (או רשימה גדולה יותר):

---------------------- Languages: 58 -----------------------
     af-ZA     am-ET     ar-XA     bg-BG     bn-IN
     ca-ES    cmn-CN    cmn-TW     cs-CZ     da-DK
     de-DE     el-GR     en-AU     en-GB     en-IN
     en-US     es-ES     es-US     eu-ES     fi-FI
    fil-PH     fr-CA     fr-FR     gl-ES     gu-IN
     he-IL     hi-IN     hu-HU     id-ID     is-IS
     it-IT     ja-JP     kn-IN     ko-KR     lt-LT
     lv-LV     ml-IN     mr-IN     ms-MY     nb-NO
     nl-BE     nl-NL     pa-IN     pl-PL     pt-BR
     pt-PT     ro-RO     ru-RU     sk-SK     sr-RS
     sv-SE     ta-IN     te-IN     th-TH     tr-TR
     uk-UA     vi-VN    yue-HK

ברשימה מוצגות 58 שפות וגרסאות שונות, כמו:

  • סינית ומנדרינית טייוואנית,
  • אנגלית אוסטרלית, בריטית, הודית ואמריקאית,
  • צרפתית מקנדה ומצרפת,
  • פורטוגזית מברזיל ומפורטוגל.

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

סיכום

בשלב הזה אפשר לראות את רשימת השפות הנתמכות.

5. רשימת הקולות הזמינים

בקטע הזה מופיעה רשימה של קולות שזמינים בשפות שונות.

מעתיקים את הקוד הבא להפעלה של IPython:

import google.cloud.texttospeech as tts


def list_voices(language_code=None):
    client = tts.TextToSpeechClient()
    response = client.list_voices(language_code=language_code)
    voices = sorted(response.voices, key=lambda voice: voice.name)

    print(f" Voices: {len(voices)} ".center(60, "-"))
    for voice in voices:
        languages = ", ".join(voice.language_codes)
        name = voice.name
        gender = tts.SsmlVoiceGender(voice.ssml_gender).name
        rate = voice.natural_sample_rate_hertz
        print(f"{languages:<8} | {name:<24} | {gender:<8} | {rate:,} Hz")
        

כדאי להקדיש רגע ללימוד הקוד ולראות איך הוא משתמש בשיטה list_voices(language_code) של ספריית הלקוח כדי להציג רשימה של קולות שזמינים בשפה מסוימת.

עכשיו, מקבלים את רשימת הקולות הזמינים בגרמנית:

list_voices("de")

אתם אמורים לראות משהו כזה:

------------------------ Voices: 20 ------------------------
de-DE    | de-DE-Neural2-A          | FEMALE   | 24,000 Hz
de-DE    | de-DE-Neural2-B          | MALE     | 24,000 Hz
...
de-DE    | de-DE-Standard-A         | FEMALE   | 24,000 Hz
de-DE    | de-DE-Standard-B         | MALE     | 24,000 Hz
...
de-DE    | de-DE-Studio-B           | MALE     | 24,000 Hz
de-DE    | de-DE-Studio-C           | FEMALE   | 24,000 Hz
de-DE    | de-DE-Wavenet-A          | FEMALE   | 24,000 Hz
de-DE    | de-DE-Wavenet-B          | MALE     | 24,000 Hz
...

יש קולות של נשים וגברים, וגם קולות רגילים, קולות של WaveNet, קולות של Neural2 וקולות של Studio:

  • קולות רגילים נוצרים על ידי אלגוריתמים לעיבוד אותות.
  • WaveNet,‏ Neural2 וקולות של סטודיו הם קולות באיכות גבוהה יותר שמסונתזים על ידי מודלים של למידת מכונה ונשמעים טבעיים יותר.

עכשיו, מקבלים את רשימת הקולות הזמינים באנגלית:

list_voices("en")

אמורה להתקבל תגובה שדומה לזו:

------------------------ Voices: 90 ------------------------
en-AU    | en-AU-Neural2-A          | FEMALE   | 24,000 Hz
...
en-AU    | en-AU-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-GB    | en-GB-Neural2-A          | FEMALE   | 24,000 Hz
...
en-GB    | en-GB-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-IN    | en-IN-Standard-A         | FEMALE   | 24,000 Hz
...
en-IN    | en-IN-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-US    | en-US-Neural2-A          | MALE     | 24,000 Hz
...
en-US    | en-US-News-K             | FEMALE   | 24,000 Hz
...
en-US    | en-US-Standard-A         | MALE     | 24,000 Hz
...
en-US    | en-US-Studio-M           | MALE     | 24,000 Hz
...
en-US    | en-US-Wavenet-A          | MALE     | 24,000 Hz
...

בנוסף למבחר של קולות שונים במגדרים ובאיכויות שונות, יש גם מבטאים שונים: אנגלית אוסטרלית, בריטית, הודית ואמריקאית.

כדאי להקדיש רגע כדי לראות את רשימת הקולות שזמינים בשפות המועדפות ובגרסאות שלהן (או אפילו בכל השפות):

list_voices("fr")
list_voices("pt")
list_voices()

סיכום

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

6. סינתוז אודיו מטקסט

אפשר להשתמש ב-Text-to-Speech API כדי להמיר מחרוזת לנתוני אודיו. אפשר להגדיר את הפלט של סינתזת הדיבור במגוון דרכים, כולל בחירת קול ייחודי או שינוי של גובה הצליל, העוצמה, קצב הדיבור וקצב הדגימה של הפלט.

מעתיקים את הקוד הבא להפעלה של IPython:

import google.cloud.texttospeech as tts


def text_to_wav(voice_name: str, text: str):
    language_code = "-".join(voice_name.split("-")[:2])
    text_input = tts.SynthesisInput(text=text)
    voice_params = tts.VoiceSelectionParams(
        language_code=language_code, name=voice_name
    )
    audio_config = tts.AudioConfig(audio_encoding=tts.AudioEncoding.LINEAR16)

    client = tts.TextToSpeechClient()
    response = client.synthesize_speech(
        input=text_input,
        voice=voice_params,
        audio_config=audio_config,
    )

    filename = f"{voice_name}.wav"
    with open(filename, "wb") as out:
        out.write(response.audio_content)
        print(f'Generated speech saved to "{filename}"')
        

כדאי לעיין בקוד ולראות איך הוא משתמש בשיטה של ספריית הלקוח synthesize_speech כדי ליצור את נתוני האודיו ולשמור אותם כקובץ wav.

עכשיו, יוצרים משפטים בכמה מבטאים שונים:

text_to_wav("en-AU-Neural2-A", "What is the temperature in Sydney?")
text_to_wav("en-GB-Neural2-B", "What is the temperature in London?")
text_to_wav("en-IN-Wavenet-C", "What is the temperature in Delhi?")
text_to_wav("en-US-Studio-O", "What is the temperature in New York?")
text_to_wav("fr-FR-Neural2-A", "Quelle est la température à Paris ?")
text_to_wav("fr-CA-Neural2-B", "Quelle est la température à Montréal ?")

אתם אמורים לראות משהו כזה:

Generated speech saved to "en-AU-Neural2-A.wav"
Generated speech saved to "en-GB-Neural2-B.wav"
Generated speech saved to "en-IN-Wavenet-C.wav"
Generated speech saved to "en-US-Studio-O.wav"
Generated speech saved to "fr-FR-Neural2-A.wav"
Generated speech saved to "fr-CA-Neural2-B.wav"

כדי להוריד את כל הקבצים שנוצרו בבת אחת, אפשר להשתמש בפקודה הזו של Cloud Shell מסביבת Python:

!cloudshell download *.wav

הקבצים יאומתו ויוורדו לדפדפן:

44382e3b7a3314b0.png 4dbccf007cd73b91.png

פותחים כל קובץ ושומעים את התוצאה.

סיכום

בשלב הזה, השתמשתם ב-Text-to-Speech API כדי להמיר משפטים לקובצי אודיו wav. מידע נוסף על יצירת קובצי אודיו עם קול

7. מעולה!

1215f38908082356.png

למדתם איך להשתמש ב-Text-to-Speech API באמצעות Python כדי ליצור דיבור שנשמע כמו דיבור אנושי.

הסרת המשאבים

כדי לנקות את סביבת הפיתוח, מ-Cloud Shell:

  • אם אתם עדיין בהפעלה של IPython, חוזרים אל המעטפת: exit
  • מפסיקים להשתמש בסביבה הווירטואלית של Python: deactivate
  • מוחקים את תיקיית הסביבה הווירטואלית: cd ~ ; rm -rf ./venv-texttospeech

כדי למחוק את הפרויקט בענן ב-Google Cloud, מ-Cloud Shell:

  • כדי לאחזר את מזהה הפרויקט הנוכחי: PROJECT_ID=$(gcloud config get-value core/project)
  • חשוב לוודא שזה הפרויקט שרוצים למחוק: echo $PROJECT_ID
  • מחיקת הפרויקט: gcloud projects delete $PROJECT_ID

מידע נוסף

רישיון

עבודה זו מורשית תחת רישיון Creative Commons שמותנה בייחוס 2.0 כללי.