Using the Text-to-Speech API with Python

1. Panoramica

1215f38908082356.png

L'API Text-to-Speech consente agli sviluppatori di generare una sintesi vocale simile a quella umana. L'API converte il testo in formati audio come WAV, MP3 o Ogg Opus. Supporta inoltre 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
  • Dimestichezza nell'utilizzo di Python

Sondaggio

Come utilizzerai questo tutorial?

Solo lettura Leggilo e completa gli esercizi

Come valuteresti la tua esperienza con Python?

Principiante Livello intermedio Eccellente

Come giudichi la tua esperienza con i servizi Google Cloud?

Principiante Livello intermedio Eccellente

2. Configurazione e requisiti

Configurazione dell'ambiente da seguire in modo 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 progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi sempre aggiornarla.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca. di solito non ti importa cosa sia. Nella maggior parte dei codelab, dovrai fare riferimento al tuo ID progetto (in genere identificato come PROJECT_ID). Se l'ID generato non ti soddisfa, potresti generarne un altro casuale. In alternativa, puoi provarne una personalizzata per verificare se è disponibile. Non può essere modificato dopo questo passaggio e rimane per tutta la durata del progetto.
  • Per informazione, c'è un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare risorse/API Cloud. L'esecuzione di questo codelab non ha alcun costo. Per arrestare le risorse ed evitare di incorrere in fatturazione dopo questo tutorial, puoi eliminare le risorse che hai creato o eliminare il progetto. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.

Avvia Cloud Shell

Mentre Google Cloud può essere utilizzato 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. Dalla console Cloud, fai clic su Attiva Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png

Se è la prima volta che avvii Cloud Shell, ti verrà mostrata una schermata intermedia che descrive di cosa si tratta. Se ti è stata presentata una schermata intermedia, fai clic su Continua.

9c92662c6a846a5c.png

Il provisioning e la connessione a Cloud Shell dovrebbero richiedere solo qualche istante.

9f0e51b578fecce5.png

Questa macchina virtuale viene 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 di rete e l'autenticazione. Gran parte, se non tutto, del lavoro in questo codelab può essere svolto con un browser.

Una volta stabilita la connessione a Cloud Shell, dovresti vedere che hai eseguito l'autenticazione e che 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 confermare che il comando gcloud è a conoscenza del 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 questo comando 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.

Passa alla tua 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 dell'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 ...

A questo punto 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]:

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

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

Richiama la funzione:

list_languages()

Dovresti visualizzare il seguente elenco (o un elenco più ampio):

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

  • Cinese e mandarino taiwanese,
  • inglese australiano, britannico, indiano e americano,
  • Francese da Canada e Francia,
  • Portoghese dal Brasile e dal Portogallo.

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

Riepilogo

Questo passaggio ti ha consentito di elencare le lingue supportate.

5. Elenco voci disponibili

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

Copia il seguente codice nella tua 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 allo studio del codice e scopri come utilizza il metodo della libreria client list_voices(language_code) per elencare le voci disponibili per una determinata lingua.

Ora, recupera 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, oltre a voci standard, WaveNet, Neural2 e Studio:

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

Ora, recupera l'elenco delle voci inglesi disponibili:

list_voices("en")

Dovresti ottenere qualcosa del genere:

------------------------ 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 genere e qualità diversi, sono disponibili diversi accenti: inglese australiano, britannico, indiano e americano.

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

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

Riepilogo

Questo passaggio ti ha consentito di elencare le voci disponibili. Scopri 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 diversi modi, ad esempio selezionando una voce univoca o modulando l'output in termini di tonalità, volume, velocità del parlato e frequenza di campionamento.

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

Dedica un momento a studiare il codice e scopri in che modo utilizza il metodo della libreria client synthesize_speech per generare i dati audio e salvarli come file wav.

Ora genera frasi con diversi accenti:

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 di Cloud Shell dal tuo ambiente Python:

!cloudshell download *.wav

Convalida i file nel browser:

44382e3b7a3314b0.png 4dbccf007cd73b91.png

Apri ciascun file e ascolta il risultato.

Riepilogo

In questo passaggio hai potuto utilizzare l'API Text-to-Speech per convertire 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 usando Python per generare una sintesi vocale simile a quella umana.

Esegui la pulizia

Per ripulire il tuo ambiente di sviluppo, da Cloud Shell:

  • Se sei ancora nella sessione Python, 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 tuo progetto Google Cloud, da Cloud Shell:

  • Recupera il tuo ID progetto attuale: PROJECT_ID=$(gcloud config get-value core/project)
  • Assicurati che questo 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.