Używanie interfejsu Text-to-Speech API w Pythonie

1. Przegląd

1215f38908082356.png

Interfejs Text-to-Speech API umożliwia deweloperom generowanie mowy o jakości porównywalnej do tej, którą posługuje się człowiek. Interfejs API przekształca tekst na formaty audio, takie jak WAV, MP3 lub Ogg Opus. Obsługuje też dane wejściowe w języku znaczników syntezy mowy (SSML), aby określać pauzy, liczby, formatowanie daty i godziny oraz inne instrukcje dotyczące wymowy.

W tym samouczku skupisz się na używaniu interfejsu Text-to-Speech API w języku Python.

Czego się nauczysz

  • Jak skonfigurować środowisko
  • Jak podać listę obsługiwanych języków
  • Jak wyświetlić listę dostępnych głosów
  • Jak zsyntetyzować plik audio z tekstu

Czego potrzebujesz

  • projekt Google Cloud,
  • przeglądarka, np. Chrome lub Firefox;
  • znajomość Pythona,

Ankieta

Jak zamierzasz korzystać z tego samouczka?

Tylko przeczytaj Przeczytaj i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenie z Pythonem?

Początkujący Średnio zaawansowany Zaawansowany

Jak oceniasz korzystanie z usług Google Cloud?

Początkujący Średnio zaawansowany Zaawansowany

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Zawsze możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się tym przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle oznaczanego jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i pozostaje on taki przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Wykonanie tego laboratorium nie będzie kosztować dużo, a może nawet nic. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Uruchamianie Cloud Shell

Z Google Cloud można korzystać zdalnie na laptopie, ale w tym module użyjemy Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tego środowiska. Jeśli pojawił się ekran pośredni, kliknij Dalej.

9c92662c6a846a5c.png

Uzyskanie dostępu do środowiska Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

9f0e51b578fecce5.png

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Większość zadań w tym module, a być może wszystkie, możesz wykonać w przeglądarce.

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu.

  1. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list

Wynik polecenia

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project

Wynik polecenia

[core]
project = <PROJECT_ID>

Jeśli nie, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Wynik polecenia

Updated property [core/project].

3. Konfigurowanie środowiska

Zanim zaczniesz korzystać z interfejsu Text-to-Speech API, uruchom w Cloud Shell to polecenie, aby włączyć interfejs API:

gcloud services enable texttospeech.googleapis.com

Powinien pojawić się ekran podobny do tego:

Operation "operations/..." finished successfully.

Teraz możesz używać interfejsu Text-to-Speech API.

Przejdź do katalogu głównego:

cd ~

Utwórz środowisko wirtualne Pythona, aby odizolować zależności:

virtualenv venv-texttospeech

Aktywuj środowisko wirtualne:

source venv-texttospeech/bin/activate

Zainstaluj IPython i bibliotekę klienta Text-to-Speech API:

pip install ipython google-cloud-texttospeech

Powinien pojawić się ekran podobny do tego:

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

Teraz możesz używać biblioteki klienta Text-to-Speech API.

W kolejnych krokach użyjesz interaktywnego interpretera Pythona o nazwie IPython, który został zainstalowany w poprzednim kroku. Rozpocznij sesję, uruchamiając ipython w Cloud Shell:

ipython

Powinien pojawić się ekran podobny do tego:

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]:

Możesz już wysłać pierwsze żądanie i wyświetlić listę obsługiwanych języków.

4. Lista obsługiwanych języków

W tej sekcji znajdziesz listę wszystkich obsługiwanych języków.

Skopiuj ten kod do sesji 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 "")
        

Poświęć chwilę na zapoznanie się z kodem i zobacz, jak używa on metody biblioteki klienta list_voices do utworzenia listy obsługiwanych języków.

Wywołaj funkcję:

list_languages()

Powinna pojawić się lista podobna do tej (lub dłuższa):

---------------------- 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

Lista zawiera 58 języków i ich odmian, np.:

  • chiński i tajwański mandaryński,
  • angielski australijski, brytyjski, indyjski i amerykański,
  • francuski z Kanady i Francji,
  • portugalski z Brazylii i Portugalii.

Ta lista nie jest stała i powiększa się w miarę udostępniania nowych głosów.

Podsumowanie

Ten krok umożliwił Ci wyświetlenie listy obsługiwanych języków.

5. Wyświetlanie listy dostępnych głosów

W tej sekcji znajdziesz listę głosów dostępnych w różnych językach.

Skopiuj ten kod do sesji 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")
        

Poświęć chwilę na zapoznanie się z kodem i zobacz, jak używa on metody biblioteki klienta list_voices(language_code) do wyświetlania listy głosów dostępnych w danym języku.

Teraz pobierz listę dostępnych głosów w języku niemieckim:

list_voices("de")

Powinien pojawić się ekran podobny do tego:

------------------------ 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
...

Dostępne są różne głosy żeńskie i męskie, a także głosy standardowe, WaveNet, Neural2 i Studio:

  • Standardowe głosy są generowane przez algorytmy przetwarzania sygnałów.
  • Głosy WaveNet, Neural2 i Studio to głosy o wyższej jakości, które są syntetyzowane przez modele uczenia maszynowego i brzmią bardziej naturalnie.

Teraz pobierz listę dostępnych głosów w języku angielskim:

list_voices("en")

Powinien pojawić się ekran podobny do tego:

------------------------ 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
...

Oprócz wyboru wielu głosów o różnej płci i jakości dostępne są różne akcenty: australijski, brytyjski, indyjski i amerykański.

Poświęć chwilę na sporządzenie listy głosów dostępnych w preferowanych językach i ich wariantach (lub nawet we wszystkich):

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

Podsumowanie

Ten krok umożliwił wyświetlenie listy dostępnych głosów. Więcej informacji o obsługiwanych głosach i językach

6. Syntetyzowanie pliku audio z tekstu

Za pomocą interfejsu Text-to-Speech API możesz przekształcić ciąg znaków w dane audio. Możesz skonfigurować wyjście syntezy mowy na różne sposoby, np. wybrać unikalny głos lub dostosować wysokość głosu, głośność, szybkość mowy i częstotliwość próbkowania.

Skopiuj ten kod do sesji 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}"')
        

Poświęć chwilę na zapoznanie się z kodem i zobacz, jak za pomocą metody biblioteki klienta synthesize_speech generuje dane audio i zapisuje je w pliku wav.

Teraz wygeneruj zdania z kilkoma różnymi akcentami:

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 ?")

Powinien pojawić się ekran podobny do tego:

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"

Aby pobrać wszystkie wygenerowane pliki naraz, możesz użyć tego polecenia Cloud Shell w środowisku Pythona:

!cloudshell download *.wav

Sprawdź, a przeglądarka pobierze pliki:

44382e3b7a3314b0.png 4dbccf007cd73b91.png

Otwórz każdy plik i posłuchaj wyniku.

Podsumowanie

W tym kroku udało Ci się przekonwertować zdania na pliki audio wav za pomocą interfejsu Text-to-Speech API. Dowiedz się więcej o tworzeniu plików audio z głosem.

7. Gratulacje!

1215f38908082356.png

Wiesz już, jak używać interfejsu Text-to-Speech API w Pythonie do generowania mowy o brzmieniu zbliżonym do ludzkiego.

Czyszczenie danych

Aby wyczyścić środowisko programistyczne, w Cloud Shell:

  • Jeśli nadal korzystasz z sesji IPython, wróć do powłoki: exit
  • Przestań używać środowiska wirtualnego Pythona: deactivate
  • Usuń folder środowiska wirtualnego: cd ~ ; rm -rf ./venv-texttospeech

Aby usunąć projekt Google Cloud, w Cloud Shell:

  • Pobierz bieżący identyfikator projektu: PROJECT_ID=$(gcloud config get-value core/project)
  • Sprawdź, czy to jest projekt, który chcesz usunąć: echo $PROJECT_ID
  • Usuń projekt: gcloud projects delete $PROJECT_ID

Więcej informacji

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.