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

1. Omówienie

1215f38908082356.png

Interfejs Text-to-Speech API umożliwia programistom generowanie mowy przypominającej ludzkie. Interfejs API konwertuje tekst na formaty audio, takie jak WAV, MP3 czy Ogg Opus. Obsługuje również dane wejściowe SSML (Speech Synthesis Markup Language), aby określić pauzy, liczby, formatowanie daty i godziny oraz inne instrukcje 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 wyświetlić 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ądarki, na przykład Chrome lub Firefox;
  • znajomość języka Python,

Ankieta

Jak wykorzystasz ten samouczek?

Tylko do przeczytania Przeczytaj go i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenia z językiem Python?

Początkujący Poziom średnio zaawansowany Biegły

Jak oceniasz usługi Google Cloud?

Początkujący Poziom średnio zaawansowany Biegły
.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń w Codelabs musisz podać swój identyfikator projektu (zwykle identyfikowany jako PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Po wykonaniu tej czynności nie można jej już zmienić. Pozostanie ona przez cały czas trwania projektu.
  • Jest jeszcze trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nic nie kosztuje. Aby wyłączyć zasoby w celu uniknięcia naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Uruchamianie Cloud Shell

Google Cloud można obsługiwać zdalnie z laptopa, ale w ramach tego ćwiczenia z programowania wykorzystasz Cloud Shell – środowisko wiersza poleceń działające w Cloud.

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 tej usługi. Jeśli wyświetlił się ekran pośredni, kliknij Dalej.

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość zadań w ramach tego ćwiczenia z programowania można wykonać w przeglądarce.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest uwierzytelniony, a projekt jest ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list

Dane wyjściowe polecenia

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
gcloud config list project

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Dane wyjściowe polecenia

Updated property [core/project].

3. Konfiguracja środowiska

Zanim zaczniesz używać interfejsu Text-to-Speech API, uruchom w Cloud Shell to polecenie, aby go włączyć:

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 wyizolować zależności:

virtualenv venv-texttospeech

Aktywuj środowisko wirtualne:

source venv-texttospeech/bin/activate

Zainstaluj program 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 już korzystać z biblioteki klienta interfejsu Text-to-Speech API.

W następnych krokach użyjesz interaktywnego interpretera Pythona o nazwie IPython, który został zainstalowany w poprzednim kroku. Rozpocznij sesję od uruchomienia 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 wysłać pierwsze żądanie i 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 za pomocą metody z biblioteki klienta list_voices tworzy listę obsługiwanych języków.

Wywołaj funkcję:

list_languages()

Powinna pojawić się taka (lub większa) lista:

---------------------- 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 wariantów, takich jak:

  • 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 ciągnie się za każdym razem, gdy pojawiają się nowe głosy.

Podsumowanie

W tym kroku można było wyświetlić listę obsługiwanych języków.

5. Wyświetl listę dostępnych głosów

W tej sekcji zobaczysz 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 sprawdź, jak używa on metody list_voices(language_code) z biblioteki klienta do wyświetlania listy głosów dostępnych w danym języku.

Przejrzyj 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ą głosy żeńskie i męskie, a także głosy standardowe, WaveNet, Neural2 i Studio:

  • Głosy standardowe są generowane przez algorytmy przetwarzania sygnału.
  • Głosy WaveNet, Neural2 i Studio to głosy wyższej jakości, które są syntetyczne przez modele systemów uczących się i brzmią bardziej naturalnie.

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

list_voices("en")

Powinien wyświetlić się podobny komunikat:

------------------------ 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 głosów różnych płci i mówień dostępnych jest kilka akcentów: australijski, brytyjski, indyjski i amerykański angielski.

Poświęć chwilę na sporządzenie listy głosów dostępnych w przypadku preferowanych przez Ciebie języków i wariantów (a nawet wszystkich):

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

Podsumowanie

W tym kroku można było wyświetlić listę dostępnych głosów. Dowiedz się więcej o obsługiwanych głosach i językach.

6. Syntetyzowanie pliku audio z tekstu

Za pomocą interfejsu Text-to-Speech API możesz przekonwertować ciąg znaków na dane dźwiękowe. Sygnały wyjściowe syntezy mowy możesz skonfigurować na wiele sposobów, na przykład przez wybranie unikalnego głosu lub zmianę wysokości tonu, głośności, szybkości mówienia i częstotliwości 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 wykorzystuje on metodę biblioteki klienta synthesize_speech do generowania danych dźwiękowych i zapisywania ich w postaci pliku wav.

A 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ź poprawność pliku, a przeglądarka pobierze pliki:

44382e3b7a3314b0.png 4dbccf007cd73b91.png

Otwórz każdy plik i odsłuchaj wynik.

Podsumowanie

W tym kroku udało Ci się użyć interfejsu Text-to-Speech API do konwertowania zdań na pliki audio wav. 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 języku Python do generowania mowy podobnej do ludzkiej.

Czyszczenie danych

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

  • Jeśli nadal jesteś w 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 z 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.