Faça seu programa ler textos em voz alta (dica rápida de Python #1)

Autor: Tim Mossholder (retirada de Unsplash)

Clique aqui para ler a versão em inglês deste artigo.

Neste artigo, você encontrará uma função customizada que faz o seu código ler textos em voz alta. Este recurso pode ser útil, por exemplo, quando queremos que o programa toque uma mensagem de voz para avisar que ele alcançou uma exceção; ou talvez você deseje transformar as suas mensagens de terminal com print() em algo mais divertido, ao fazer com que seu computador “converse” com o usuário. As possibilidades são enormes.

Para utilizar essa função personalizada, você precisa instalar tanto o módulo gtts quanto o pygame, com pip ou outra ferramenta similar. Se o seu sistema operacional for Linux ou macOS, a instalação do módulo pydub também é necessária. Você ainda precisará dos módulos os e time.

Apresento o código completo logo abaixo. Se você conseguir entendê-lo satisfatoriamente, sinta-se à vontade para terminar de ler este artigo aqui e ir testar o código por si mesmo, de imediato. Entretanto, se você quiser uma explicação mais detalhada sobre as partes que compõem a função, eu convido você a continuar a leitura.

PARTE 1: OS PARÂMETROS

Após os import statements (as seis primeiras linhas no código), a função é definida com cinco parâmetros:

- text => a str que deve ser lida em voz alta;

- filename (default: “temp.mp3”) => a str com o nome do arquivo mp3 gerado com a mensagem de voz;

- delete_audio_file (default: True) => um bool que determina se o arquivo mp3 com a mensagem de voz deve ser deletado ou não. No Linux ou no macOS, um arquivo .ogg também será criado, e será esse o arquivo que será tocado;

- language (default: “en”) => uma str com a sigla da língua (cheque a documentação do módulo gtts para maiores informações);

- slow (default: False) => um bool que determina se o programa deve pronunciar a mensagem mais devagar ou não.

PARTE 2: CRIA O ARQUIVO DE ÁUDIO

O objeto gTTS converterá a string do parâmetro text em uma mensagem de voz, que será lida de acordo com as regras fonéticas da língua escolhida no parâmetro language. Se o parâmetro slow for definido como True, a mensagem de voz será pronunciada mais devagar. Este objeto ficará salvo na variável audio. Então, a função customizada chama o método do objeto gTTS para salvar a mensagem de voz como um arquivo mp3, cujo nome será o mesmo do parâmetro filename.

No Linux e no macOS, o arquivo mp3 será convertido para um arquivo .ogg. O mp3 será deletado tão logo ele não seja mais necessário, a menos que o parâmetro delete_audio_file tenha sido setado como False.

PARTE 3: CARREGA E TOCA O ARQUIVO DE ÁUDIO

mixer.init() inicializa o modulo mixer, do pygame. Assim, o código invoca as funções load() e play(), do submódulo music.

Uma importante observação aqui: quando mixer.music.play() é invocada, o código continuará executando rapidamente, rumo ao seu final. Desse modo, se não for estabelecida uma pausa aqui para a execução do código, o arquivo de áudio provavelmente terminará de tocar antes mesmo de que se possa ouvir algo. Esta é a razão para a parte 4 da função personalizada.

PART 4: ESPERA PELO FIM DO ARQUIVO DE ÁUDIO

Esta parte invoca mixer.music.get_busy() como condição para o while loop. Esta função do módulo pygame retornará 1 se o objeto mixer estiver tocando, e 0 se não estiver. Dessa forma, o loop irá rodar a cada 0,25 segundos, até que a execução do arquivo de áudio termine e mixer.music.get_busy() retorne o valor 0. A variável seconds salvará o tempo total de execução do mp3.

PART 5: LIMPEZA FINAL E MENSAGEM DE LOG

Por fim, precisamos parar o módulo mixer, o que é feito ao invocar mixer.quit(), bem como precisamos remover o arquivo de áudio criado. Contudo, o arquivo será mantido se o parâmetro delete_audio_file for configurado como False.

Uma mensagem de print() com o numero total de segundos será mostrada no terminal. Você pode marcar essa linha como comentário e fazer com que ela não seja executada, se assim preferir. O valor da variável seconds também é retornado pela função, o que permite usá-lo no código posteriormente, se necessário.

SOBRE AS FONTES USADAS PARA CONSTRUIR ESTE CÓDIGO

Eu tive meu primeiro contato com o tema de como transformar, usando Python, texto em mensagem de voz quando li o código muito direto e didático publicado pelo site Geek for Geeks: https://www.geeksforgeeks.org/convert-text-speech-python/

E eu descobri sobre o módulo mixer, do pygame, a partir desta resposta no Stack Overflow, escrita por shad0w_wa1k3r:

https://stackoverflow.com/questions/20021457/playing-mp3-song-on-python

Por fim, eu aprendi como transformar um arquivo mp3 em ogg com esta resposta do Stack Overflow, de autoria de RDK:

https://stackoverflow.com/questions/50720152/gtts-error-saving-as-wav-but-saved-as-mpeg

Meu muito obrigado a você, por ter prestigiado meu texto com a sua leitura.

Happy coding!

P.S.1: Você encontrará esse código no meu repositório do Github (ainda em processo de construção, diga-se de passagem…), no arquivo duckytie.py.

P.S.2: Acesse o meu perfil no LinkedIn: https://www.linkedin.com/in/fabriciobrasil/

MBA on Data Science and Analytics at Universidade de São Paulo — USP (in progress) | Data Analyst | Python and R Programmer | Power BI Consultant