Como usar a API Text-to-Speech com o Python

1. Visão geral

1215f38908082356.png

A API Text-to-Speech permite que os desenvolvedores gerem falas semelhantes às humanas. A API converte texto em formatos de áudio, como WAV, MP3 ou Ogg Opus. Ele também é compatível com entradas de Linguagem de marcação de síntese de fala (SSML, na sigla em inglês) para especificar pausas, números, formatação de data e hora e outras instruções de pronúncia.

Neste tutorial, você vai usar a API Text-to-Speech com o Python.

O que você vai aprender

  • Como configurar o ambiente
  • Como listar os idiomas compatíveis
  • Como listar as vozes disponíveis
  • Como sintetizar áudio a partir de texto

O que é necessário

  • um projeto do Google Cloud;
  • Use um navegador, como o Chrome ou o Firefox.
  • Familiaridade com Python

Pesquisa

Como você vai usar este tutorial?

Apenas leitura Ler e fazer os exercícios

Como você classificaria sua experiência com Python?

Iniciante Intermediário Proficiente

Como você classificaria sua experiência com os serviços do Google Cloud?

Iniciante Intermediário Proficiente

2. Configuração e requisitos

Configuração de ambiente autoguiada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google e pode ser atualizada quando você quiser.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto.
  • Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não vai ser muito cara, se tiver algum custo. Para encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou exclua o projeto. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Inicie o Cloud Shell

Embora o Google Cloud possa ser operado remotamente em um laptop, neste codelab você vai usar o Cloud Shell, um ambiente de linha de comando executado no Cloud.

Ativar o Cloud Shell

  1. No Console do Cloud, clique em Ativar o Cloud Shell853e55310c205094.png.

3c1dabeca90e44e5.png.

Se você estiver iniciando o Cloud Shell pela primeira vez, verá uma tela intermediária com a descrição dele. Se aparecer uma tela intermediária, clique em Continuar.

9c92662c6a846a5c.png

Leva apenas alguns instantes para provisionar e se conectar ao Cloud Shell.

9f0e51b578fecce5.png

Essa máquina virtual tem todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Grande parte do trabalho neste codelab, se não todo, pode ser feito em um navegador.

Depois de se conectar ao Cloud Shell, você verá sua autenticação e o projeto estará configurado com o ID do seu projeto.

  1. Execute o seguinte comando no Cloud Shell para confirmar se a conta está autenticada:
gcloud auth list

Resposta ao comando

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Execute o seguinte comando no Cloud Shell para confirmar que o comando gcloud sabe sobre seu projeto:
gcloud config list project

Resposta ao comando

[core]
project = <PROJECT_ID>

Se o projeto não estiver configurado, configure-o usando este comando:

gcloud config set project <PROJECT_ID>

Resposta ao comando

Updated property [core/project].

3. Configuração do ambiente

Antes de começar a usar a API Text-to-Speech, execute o seguinte comando no Cloud Shell para ativá-la:

gcloud services enable texttospeech.googleapis.com

Você verá algo como:

Operation "operations/..." finished successfully.

Agora, você pode usar a API Text-to-Speech!

Navegue até seu diretório principal:

cd ~

Crie um ambiente virtual de Python para isolar as dependências:

virtualenv venv-texttospeech

Ative o ambiente virtual:

source venv-texttospeech/bin/activate

Instale o IPython e a biblioteca de cliente da API Text-to-Speech:

pip install ipython google-cloud-texttospeech

Você verá algo como:

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

Agora, você já pode usar a biblioteca de cliente da API Text-to-Speech.

Nas próximas etapas, você vai usar um interpretador de Python interativo chamado IPython, que foi instalado na etapa anterior. Inicie uma sessão executando ipython no Cloud Shell:

ipython

Você verá algo como:

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

Você já pode fazer sua primeira solicitação e listar os idiomas compatíveis...

4. Lista de idiomas compatíveis

Nesta seção, você vai encontrar a lista de todos os idiomas compatíveis.

Copie o código a seguir na sessão do 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 "")
        

Estude o código e confira como ele usa o método da biblioteca de cliente list_voices para criar a lista de linguagens com suporte.

Como chamar a função:

list_languages()

Você vai receber a seguinte lista (ou uma lista maior):

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

A lista mostra 58 idiomas e variantes, como:

  • chinês e mandarim taiwanês,
  • inglês australiano, britânico, indiano e americano,
  • francês do Canadá e da França,
  • Português do Brasil e de Portugal.

Essa lista não é fixa e aumenta conforme novas vozes são disponibilizadas.

Resumo

Nesta etapa, você pode listar os idiomas disponíveis.

5. Listar vozes disponíveis

Nesta seção, você vai receber a lista de vozes disponíveis em diferentes idiomas.

Copie o código a seguir na sessão do 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")
        

Reserve um tempo para estudar o código e ver como ele usa o método da biblioteca de cliente list_voices(language_code) para listar vozes disponíveis em um determinado idioma.

Confira a lista de vozes disponíveis em alemão:

list_voices("de")

Você verá algo como:

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

Várias vozes femininas e masculinas estão disponíveis, bem como vozes padrão, WaveNet, Neural2 e Studio:

  • As vozes padrão são geradas por algoritmos de processamento de sinal.
  • As vozes WaveNet, Neural2 e Studio são de maior qualidade sintetizadas por modelos de aprendizado de máquina e soam mais naturais.

Veja a lista de vozes disponíveis em inglês:

list_voices("en")

O resultado será parecido com este:

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

Além de uma seleção de várias vozes em diferentes gêneros e qualidades, vários sotaques estão disponíveis: inglês australiano, britânico, indiano e americano.

Liste as vozes disponíveis para seus idiomas e variantes preferidos (ou para todos eles):

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

Resumo

Esta etapa permitiu que você listasse as vozes disponíveis. Leia mais sobre as vozes e idiomas compatíveis.

6. Sintetizar áudio de texto

Use a API Text-to-Speech para converter uma string em dados de áudio. Você pode configurar a saída da síntese de fala de várias maneiras, incluindo selecionando uma voz exclusiva ou modulando o tom, o volume, a velocidade de fala e a taxa de amostragem da saída.

Copie o código a seguir na sessão do 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}"')
        

Estude o código e confira como ele usa o método da biblioteca de cliente synthesize_speech para gerar os dados de áudio e salvá-los como um arquivo wav.

Agora, gere frases com alguns sotaques diferentes:

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

Você verá algo como:

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"

Para fazer o download de todos os arquivos gerados de uma só vez, use este comando do Cloud Shell no ambiente Python:

!cloudshell download *.wav

Valide e seu navegador fará o download dos arquivos:

44382e3b7a3314b0.png 4dbccf007cd73b91.png

Abra cada arquivo e ouça o resultado.

Resumo

Nesta etapa, você conseguiu usar a API Text-to-Speech para converter frases em arquivos wav de áudio. Leia mais sobre como criar arquivos de áudio de voz.

7. Parabéns!

1215f38908082356.png

Você aprendeu a usar a API Text-to-Speech com Python para gerar falas semelhantes às humanas.

Limpar

Para limpar seu ambiente de desenvolvimento, faça o seguinte no Cloud Shell:

  • Se você ainda estiver na sessão do IPython, volte para o shell: exit
  • Pare de usar o ambiente virtual do Python: deactivate
  • Exclua a pasta do ambiente virtual: cd ~ ; rm -rf ./venv-texttospeech

Para excluir seu projeto do Google Cloud usando o Cloud Shell:

  • Recupere seu ID do projeto atual: PROJECT_ID=$(gcloud config get-value core/project)
  • Verifique se este é o projeto que você quer excluir: echo $PROJECT_ID
  • Exclua o projeto: gcloud projects delete $PROJECT_ID

Saiba mais

Licença

Este conteúdo está sob a licença Atribuição 2.0 Genérica da Creative Commons.