Mostrando postagens com marcador Python. Mostrar todas as postagens
Mostrando postagens com marcador Python. Mostrar todas as postagens

quinta-feira, 27 de fevereiro de 2025

Voltando ao TTS


Há muito tempo atrás (revi o post e na verdade foi há 12 anos) eu escrevi sobre o TTS (clique aqui para ver post), esse filho esquecido da tecnologia. Digo isto pois aqueles que consomem áudio (rádio, podcast, audiolivros) parecem estar satisfeitos e quietos. É um nicho não visto, até porque com a explosão dos podcasts no Youtube não mexeu com esse grupo. Explico o podcast que explodiu no Youtube não é o podcast "raiz", original, que é constituído do áudio somente. Os podcasts do Youtube são na verdade entrevistas em vídeo com a opção eventualíssima de consumir somente o áudio. O podcast original é o áudio puro veiculado via protocolo específico. Por coincidência enquanto eu finalizava este post saiu este artigo do MeioBit (clique aqui) que repete basicamente o que eu afirmei acima.

Mas há os aficionados em audiolivros que é um segmento de tamanho razoável. Para atrair e oferecer um melhor produto, os audiolivros passaram a ser dramatizados, com leitores-narradores, efeitos sonoros, etc. Alguns livros lidos por alguns narradores tornaram-se um produto além do seu conteúdo, marcando definitivamente os leitores-ouvintes. 

Pois bem, um leitor-narrador, a dramatização do audiolivro, efeitos, etc tem custo adicional, logo não iria demorar que se utilizasse ferramentas para geração automática de audiolivros... e com um passo adicional a leitura traduzida de títulos para uma grande maioria de idiomas tudo rapidamente. Semanas atrás li o artigo do Fellipe Gomes no Medium e ele mostrou um código simples em Python pelo qual a partir de um livro em PDF em inglês publicado em um site, o texto é extraído, traduzido do inglês para o português e transformado em áudio. Quando li o texto, o Filipe ganhou tanto minha atenção quanto meu interesse. 

O mais espetacular que o Fillipe utilizou bibliotecas disponíveis que fazem todo o trabalho, bastando colocar no código e chamar suas funções. Foi assim que ele utilizou a deep-translate do Google Translator (sim, tem recursos de IA) com bons resultados em tradução. Só não abusar da API com textos muito longos. E a edge-tts do Microsoft Edge dentre outras. Esta edge-tts permite que você escolha a "voz" da leitura e normalmente disponibiliza uma voz masculina e uma feminina para cada idioma, no mínimo.

Como consumidor de audiolivros pensei: "Porque não transformar alguns livros em PDF em audiolivros" ? Boa oportunidade para mexer no Python. Então adaptei o código original e o rodei via Colab do Google, afinal o meu teste não precisava de grande poder de processamento. Pus uns arquivos PDF no Google Drive. Para o teste ser minimamente interessante codifiquei para que se indique o arquivo PDF, o idioma a ser traduzido e a voz para se usar no áudio. O código completo está disponível aqui no Github (clique aqui).

O resultado ficou maravilhoso na minha avaliação. No teste optei pela geração de somente 1 página dos PDFs para que eles não ficassem excessivamente pesados. Numa situação de obter o áudio de PDF grande a opção é dividir o PDF em partes para a geração não ficar muito demorada. Uma vez de posse dos áudios dá para colocar uma música de fundo... ideias, mas fica para outro momento. No meu teste utilizei publicações que estão em domínio público e recomendo que se mantenha o respeito às direitos de publicação e do autor. Utilizei pedaços pequenos (página 5) de "Animal Farm" - em inglês - (lançado no Brasil como "A Revolução dos Bichos") de George Orwell e "Confissões" - em português - de Agostinho. Ouça e tire suas próprias conclusões:

Animal Farm - texto original em inglês lido com a voz Yan no inglês de Hong Kong


Animal Farm - texto original em inglês lido com a voz Antônio no português do Brasil


Confissões - texto original em português lido com a voz Antoine no francês do Canadá

Confissões - texto original em português lido com a voz Francisca no português do Brasil

Vamos às vantagens e desvantagens desta técnica

Vantagens: 

1. Sim, é possível transformar PDFs, ePUBs, HTMLs e TXTs em áudio;

2. Sim, dá para traduzir razoavelmente bem e ainda escolher a língua e uma "voz" no qual será gerado o áudio.

3. Flexibilidade de obter publicações em vários idiomas e traduzir para em idioma preferido.

Desvantagens:

1. Livros com palavras hifenizadas terá sua leitura atrapalhada, para estes teria que acrescentar um tratamento para palavras com hífen;

2. No teste feito há uma clara limitação de processamento (Colab Google) para maiores demandas teria que fazer em um equipamento com maior poder de processamento.

3. A leitura está bem humana mas ainda há falhas na entonação de palavras complexas e ou falta de naturalidade em algumas partes.

=======

Referências:

Código em Python no Github - https://github.com/ilhado/TextToSpeech

Explosão dos podcasts no Youtube - https://meiobit.com/466053/youtube-mudou-midia-podcast-audio-para-video/

Fellipe Gomes no Medium - https://medium.com/@gomesfellipe

segunda-feira, 10 de junho de 2024

Contando faces de calendários cubos usando Python

Comprei um calendário baseado em 2 cubos para os números e paralelepípedos para os meses, conforme a foto ao lado. Bem prático, bonitinho, bem feito. Comprei este em Parnaíba-PI a um preço muito mais vantajoso do que aqueles vendidos na Tok&Stok (outro lugar em que encontramos esse tipo de calendário. Do nada tive a curiosidade de descobrir qual seria a face que mais seria utilizada em um ano não bissexto e que claro o usuário tivesse o cuidado cotidiano de sempre mudar as faces. 

Pensei que fazendo em Python seria relativamente simples. Mas apanhei muito para uma tarefa bem simples, acho que por isso não tenho muito futuro como programador. Decidido o projeto, escolhi fazer no Google Colab e usar estruturas dicionário do Python para contar as ocorrências. Ou seja decisões ruins sucessivas. Abandonei as estruturas dicionário pois o comportamento e funções para usá-las não foram bem assimiladas. Então optei por usar vetores bidimensionais. Uma dimensão guardaria o nome da face, e a outra acumularia as ocorrências. 

Lembrando que são 2 cubos. O cubo 1 contém os números 0, 1, 2, 3, 4, 5 e o cubo 2 contém os números 0, 1, 2, 6 (que também ser para o dígito 9), 7 e 8. Então declarei dois vetores bidimensionais e 3 funções. Uma para contar os meses de 31 dias, uma para contar os meses de 30 dias e uma outra para contar o fevereiro. Essas três invocam uma função contadora que recebe um valor referente a cada dia específico e incrementa as faces com compõem o número. Os valores são acumulados e ao final tem o quantitativo. 

Ideia pronto então ora de por a mão na massa, digitei o código e não consegui depurar adequadamente no Colab, precisava acompanhar os valores das variáveis para confirmar se estava fazendo certo e mesmo importando o pacote ipdb a experiência não foi boa. Abandonei então o Colab, baixei o VSCode e seus componentes e finalmente pude rodar e depurar o programa que entregou o resultado correto.

Com o resultado em mãos percebi que tinha deficiências para apresentar o resultado, a saída do print é bem simples, servindo mais para saber o resultado estava correto, daí comecei a pesquisa se havia uma forma mais elaborada de apresentar o resultado seja via uma imagem seja via integração HTML. Para esta última tem a opção do PyScript e/ou Flask, mas eu vou levar muito tempo para fazer isso.

Então para não ficar no básico, vamos apelar para boa e sólida matplotlib e fazer o gráfico das frequências de cada face. Só importar a biblioteca no VSCode, instalar e fazer as chamadas e voilà !


Mas eis a saída do print:


A face campeã é o "1" do cubo 1 e se o ano for bissexto há um empate entre o 1 e 2 do cubo 1.

Porém o resultado não é definitivo pois se pode forçar que uma determinada face seja mais utilizada nos dias em os dígitos 0, 1 e 2 são utilizados, pois ambos os cubos possuem esses dígitos. O código disponibilizado não contabiliza essa possibilidade.

O código está disponível no GitHub.