converter texto em fala usando o PythonConvert text-to-speech using Python

Neste artigo, você aprenderá a converter texto em fala usando o Python e a API REST de Conversão de Texto em Fala.In this article, you'll learn how to convert text-to-speech using Python and the text-to-speech REST API. O corpo da solicitação neste guia é estruturado como Linguagem de marcação de síntese de Fala (SSML), que permite escolher a voz e o idioma da resposta.The request body in this guide is structured as Speech Synthesis Markup Language (SSML), which allows you to choose the voice and language of the response.

Este artigo exige uma conta dos Serviços Cognitivos do Azure com o recurso do serviço de Fala.This article requires an Azure Cognitive Services account with a Speech service resource. Se não tiver uma conta, você poderá usar a avaliação gratuita para obter uma chave de assinatura.If you don't have an account, you can use the free trial to get a subscription key.

Pré-requisitosPrerequisites

Criar um projeto e importar os módulos necessáriosCreate a project and import required modules

Crie um novo projeto Python usando seu IDE ou editor favorito.Create a new Python project using your favorite IDE or editor. Em seguida, copie esse snippet de código para seu projeto em um arquivo denominado tts.py.Then copy this code snippet into your project in a file named tts.py.

import os
import requests
import time
from xml.etree import ElementTree

Observação

Se você nunca usou esses módulos, você precisará instalá-los antes de executar o programa.If you haven't used these modules you'll need to install them before running your program. Para instalar esses pacotes, execute: pip install requests.To install these packages, run: pip install requests.

Esses módulos são usados para gravar a resposta de fala em um arquivo com um registro de data e hora, construir a solicitação de HTTP e chamar a API de conversão de texto em fala.These modules are used to write the speech response to a file with a timestamp, construct the HTTP request, and call the text-to-speech API.

Defina a chave de assinatura e crie um prompt para o TTSSet the subscription key and create a prompt for TTS

Nas próximas seções, você criará métodos para manipular a autorização, chamar a API de conversão de texto em fala e validar a resposta.In the next few sections you'll create methods to handle authorization, call the text-to-speech API, and validate the response. Vamos começar adicionando algum código que garante que esse exemplo funcionará com o Python 2.7.xe 3.x.Let's start by adding some code that makes sure this sample will work with Python 2.7.x and 3.x.

try:
    input = raw_input
except NameError:
    pass

Em seguida, vamos criar uma classe.Next, let's create a class. É onde colocaremos nossos métodos para troca de tokens e chamaremos a API text-to-speech.This is where we'll put our methods for token exchange, and calling the text-to-speech API.

class TextToSpeech(object):
    def __init__(self, subscription_key):
        self.subscription_key = subscription_key
        self.tts = input("What would you like to convert to speech: ")
        self.timestr = time.strftime("%Y%m%d-%H%M")
        self.access_token = None

A subscription_key é sua chave exclusiva do portal do Azure.The subscription_key is your unique key from the Azure portal. tts solicita que o usuário insira o texto que será convertido em fala.tts prompts the user to enter text that will be converted to speech. Essa entrada é uma cadeia de caracteres literal, para que os caracteres não devem ser escapados.This input is a string literal, so characters don't need to be escaped. Por fim, timestr obtém a hora atual, que usaremos para nomear o arquivo.Finally, timestr gets the current time, which we'll use to name your file.

Obter um token de acessoGet an access token

A API REST de conversão de texto em fala requer um token de acesso para autenticação.The text-to-speech REST API requires an access token for authentication. Para obter um token de acesso, é necessária uma troca.To get an access token, an exchange is required. Este exemplo troca sua chave de assinatura do serviço de Fala por um token de acesso usando o ponto de extremidade issueToken.This sample exchanges your Speech service subscription key for an access token using the issueToken endpoint.

Este exemplo pressupõe que a sua assinatura do serviço de Fala esteja na região Oeste dos EUA.This sample assumes that your Speech service subscription is in the West US region. Se você estiver usando uma região diferente, atualize o valor para fetch_token_url.If you're using a different region, update the value for fetch_token_url. Para uma lista completa, consulte Regiões.For a full list, see Regions.

Copie este código para a classe TextToSpeech:Copy this code into the TextToSpeech class:

def get_token(self):
    fetch_token_url = "https://westus.api.cognitive.microsoft.com/sts/v1.0/issueToken"
    headers = {
        'Ocp-Apim-Subscription-Key': self.subscription_key
    }
    response = requests.post(fetch_token_url, headers=headers)
    self.access_token = str(response.text)

Observação

Para obter mais informações sobre autenticação, consulte Autenticar com um token de acesso.For more information on authentication, see Authenticate with an access token.

Faça uma solicitação e salve a respostaMake a request and save the response

Aqui você vai criar a solicitação e salvar a resposta de fala.Here you're going to build the request and save the speech response. Primeiro, você precisa definir base_url e path.First, you need to set the base_url and path. Este exemplo supõe que você esteja usando o endpoint do West US.This sample assumes you're using the West US endpoint. Se o seu recurso estiver registrado em uma região diferente, atualize o base_url.If your resource is registered to a different region, make sure you update the base_url. Para obter mais informações, confira Regiões do serviço de Fala.For more information, see Speech service regions.

Em seguida, você precisa adicionar cabeçalhos obrigatórios para a solicitação.Next, you need to add required headers for the request. Certifique-se de atualizar User-Agent com o nome do seu recurso (localizado no portal do Azure) e defina X-Microsoft-OutputFormat como sua saída de áudio preferida.Make sure that you update User-Agent with the name of your resource (located in the Azure portal), and set X-Microsoft-OutputFormat to your preferred audio output. Para obter uma lista completa dos formatos de saída, consulte Saídas de áudio.For a full list of output formats, see Audio outputs.

Em seguida, construa o corpo da solicitação usando a Linguagem de marcação de síntese de Fala (SSML).Then construct the request body using Speech Synthesis Markup Language (SSML). Esta amostra define a estrutura e usa a entrada tts criada anteriormente.This sample defines the structure, and uses the tts input you created earlier.

Observação

Este exemplo usa a fonte de voz Guy24kRUS.This sample uses the Guy24kRUS voice font. Para obter uma lista completa das vozes / idiomas fornecidos pela Microsoft, consulte Suporte ao idioma.For a complete list of Microsoft provided voices/languages, see Language support. Se você estiver interessado em criar uma voz exclusiva e reconhecível para sua marca, consulte Criando fontes de voz personalizadas.If you're interested in creating a unique, recognizable voice for your brand, see Creating custom voice fonts.

Finalmente, você fará uma solicitação ao serviço.Finally, you'll make a request to the service. Se a solicitação for bem-sucedida e um código de status 200 for retornado, a resposta de fala será gravada em um arquivo com registro de data e hora.If the request is successful, and a 200 status code is returned, the speech response is written to a timestamped file.

Copie este código para a classe TextToSpeech:Copy this code into the TextToSpeech class:

def save_audio(self):
    base_url = 'https://westus.tts.speech.microsoft.com/'
    path = 'cognitiveservices/v1'
    constructed_url = base_url + path
    headers = {
        'Authorization': 'Bearer ' + self.access_token,
        'Content-Type': 'application/ssml+xml',
        'X-Microsoft-OutputFormat': 'riff-24khz-16bit-mono-pcm',
        'User-Agent': 'YOUR_RESOURCE_NAME'
    }
    xml_body = ElementTree.Element('speak', version='1.0')
    xml_body.set('{http://www.w3.org/XML/1998/namespace}lang', 'en-us')
    voice = ElementTree.SubElement(xml_body, 'voice')
    voice.set('{http://www.w3.org/XML/1998/namespace}lang', 'en-US')
    voice.set(
        'name', 'Microsoft Server Speech Text to Speech Voice (en-US, Guy24kRUS)')
    voice.text = self.tts
    body = ElementTree.tostring(xml_body)

    response = requests.post(constructed_url, headers=headers, data=body)
    if response.status_code == 200:
        with open('sample-' + self.timestr + '.wav', 'wb') as audio:
            audio.write(response.content)
            print("\nStatus code: " + str(response.status_code) +
                  "\nYour TTS is ready for playback.\n")
    else:
        print("\nStatus code: " + str(response.status_code) +
              "\nSomething went wrong. Check your subscription key and headers.\n")

Colocar tudo isso juntoPut it all together

Você está quase lá.You're almost done. Se a solicitação for bem-sucedida e um código de status 200 for retornado, a resposta de fala será gravada em um arquivo com registro de data e hora.The last step is to instantiate your class and call your functions.

if __name__ == "__main__":
    subscription_key = "YOUR_KEY_HERE"
    app = TextToSpeech(subscription_key)
    app.get_token()
    app.save_audio()

Executar o aplicativo de exemploRun the sample app

É isso aí, você está pronto para executar seu aplicativo de amostra de texto para fala.That's it, you're ready to run your text-to-speech sample app. Na linha de comando (ou sessão de terminal), navegue até o diretório do projeto e execute:From the command line (or terminal session), navigate to your project directory and run:

python tts.py

Quando solicitado, digite o que você deseja converter de conversão de texto em fala.When prompted, type in whatever you'd like to convert from text-to-speech. Se bem sucedido, o arquivo de fala está localizado na pasta do seu projeto.If successful, the speech file is located in your project folder. Reproduzi-lo usando o player de mídia favorito.Play it using your favorite media player.

Limpar os recursosClean up resources

Remova todas as informações confidenciais do código-fonte do seu aplicativo de exemplo, como as chaves de assinatura.Make sure to remove any confidential information from your sample app's source code, like subscription keys.

Próximas etapasNext steps

Confira tambémSee also