將 Text-to-Speech API 與 Python 搭配使用

1. 總覽

1215f38908082356.png

Text-to-Speech API 可讓開發人員產生擬真的語音。這個 API 可將文字轉換為 WAV、MP3 或 Ogg Opus 等音訊格式。還能使用語音合成標記語言 (SSML) 輸入資料,指定停頓、數字、日期與時間格式設定,以及其他發音指示。

在這個教學課程中,您將專注於搭配 Python 使用 Text-to-Speech API。

課程內容

  • 如何設定環境
  • 如何列出支援的語言
  • 如何列出可用的語音
  • 如何從文字合成音訊

軟硬體需求

  • Google Cloud 專案
  • 瀏覽器,例如 ChromeFirefox
  • 熟悉使用 Python

問卷調查

您會如何使用這個教學課程?

僅供閱讀 閱讀並完成練習

您對 Python 的使用體驗有何評價?

新手 中級 還算容易

針對使用 Google Cloud 服務的經驗,您會給予什麼評價?

新手 中級 還算容易

2. 設定和需求

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您可以隨時更新付款方式。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為 PROJECT_ID)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。或者,您也可以自行嘗試,看看是否支援。在這個步驟後,這個名稱即無法變更,而且在專案期間內仍會保持有效。
  • 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行本程式碼研究室不會產生任何費用 (如果有的話)。如要關閉資源,以免產生本教學課程結束後產生的費用,您可以刪除自己建立的資源或刪除專案。新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Cloud Shell,這是一種在 Cloud 中執行的指令列環境。

啟用 Cloud Shell

  1. 在 Cloud 控制台中,按一下「啟用 Cloud Shell」圖示 853e55310c205094.png

3c1dabeca90e44e5.png

如果您是第一次啟動 Cloud Shell,系統會顯示中繼畫面,說明這項服務的內容。如果系統顯示中繼畫面,請按一下「繼續」

9c92662c6a846a5c.png

佈建並連線至 Cloud Shell 只需幾分鐘的時間。

9f0e51b578fecce5.png

這個虛擬機器已載入所有必要的開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。在本程式碼研究室中,您的大部分作業都可透過瀏覽器完成。

連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為您的專案 ID。

  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 用戶端程式庫了!

在後續步驟中,您將使用名為 IPython 的互動式 Python 解譯器,此語言是在之前的步驟中安裝。在 Cloud Shell 中執行 ipython 即可啟動工作階段:

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 語音:

現在,取得可用的英文語音清單:

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"

如要一次下載所有產生的檔案,您可以在 Python 環境中使用下列 Cloud Shell 指令:

!cloudshell download *.wav

驗證後,瀏覽器就會下載檔案:

44382e3b7a3314b0.png 4dbccf007cd73b91.png

開啟每個檔案並聆聽結果。

摘要

在這個步驟中,您可以使用 Text-to-Speech API 將句子轉換為音訊 wav 檔案。進一步瞭解如何建立語音音訊檔案

7. 恭喜!

1215f38908082356.png

您已瞭解如何使用 Python 的 Text-to-Speech API 產生擬真的語音!

清除所用資源

如要清除開發環境,請透過 Cloud Shell 執行下列操作:

  • 如果您目前仍在 IPython 工作階段,請返回殼層:exit
  • 停止使用 Python 虛擬環境:deactivate
  • 刪除虛擬環境資料夾:cd ~ ; rm -rf ./venv-texttospeech

如要刪除 Google Cloud 專案,請透過 Cloud Shell 進行:

  • 擷取目前的專案 ID:PROJECT_ID=$(gcloud config get-value core/project)
  • 請確認這是要刪除的專案:echo $PROJECT_ID
  • 刪除專案:gcloud projects delete $PROJECT_ID

瞭解詳情

授權

這項內容採用的是創用 CC 姓名標示 2.0 通用授權。