การใช้ Text-to-Speech API กับ Python

1. ภาพรวม

1215f38908082356.png

Text-to-Speech API ช่วยให้นักพัฒนาซอฟต์แวร์สร้างคำพูดที่เหมือนกับมนุษย์ได้ API จะแปลงข้อความเป็นรูปแบบเสียง เช่น WAV, MP3 หรือ Ogg Opus และยังรองรับอินพุตภาษามาร์กอัปการสังเคราะห์เสียง (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 ของระบบคลาวด์ การใช้งาน Codelab นี้จะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินที่นอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่คุณสร้างหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud ใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรี$300 USD

เริ่มต้น Cloud Shell

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

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

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

3c1dabeca90e44e5.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

เครื่องเสมือนนี้โหลดด้วยเครื่องมือการพัฒนาทั้งหมดที่จำเป็น โดยมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานใน 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. การตั้งค่าสภาพแวดล้อม

ก่อนที่จะเริ่มใช้ API การอ่านออกเสียงข้อความ ให้เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อเปิดใช้ API

gcloud services enable texttospeech.googleapis.com

คุณควรจะเห็นบางสิ่งเช่นนี้:

Operation "operations/..." finished successfully.

คุณสามารถใช้ API การอ่านออกเสียงข้อความได้แล้ว

ไปที่ไดเรกทอรีหน้าแรก

cd ~

สร้างสภาพแวดล้อมเสมือนของ Python เพื่อแยกทรัพยากร Dependency ต่อไปนี้

virtualenv venv-texttospeech

เปิดใช้งานสภาพแวดล้อมเสมือน

source venv-texttospeech/bin/activate

ติดตั้ง IPython และไลบรารีของไคลเอ็นต์ 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 และ 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. สังเคราะห์เสียงจากข้อความ

คุณใช้ 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 อย่างไร

ตอนนี้ ให้สร้างประโยคที่มีสำเนียงต่างๆ 2-3 สำเนียง:

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

คุณได้เรียนรู้วิธีใช้ API การอ่านออกเสียงข้อความโดยใช้ Python เพื่อสร้างเสียงพูดที่เหมือนมนุษย์แล้ว

ล้างข้อมูล

หากต้องการล้างสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ ให้ดำเนินการดังนี้จาก Cloud Shell

  • หากคุณยังอยู่ในเซสชัน IPython ให้กลับไปที่ Shell: 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

ดูข้อมูลเพิ่มเติม

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0