การใช้ Text-to-Speech API กับ 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 Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยทั่วไปจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณอาจลองใช้ชื่อของคุณเองและดูว่ามีชื่อนั้นหรือไม่ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะไม่มีค่าใช้จ่ายมากนัก หรืออาจไม่มีค่าใช้จ่ายเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

เริ่มต้น Cloud Shell

แม้ว่าคุณจะใช้งาน Google Cloud จากแล็ปท็อประยะไกลได้ แต่ใน Codelab นี้คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

เปิดใช้งาน Cloud Shell

  1. จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell 853e55310c205094.png

3c1dabeca90e44e5.png

หากคุณเริ่มใช้ Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอระดับกลางที่อธิบายว่า Cloud Shell คืออะไร หากเห็นหน้าจอระดับกลาง ให้คลิกต่อไป

9c92662c6a846a5c.png

การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน

9f0e51b578fecce5.png

เครื่องเสมือนนี้โหลดเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่จำเป็นไว้แล้ว โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานส่วนใหญ่หรือทั้งหมดในโค้ดแล็บนี้ได้ด้วยเบราว์เซอร์

เมื่อเชื่อมต่อกับ 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 เพื่อเปิดใช้ API

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 ภาษา เช่น

  • จีนกลางและจีนกลางไต้หวัน
  • ภาษาอังกฤษแบบออสเตรเลีย อังกฤษ อินเดีย และอเมริกัน
  • French from Canada and France,
  • โปรตุเกสจากบราซิลและโปรตุเกส

รายการนี้อาจมีการเปลี่ยนแปลงและจะเพิ่มขึ้นเมื่อมีเสียงใหม่ๆ

สรุป

ขั้นตอนนี้ช่วยให้คุณแสดงรายการภาษาที่รองรับได้

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 และเสียงระดับสตูดิโอ

  • เสียงมาตรฐานสร้างขึ้นโดยอัลกอริทึมการประมวลผลสัญญาณ
  • เสียง WaveNet, Neural2 และเสียง Studio เป็นเสียงคุณภาพสูงที่สังเคราะห์โดยโมเดลแมชชีนเลิร์นนิงและฟังดูเป็นธรรมชาติมากขึ้น

ตอนนี้ให้รับรายการเสียงภาษาอังกฤษที่พร้อมใช้งานโดยทำดังนี้

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 Attribution License) 2.0 แบบทั่วไป