Using the Text-to-Speech API with Python

1. Panoramica

1215f38908082356.png

L'API Text-to-Speech consente agli sviluppatori di generare un discorso con un'intonazione simile a quella umana. L'API converte il testo in formati audio come WAV, MP3 o Ogg Opus. Supporta anche gli input SSML (Speech Synthesis Markup Language) per specificare pause, numeri, formattazione di data e ora e altre istruzioni relative alla pronuncia.

In questo tutorial ti concentrerai sull'utilizzo dell'API Text-to-Speech con Python.

Cosa imparerai a fare

  • Come configurare l'ambiente
  • Come elencare le lingue supportate
  • Come elencare le voci disponibili
  • Come sintetizzare l'audio dal testo

Che cosa ti serve

  • Un progetto Google Cloud
  • Un browser, ad esempio Chrome o Firefox
  • Familiarità con l'utilizzo di Python

Sondaggio

Come utilizzerai questo tutorial?

Leggilo e basta Leggilo e completa gli esercizi

Come valuteresti la tua esperienza con Python?

Principiante Intermedio Avanzato

Come valuteresti la tua esperienza con i servizi Google Cloud?

Principiante Intermedio Avanzato

2. Configurazione e requisiti

Configurazione dell'ambiente autonomo

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Il nome del progetto è il nome visualizzato per i partecipanti a questo progetto. È una stringa di caratteri non utilizzata dalle API di Google. Puoi sempre aggiornarlo.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo l'impostazione). La console Cloud genera automaticamente una stringa univoca, di solito non ti interessa di cosa si tratta. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere identificato come PROJECT_ID). Se l'ID generato non ti piace, puoi generarne un altro casuale. In alternativa, puoi provare a crearne uno e vedere se è disponibile. Non può essere modificato dopo questo passaggio e rimane per tutta la durata del progetto.
  • Per tua informazione, esiste un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, devi abilitare la fatturazione in Cloud Console per utilizzare le risorse/API Cloud. Completare questo codelab non costa molto, se non nulla. Per arrestare le risorse ed evitare addebiti oltre a quelli previsti in questo tutorial, puoi eliminare le risorse che hai creato o il progetto. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.

Avvia Cloud Shell

Sebbene Google Cloud possa essere gestito da remoto dal tuo laptop, in questo codelab utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

Attiva Cloud Shell

  1. Nella console Cloud, fai clic su Attiva Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png

Se è la prima volta che avvii Cloud Shell, viene visualizzata una schermata intermedia che ne descrive le funzionalità. Se è stata visualizzata una schermata intermedia, fai clic su Continua.

9c92662c6a846a5c.png

Bastano pochi istanti per eseguire il provisioning e connettersi a Cloud Shell.

9f0e51b578fecce5.png

Questa macchina virtuale è caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Gran parte del lavoro per questo codelab, se non tutto, può essere svolto con un browser.

Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è autenticato e il progetto è impostato sul tuo ID progetto.

  1. Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list

Output comando

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Esegui questo comando in Cloud Shell per verificare che il comando gcloud conosca il tuo progetto:
gcloud config list project

Output comando

[core]
project = <PROJECT_ID>

In caso contrario, puoi impostarlo con questo comando:

gcloud config set project <PROJECT_ID>

Output comando

Updated property [core/project].

3. Configurazione dell'ambiente

Prima di poter iniziare a utilizzare l'API Text-to-Speech, esegui il comando seguente in Cloud Shell per abilitare l'API:

gcloud services enable texttospeech.googleapis.com

Il risultato dovrebbe essere simile a questo:

Operation "operations/..." finished successfully.

Ora puoi utilizzare l'API Text-to-Speech.

Vai alla home directory:

cd ~

Crea un ambiente virtuale Python per isolare le dipendenze:

virtualenv venv-texttospeech

Attiva l'ambiente virtuale:

source venv-texttospeech/bin/activate

Installa IPython e la libreria client API Text-to-Speech:

pip install ipython google-cloud-texttospeech

Il risultato dovrebbe essere simile a questo:

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

Ora puoi utilizzare la libreria client dell'API Text-to-Speech.

Nei passaggi successivi, utilizzerai un interprete Python interattivo chiamato IPython, che hai installato nel passaggio precedente. Avvia una sessione eseguendo ipython in Cloud Shell:

ipython

Il risultato dovrebbe essere simile a questo:

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

Ora puoi effettuare la tua prima richiesta ed elencare le lingue supportate…

4. Elenca le lingue supportate

In questa sezione troverai l'elenco di tutte le lingue supportate.

Copia il seguente codice nella sessione 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 "")
        

Prenditi un momento per studiare il codice e vedere come utilizza il metodo della libreria client list_voices per creare l'elenco dei linguaggi supportati.

Chiama la funzione:

list_languages()

Dovresti visualizzare il seguente elenco (o uno più lungo):

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

L'elenco mostra 58 lingue e varianti, ad esempio:

  • cinese e mandarino taiwanese,
  • Inglese australiano, britannico, indiano e americano.
  • Francese di Canada e Francia,
  • Portoghese del Brasile e del Portogallo.

Questo elenco non è fisso e cresce man mano che vengono rese disponibili nuove voci.

Riepilogo

Questo passaggio ti ha permesso di elencare le lingue supportate.

5. Elenco voci disponibili

In questa sezione troverai l'elenco delle voci disponibili in diverse lingue.

Copia il seguente codice nella sessione 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")
        

Dedica un momento a studiare il codice e a vedere come utilizza il metodo della libreria client list_voices(language_code) per elencare le voci disponibili per una determinata lingua.

Ora, visualizza l'elenco delle voci tedesche disponibili:

list_voices("de")

Il risultato dovrebbe essere simile a questo:

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

Sono disponibili più voci femminili e maschili, nonché voci standard, WaveNet, Neural2 e Studio:

  • Le voci standard vengono generate da algoritmi di elaborazione del segnale.
  • Le voci WaveNet, Neural2 e Studio sono voci di qualità superiore sintetizzate da modelli di machine learning e dal suono più naturale.

Ora, ottieni l'elenco delle voci in inglese disponibili:

list_voices("en")

Dovresti ottenere un risultato simile a questo:

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

Oltre a una selezione di più voci di generi e qualità diversi, sono disponibili più accenti: inglese australiano, britannico, indiano e americano.

Prenditi un momento per elencare le voci disponibili per le tue lingue e varianti preferite (o anche tutte):

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

Riepilogo

Questo passaggio ti ha consentito di elencare le voci disponibili. Puoi scoprire di più sulle voci e sulle lingue supportate.

6. Sintetizza audio dal testo

Puoi utilizzare l'API Text-to-Speech per convertire una stringa in dati audio. Puoi configurare l'output della sintesi vocale in vari modi, ad esempio selezionando una voce unica o modulando l'output in base a tono, volume, velocità del parlato e frequenza di campionamento.

Copia il seguente codice nella sessione 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}"')
        

Prenditi un momento per studiare il codice e vedere come utilizza il metodo della libreria client synthesize_speech per generare i dati audio e salvarli come file wav.

Ora genera frasi con accenti diversi:

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

Il risultato dovrebbe essere simile a questo:

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"

Per scaricare tutti i file generati contemporaneamente, puoi utilizzare questo comando Cloud Shell dal tuo ambiente Python:

!cloudshell download *.wav

Convalida e il browser scaricherà i file:

44382e3b7a3314b0.png 4dbccf007cd73b91.png

Apri ogni file e ascolta il risultato.

Riepilogo

In questo passaggio, hai potuto utilizzare l'API Text-to-Speech per convertire le frasi in file audio wav. Scopri di più sulla creazione di file audio vocali.

7. Complimenti!

1215f38908082356.png

Hai imparato a utilizzare l'API Text-to-Speech utilizzando Python per generare un discorso con un'intonazione simile a quella umana.

Esegui la pulizia

Per pulire l'ambiente di sviluppo, da Cloud Shell:

  • Se sei ancora nella sessione IPython, torna alla shell: exit
  • Interrompi l'utilizzo dell'ambiente virtuale Python: deactivate
  • Elimina la cartella dell'ambiente virtuale: cd ~ ; rm -rf ./venv-texttospeech

Per eliminare il progetto Google Cloud, da Cloud Shell:

  • Recupera l'ID progetto corrente: PROJECT_ID=$(gcloud config get-value core/project)
  • Assicurati che sia il progetto che vuoi eliminare: echo $PROJECT_ID
  • Elimina il progetto: gcloud projects delete $PROJECT_ID

Scopri di più

Licenza

Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.