Como sintetizar voz no Python

Eu gosto muito de programas e scripts com sintetização de voz.
Sei que nem sempre são adequados — principalmente se houver outro computador/usuário interagindo no mesmo recinto.

Às vezes, contudo, é uma ótima forma de obter retorno das nossas ações, entre outros tipos de informações.
O recurso pode ser usado para dar um feedback discreto sobre o andamento de alguma tarefa em execução no segundo plano.

Se é para brincar e aprender, também vale “soltar a língua” desta máquina e ter alguns momentos de diversão.

Neste post, pretendo falar de 2 métodos (entre tantos outros) bastante simples para obter voz do seu computador, usando o Python.
Abra a shell do Python e vamos lá.

Use o sintetizador de voz do próprio sistema operacional

Muitos sistemas operacionais têm seus próprios recursos de sintetização de voz.
Tudo o que você precisa fazer é repassar esta parte do trabalho para o SO, de dentro do seu script Python.
No meu exemplo, uso o sistema operacional Debian Linux, com o sintetizador espeak.
Se você também usa o Linux, pode instalar o espeak e fazer a experiência, a seguir.
Veja como acionar o espeak, de dentro de um script Python.

>>> import os
>>> os.system("espeak -vpt 'Python é uma ótima linguagem de programação!'")
0

Outra forma de fazer, dentro da plataforma Linux, com o espeak, é a seguinte:

>>> from subprocess import call
>>> minhafala = "sintetização de voz com Python."
>>> call(["espeak",minhafala])
0

Instale e uso o módulo Python do espeak

É possível instalar um módulo do espeak para Python.
No Debian e no Ubuntu, isto pode ser feito com o apt, da seguinte forma:

sudo apt install python3-espeak

Quem usa outros sistemas operacionais, pode usar o pip, para instalá-lo:

pip3 install espeak3

Se você usar a opção “search” do pip, vai encontrar outras alternativas de sintetização de voz para Python.

Uma vez instalado o módulo, volte para a Python shell e teste:

>>> from espeak import espeak
>>> espeak.synth("Não posso deixá-lo fazer isto, Dave!")
True

Use a documentação do módulo, dentro da shell, para descobrir novas possibilidades:

help(espeak)

Como alterar o idioma da sintetização de voz do espeak, no Python

Há várias vozes — de nacionalidades e sotaques diferentes — embutidas no módulo.
Veja como obter uma lista delas:


>>> espeak.list_voices()

[{'name': 'afrikaans', 'variant': None, 'identifier': 'other/af', 'gender': 1, 'age': None}, {'name': 'aragonese', 'variant': None, 'identifier': 'europe/an', 'gender': 1, 'age': None}, {'name': 'bulgarian', 'variant': None, 'identifier': 'europe/bg', 'gender': None, 'age': None}, {'name': 'bosnian', 'variant': None, 'identifier': 'europe/bs', 'gender': 1, 'age': None}, {'name': 'catalan', 'variant': None, 'identifier': 'europe/ca', 'gender': 1, 'age': None}, {'name': 'czech', 'variant': None, 'identifier': 'europe/cs', 'gender': 1, 'age': None}, {'name': 'welsh', 'variant': None, 'identifier': 'europe/cy', 'gender': 1, 'age': None}, {'name': 'danish', 'variant': None, 'identifier': 'europe/da', 'gender': 1, 'age': None}, {'name': 'german', 'variant': None, 'identifier': 'de', 'gender': 1, 'age': None}, {'name': 'greek', 'variant': None, 'identifier': 'europe/el', 'gender': 1, 'age': None}, {'name': 'default', 'variant': None, 'identifier': 'default', 'gender': 1, 'age': None}, {'name': 'english', 'variant': None, 'identifier': 'en', 'gender': 1, 'age': None}, {'name': 'en-scottish', 'variant': None, 'identifier': 'other/en-sc', 'gender': 1, 'age': None}, {'name': 'english-north', 'variant': None, 'identifier': 'other/en-n', 'gender': 1, 'age': None}, {'name': 'english_rp', 'variant': None, 'identifier': 'other/en-rp', 'gender': 1, 'age': None}, {'name': 'english_wmids', 'variant': None, 'identifier': 'other/en-wm', 'gender': 1, 'age': None}, {'name': 'english-us', 'variant': None, 'identifier': 'en-us', 'gender': 1, 'age': None}, {'name': 'en-westindies', 'variant': None, 'identifier': 'other/en-wi', 'gender': 1, 'age': None}, {'name': 'esperanto', 'variant': None, 'identifier': 'other/eo', 'gender': 1, 'age': None}, {'name': 'spanish', 'variant': None, 'identifier': 'europe/es', 'gender': 1, 'age': None}, {'name': 'spanish-latin-am', 'variant': None, 'identifier': 'es-la', 'gender': 1, 'age': None}, {'name': 'estonian', 'variant': None, 'identifier': 'europe/et', 'gender': None, 'age': None}, {'name': 'persian', 'variant': None, 'identifier': 'asia/fa', 'gender': None, 'age': None}, {'name': 'persian-pinglish', 'variant': None, 'identifier': 'asia/fa-pin', 'gender': None, 'age': None}, {'name': 'finnish', 'variant': None, 'identifier': 'europe/fi', 'gender': 1, 'age': None}, {'name': 'french-Belgium', 'variant': None, 'identifier': 'europe/fr-be', 'gender': 1, 'age': None}, {'name': 'french', 'variant': None, 'identifier': 'fr', 'gender': 1, 'age': None}, {'name': 'irish-gaeilge', 'variant': None, 'identifier': 'europe/ga', 'gender': None, 'age': None}, {'name': 'greek-ancient', 'variant': None, 'identifier': 'other/grc', 'gender': 1, 'age': None}, {'name': 'hindi', 'variant': None, 'identifier': 'asia/hi', 'gender': 1, 'age': None}, {'name': 'croatian', 'variant': None, 'identifier': 'europe/hr', 'gender': 1, 'age': None}, {'name': 'hungarian', 'variant': None, 'identifier': 'europe/hu', 'gender': 1, 'age': None}, {'name': 'armenian', 'variant': None, 'identifier': 'asia/hy', 'gender': 1, 'age': None}, {'name': 'armenian-west', 'variant': None, 'identifier': 'asia/hy-west', 'gender': 1, 'age': None}, {'name': 'indonesian', 'variant': None, 'identifier': 'asia/id', 'gender': 1, 'age': None}, {'name': 'icelandic', 'variant': None, 'identifier': 'europe/is', 'gender': 1, 'age': None}, {'name': 'italian', 'variant': None, 'identifier': 'europe/it', 'gender': 1, 'age': None}, {'name': 'lojban', 'variant': None, 'identifier': 'other/jbo', 'gender': None, 'age': None}, {'name': 'georgian', 'variant': None, 'identifier': 'asia/ka', 'gender': None, 'age': None}, {'name': 'kannada', 'variant': None, 'identifier': 'asia/kn', 'gender': None, 'age': None}, {'name': 'kurdish', 'variant': None, 'identifier': 'asia/ku', 'gender': 1, 'age': None}, {'name': 'latin', 'variant': None, 'identifier': 'other/la', 'gender': 1, 'age': None}, {'name': 'lingua_franca_nova', 'variant': None, 'identifier': 'other/lfn', 'gender': 1, 'age': None}, {'name': 'lithuanian', 'variant': None, 'identifier': 'europe/lt', 'gender': 1, 'age': None}, {'name': 'latvian', 'variant': None, 'identifier': 'europe/lv', 'gender': 1, 'age': None}, {'name': 'macedonian', 'variant': None, 'identifier': 'europe/mk', 'gender': 1, 'age': None}, {'name': 'malayalam', 'variant': None, 'identifier': 'asia/ml', 'gender': 1, 'age': None}, {'name': 'malay', 'variant': None, 'identifier': 'asia/ms', 'gender': 1, 'age': None}, {'name': 'nepali', 'variant': None, 'identifier': 'asia/ne', 'gender': 1, 'age': None}, {'name': 'dutch', 'variant': None, 'identifier': 'europe/nl', 'gender': 1, 'age': None}, {'name': 'norwegian', 'variant': None, 'identifier': 'europe/no', 'gender': 1, 'age': None}, {'name': 'punjabi', 'variant': None, 'identifier': 'asia/pa', 'gender': None, 'age': None}, {'name': 'polish', 'variant': None, 'identifier': 'europe/pl', 'gender': 1, 'age': None}, {'name': 'brazil', 'variant': None, 'identifier': 'pt', 'gender': 1, 'age': None}, {'name': 'portugal', 'variant': None, 'identifier': 'europe/pt-pt', 'gender': 1, 'age': None}, {'name': 'romanian', 'variant': None, 'identifier': 'europe/ro', 'gender': 1, 'age': None}, {'name': 'russian', 'variant': None, 'identifier': 'europe/ru', 'gender': 1, 'age': None}, {'name': 'slovak', 'variant': None, 'identifier': 'europe/sk', 'gender': 1, 'age': None}, {'name': 'albanian', 'variant': None, 'identifier': 'europe/sq', 'gender': 1, 'age': None}, {'name': 'serbian', 'variant': None, 'identifier': 'europe/sr', 'gender': 1, 'age': None}, {'name': 'swedish', 'variant': None, 'identifier': 'europe/sv', 'gender': 1, 'age': None}, {'name': 'swahili-test', 'variant': None, 'identifier': 'other/sw', 'gender': 1, 'age': None}, {'name': 'tamil', 'variant': None, 'identifier': 'asia/ta', 'gender': 1, 'age': None}, {'name': 'turkish', 'variant': None, 'identifier': 'asia/tr', 'gender': 1, 'age': None}, {'name': 'vietnam', 'variant': None, 'identifier': 'asia/vi', 'gender': 1, 'age': None}, {'name': 'vietnam_hue', 'variant': None, 'identifier': 'asia/vi-hue', 'gender': 1, 'age': None}, {'name': 'vietnam_sgn', 'variant': None, 'identifier': 'asia/vi-sgn', 'gender': 1, 'age': None}, {'name': 'Mandarin', 'variant': None, 'identifier': 'asia/zh', 'gender': 1, 'age': None}, {'name': 'cantonese', 'variant': None, 'identifier': 'asia/zh-yue', 'gender': 1, 'age': None}]

Se você quiser o idioma e o sotaque do português falado em Portugal, use o seguinte ajuste:

>>> espeak.set_voice('portugal')
True
>>> espeak.synth("Sintetizador de voz em Python, com o sotaque português europeu")
True

A quem preferir o sotaque (genérico) brasileiro, faça o ajuste assim:

>>> espeak.set_voice('brazil')
True
>>> espeak.synth("Sintetizador de voz em Python, com o sotaque brasileiro")
True

Este é o básico da sintetização de voz, no Python.
Acho útil para usar em scripts que rodam em background e que possam informar sobre algum evento que precise da intervenção do usuário, para avisar que alguma tarefa foi concluída etc.

Referências

https://elias.praciano.com/2014/10/como-sintetizar-voz-com-o-espeak/.

https://stackoverflow.com/questions/1614059/how-to-make-python-speak.

http://espeak.sourceforge.net/samples.html.

https://launchpad.net/python-espeak.

Assinar blog por e-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.

Junte-se a 47 outros assinantes

Deixe uma resposta