R&D, consulting and open-source development.
The code in this story is for educational purposes. The readers are solely responsible for whatever they build with it.
Walkthroughs, tutorials, guides, and tips. This story will teach you how to do something new or how to do something better.
Vamos dar uma olhada em como alguém pode configurar um sintetizador de texto para fala local (offline) ad-hoc usando piper , piper-whistle e pipes nomeados.
Para configurar o piper em um sistema baseado em GNU/Linux, descreverei uma arquitetura geral usando pipes nomeados, que é simples o suficiente para permitir a conversão de texto em fala em todo o sistema, com um pouco de configuração manual, a ajuda do piper -whistle e algumas pequenas compensações (é simples, mas não suporta processamento de fala paralelo).
Para começar, vamos buscar o piper autônomo mais recente construído em seu repositório hospedado no github ( 2023.11.14-2 no momento em que este artigo foi escrito). Depois de baixar o arquivo compactado, criaremos uma estrutura de diretórios para a configuração do nosso piper. O diretório raiz deve estar em /opt/wind
com os seguintes subdiretórios:
/opt/wind/piper
(abrigará o piper construído)/opt/wind/channels
(conterá os pipes nomeados)
Após a descompactação, o executável do piper deve estar disponível em /opt/wind/piper/piper
, bem como as bibliotecas que o acompanham e espeak-ng-data
.
Para gerenciar modelos de voz usados pelo piper, recomendo usar o piper-whistle, um utilitário de linha de comando escrito em python, que torna mais conveniente baixar e gerenciar vozes.
Você pode obter o arquivo wheel mais recente na página de lançamento do gitlab ou do github . Depois de instalar o arquivo wheel, vamos buscar uma voz para gerar alguma fala. Primeiro, vamos atualizar o banco de dados chamando piper_whistle -vR
. Para falar em inglês, gosto bastante da voz feminina chamada alba. Usando o apito, podemos listar todas as vozes disponíveis em inglês (GB) usando piper_whistle list -l en_GB -i 2
. A voz está no índice 2. Então para instalar basta chamar piper_whistle install en_GB 2
.
A seguir, vamos criar os pipes nomeados necessários. A estrutura resultante ficará assim:
/opt/wind/channels/speak
(aceita carga JSON)/opt/wind/channels/input
(lido por piper)/opt/wind/channels/ouput
(escrito por piper)
Para criar um pipe nomeado, você pode usar o seguinte comando: mkfifo -m 755 /opt/wind/channels/input
Finalmente, criamos três processos em shells separados:
tail -F /opt/wind/channels/speak | tee /opt/wind/channels/input
/opt/wind/piper/piper -m $(piper_whistle path alba@medium) --debug --json-input --output_raw < /opt/wind/channels/input > /opt/wind/channels/output
aplay --buffer-size=777 -r 22050 -f S16_LE -t raw < /opt/wind/channels/output
O processo em tty0 garante que o pipe seja mantido aberto, mesmo após o término do processamento por piper ou aplay . Desta forma, podemos enfileirar as solicitações TTS e posteriormente reproduzi-las ou salvá-las.
Como o piper-whistle oferece recursos adicionais se você usar a estrutura acima, agora podemos gerar fala via piper_whistle speak "This is quite neat"
. Em sistemas com X11 você pode gerar uma versão falada do texto em sua área de transferência via piper_whistle speak "$(xsel --clipboard --output)"
.