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)"
.