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

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

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ มี.ค. 27, 2024
account_circleเขียนโดย Laurent Picard

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