Echemos un vistazo a cómo se puede configurar un sintetizador de texto a voz ad-hoc, local (fuera de línea) usando piper , piper-whistle y Named Pipes.
Para configurar Piper en un sistema basado en GNU/Linux, describiré una arquitectura general que utiliza canalizaciones con nombre, que es lo suficientemente sencilla como para permitir la conversión de texto a voz en todo el sistema, con un poco de configuración manual y la ayuda de Piper. -silbato y algunas compensaciones menores (es simple, pero no admite el procesamiento de voz en paralelo).
Para comenzar, busquemos la última versión independiente de Piper creada desde su repositorio alojado en github ( 2023.11.14-2 al momento de escribir esto). Después de descargar el archivo comprimido, crearemos una estructura de directorios para nuestra configuración de Piper. El directorio raíz estará en /opt/wind
con los siguientes subdirectorios:
/opt/wind/piper
(albergará el gaitero construido)/opt/wind/channels
(contendrá las canalizaciones con nombre)
Después de descomprimirlo, el ejecutable de Piper debería estar disponible en /opt/wind/piper/piper
, así como las bibliotecas que lo acompañan y espeak-ng-data
.
Para administrar los modelos de voz utilizados por Piper, recomendaría usar piper-whistle, una utilidad de línea de comandos escrita en Python, que hace que sea más conveniente descargar y administrar voces.
Puede obtener el archivo wheel más reciente desde su página de lanzamiento de gitlab o github . Después de instalar el archivo wheel, busquemos una voz para generar algo de voz. Primero, actualicemos la base de datos llamando a piper_whistle -vR
. Para hablar en inglés, me gusta bastante la voz femenina llamada alba. Usando Whistle, podemos obtener una lista de todas las voces en inglés (GB) disponibles usando piper_whistle list -l en_GB -i 2
. La voz está en el índice 2. Entonces, para instalarla, simplemente llame a piper_whistle install en_GB 2
.
A continuación, creemos las canalizaciones con nombre necesarias. La estructura resultante se verá así:
/opt/wind/channels/speak
(acepta carga útil JSON)/opt/wind/channels/input
(leído por piper)/opt/wind/channels/ouput
(escrito por piper)
Para crear una canalización con nombre, puede utilizar el siguiente comando: mkfifo -m 755 /opt/wind/channels/input
Finalmente, creamos tres procesos en 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
El proceso en tty0 garantiza que la tubería se mantenga abierta, incluso después de que haya finalizado el procesamiento por parte de piper o aplay . De esta manera, podemos poner en cola las solicitudes TTS y posteriormente reproducirlas o guardarlas.
Dado que piper-whistle ofrece características adicionales si usa la estructura anterior, ahora podemos generar voz a través de piper_whistle speak "This is quite neat"
. En sistemas con X11, puede generar una versión hablada del texto en su portapapeles a través de piper_whistle speak "$(xsel --clipboard --output)"
.