Aprenda a utilizar um sintetizador de voz no Python com pyttsx3

Na era dos assistentes virtuais e chatbots, a síntese de voz é um recurso cada vez mais utilizado para dar suporte à interação com o usuário. Antigamente, era difícil encontrar um sintetizador de voz com qualidade satisfatória e gratuito. Felizmente, a coisa mudou e, hoje em dia, já existem bibliotecas que permitem que a gente utilize síntese de voz em nossas próprias aplicações, e sem muito mistério!

No post de hoje, vou mostrar uma biblioteca de Python chamada pyttsx3, que possibilita realizar síntese de voz a partir de texto (Text to Speech, ou TTS) de uma maneira bastante simples. Descobri essa biblioteca enquanto trabalhava no meu chatbot feat. assistente virtual, apelidado carinhosamente de Geraldo, do qual já falei em outro post.

Essa biblioteca, na verdade, implementa drivers que acessam um sintetizador de voz presente no sistema operacional para oferecer funcionalidades de síntese de voz de dentro do Python. Ou seja, antes de poder utilizar o programa, é necessário instalar um sintetizador de voz.

Instalando o sintetizador espeak e a biblioteca pyttsx3

No Linux, o único sintetizador de voz compatível com o pyttsx3 é o espeak, que pode ser facilmente instalado através do comando (Debian / Ubuntu):

sudo apt-get install espeak

De acordo com a documentação da biblioteca pyttsx3, usuários Windows devem o sintetizador SAPI5, e usuários Mac devem utilizar o NSSpeechSynthesizer.

A biblioteca, por sua vez, pode ser instalada através do comando pip. No Linux, basta rodar:

pip install pyttsx3

ou

pip3 install pyttsx3

O espeak é um sintetizador que utiliza uma técnica chamada síntese de formantes, que não utiliza vozes humanas como base para a síntese de voz, o que faz com que as vozes produzidas por ele soem um tanto “robóticas”. Isso pode ser um problema ou não, a depender da sua aplicação. E lembre-se, o que define as vozes possíveis de serem utilizadas é o sintetizador, que varia de acordo com o sistema operacional, e não a biblioteca pyttsx3! Mas vamos lá.

Inicializando o pyttsx3

Para começar nossas experiências com o pyttsx3, abra o interpretador interativo do Python depois de instalar a biblioteca pyttsx3 e o espeak (ou o sintetizador adequado para seu SO), e importe a biblioteca:

import pyttsx3

Agora, devemos instanciar a engine do sintetizador, através da factory function init():

engine = pyttsx3.init()

Opcionalmente, podemos passar o parâmetro driverName para essa função para especificar o driver a ser utilizado para a síntese, mas caso não passemos nada, o pyttsx3 vai procurar e escolher o melhor driver automaticamente.

Agora que temos uma instância da engine, temos que escolher a voz que vamos utilizar em nosso programa. Isso é importante, porque devemos escolher uma voz que possua suporte para a língua que vamos utilizar, caso contrário, as falas sairão com um “sotaque” esquisito e muitas vezes incompreensível.

Analisando as vozes disponíveis no pyttsx3

No pyttsx3, podemos obter as vozes disponíveis através do método getProperty(“voices”):

voices = engine.getProperty("voices") 

Agora, temos uma lista de vozes, armazenada na variável voices. Um objeto do tipo voice conta com alguns atributos para descrevê-lo, como id, que contém um identificador da voz, languages, uma lista de línguas que a voz suporta, e name,que traz uma string com o nome da língua.

Então, podemos extrair informações da nossa lista de vozes com esse pequeno snippet:

for voice in voices:
     print(voice.id, voice.name, voice.languages)

Parte da saída:

norwegian norwegian [b'\x05no']
punjabi punjabi [b'\x05pa']
polish polish [b'\x05pl']
brazil brazil [b'\x05pt-br']
portugal portugal [b'\x05pt-pt']
romanian romanian [b'\x05ro']
russian russian [b'\x05ru']
slovak slovak [b'\x05sk']

Se você estiver utilizando Linux com espeak, deve ter percebido que a id da língua tem os mesmos valores que name, e languages armazena um objeto do tipo bytes que não nos ajuda em nada. Ou seja, no driver do espeak, o id de uma voice corresponde à língua suportada por essa voice.

Na saída do código acima, podemos ver que existe uma voz “brazil” para português do Brasil e uma “portugal” para português de Portugal. Essas provavelmente são as vozes que te interessam agora (a depender da sua localização).

Configurando as propriedades da engine no pyttsx3

Agora que já achamos a voz que queremos utilizar (a que tem o id “brazil” ou “portugal”), podemos configurar as propriedades da engine para utilizar essa voz através do método setProperty(). Esse método recebe dois argumentos, uma string com o nome da propriedade a ser modificada, e o valor correspondente. Além da própria voz, também podemos modificar a velocidade e volume da voz.

Nome da propriedadeValorDescrição
“voice”Uma stringO id da voz desejada, por exemplo “brazil”
“rate”Um inteiro, valor padrão: 200A velocidade da fala, em palavras por minuto
“volume”Um float, valor padrão: 1.Volume do áudio, de 0. a 1.
Argumentos possíveis para o método setProperty()

A sequência de comandos a seguir altera a voz para português do Brasil, a velocidade para 120 palavras/minuto e configura o volume para o máximo.

engine.setProperty("voice", "brazil")
engine.setProperty("rate", 120)
engine.setProperty("volume", 1.)

Note que o “.” logo depois de 1 serve apenas para deixar explícito que o número em questão se trata de um float, e é equivalente a escrever “1.0”.

Transformando texto em voz com pyttsx3

Agora chegou o grande momento, vamos colocar nosso programa pra falar! Para isso, basta utilizar o método say() para definir as frases que queremos que a engine sintetize, e depois utilizar o método runAndWait() para executar todos os comandos que estão na fila. Esse método bloqueia o programa enquanto executa todos comandos colocados na fila de execução da engine. Vamos fazer nosso teste:

engine.say("amador")
engine.say("programa")
engine.runAndWait() 

Pronto, agora que você já sabe fazer seu programa em Python falar, o céu é o limite!

Entendendo a fila de comandos da engine pyttsx3

Se você fez o teste no interpretador interativo digitando um comando por vez, deve ter percebido que o sintetizador só começa a “falar”, quando invocamos o método runAndWait(). Isso ocorre porque quando invocamos métodos como setProperty() e say(), estamos, na verdade, inserindo um comando na fila de processamento da engine. Quando invocamos runAndWait(), os comandos começam a ser invocados na ordem em que foram enviados para a engine. Isso vale tanto para falas, quanto para alterações nas propriedades. Por exemplo:

engine.setProperty("voice", "portugal")
engine.setProperty("rate", 200)
engine.setProperty("volume", 0.7)
engine.say("Sou português")
engine.say("Nascido em Lisboa")

engine.setProperty("voice", "brazil")
engine.setProperty("rate", 120)
engine.setProperty("volume", 1.)
engine.say("Sou brasileiro")
engine.say("Nascido no Rio de Janeiro")

engine.runAndWait()

Se você rodar esse código, vai perceber que quando invocamos setProperty(), a alteração se aplica a todas as falas que forem colocadas na fila depois da alteração na propriedade, até que setProperty() seja utilizado para modificar uma propriedade novamente.

Exemplo completo de síntese de voz com pyttsx3

Os exemplos que dei até o momento foram todos executados no interpretador interativo do Python, no terminal. Agora que você já pegou o jeito da coisa, podemos criar um script para rodar de modo independente.

Nosso programa será muito simples: ele vai esperar a entrada do usuário e falar tudo que o usuário digitar, até ele escrever “sair!” (Nota: pra facilitar a sua vida, você pode baixar o código desse e dos outros tutoriais do blog direto do repositório do blog no Github):

import pyttsx3
  
#Inicializa a engine
engine = pyttsx3.init()

#Envia comandos para alterar as propriedades
#de voz e velocidade
engine.setProperty("voice", "brazil")
engine.setProperty("rate", 120)

#Processa as modificações feitas até o momento
engine.runAndWait() 


#Loop principal
while True:
    #Pega a entrada do usuário
    frase = input(">") 
    if frase != "sair!":
        #Coloca frase na fila de processamento da engine
        engine.say(frase)
        #Executa os comandos da fila (no caso, say(frase) )
        engine.runAndWait()
    
    else:
        break

Se você leu o artigo todo, não deve ter tido dificuldades para entender o código acima.

Conhecendo esses métodos, você já tem o suficiente para por várias ideias em prática. Mas caso você precise de algo um pouco mais complexo, a biblioteca pyttsx3 também oferece suporte a eventos, ou seja, você pode definir funções de callback, que serão executadas toda vez que ocorrer um evento como o início ou fim de uma fala, ou o início ou fim de uma palavra da fala. Para saber mais sobre esses recursos, você pode dar uma olhada na documentação da biblioteca.

Espero que você tenha curtido esse post. Depois de colocar seu programa pra falar, seria interessante conseguir fazê-lo entender o que você fala, transformando voz em texto. Isso é um pouquinho mais complicado, mas também é possível, e eu explico como fazer isso no Python com uma biblioteca chamada Vosk nesse link aqui.

Related Posts

11 thoughts on “Aprenda a utilizar um sintetizador de voz no Python com pyttsx3

  1. Genial ! Li e assisti diversos conteúdos na internet, principalmente acerca da linguagem, e este foi sem dúvidas o mais explicativo e completo. Muito obrigado!

  2. Quando eu pus a apresentar as línguas que tem disponíveis só obtive duas:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-US_ZIRA_11.0 Microsoft Zira Desktop – English (United States) []
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-US_DAVID_11.0 Microsoft David Desktop – English (United States) []

    Como faço para obter mais algumas?

    1. Oi, José! Desculpe a demora em responder. Infelizmente, não sou muito familiarizado com o Windows, então não posso dar uma resposta definitiva. Sei que no Windows, o pttsx3 utiliza a engine SAPI5. Creio que você deva instalar novas vozes manualmente através do executável. Procurando no Google, encontrei esse site aqui que tem uma voz em português: http://zero2000.com/free-text-to-speech-natural-voices.html

      Se você tentar e der certo, por favor, me dá um retorno, que eu atualizo o post pra acrescentar essa informação!

    1. Oi, Gustavo! Pra mudar a voz, você deve utilizar o comando engine.setProperty(“voice”, ID), onde ID é o identificador da voz. Você consegue uma lista de vozes disponíveis através das instruções:

      voices = engine.getProperty(“voices”)
      for voice in voices:
      print(voice.id, voice.name, voice.languages)

      Se o seu problema é não ter uma grande variedade de vozes pra escolher, a solução vai depender do seu sistema operacional. No Linux, que utiliza a engine espeak, só tem duas opções de voz pra português (BR ou Portugal). No Windows, você pode tentar fazer o que sugeri na resposta pro comentário de José Alberto.

  3. estou tentando criar uma assistente virtual e me ajudou muito mesmo e sobre as vozes queria saber se tem como colocar uma voz de homem parecido com javis — não sei nada de programação ainda–

    1. Opa, beleza? Que bom que o post te ajudou! Então, eu nao sei o que é javis, mas as opções que você tem de vozes são limitadas pela engine que o pyttsx3 usa. Com o pyttsx3 no linux, você só tem uma opção de voz (que é gerada pelo espeak) Existe uma biblioteca python chamada voxpopuli que usa as vozes de uma engine chamada mbrola. Ela tem algumas opções diferentes de vozes pra o português. Da pra instalar o mbrola bem fácil no Linux, mas no Windows e Mac da um trabalhinho porque precisaria compilar o mbrola manualmente. Se você usa windows, em outro comentário aqui eu compartilhei um link que (supostamente) disponibiliza mais opções de vozes. Espero ter ajudado!

      1. Ah, sim! Esqueci de mencionar que na seção de Projetos tem um post sobre uma Assistente Virtual que fiz em Python com o link pro código no github!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *