Tips en Trucs 2024

Sprekende computers dankzij Piper

Piper is een snel, lokaal neuraal tekst-naar-spraaksysteem dat geweldig klinkt en geoptimaliseerd is voor de Raspberry Pi 4, maar werkt op elk Linux systeem. Daarenboven kan Piper gebruik maken van verschillende stemmen in verschillende talen. Piper wordt gebruikt in verschillende projecten, waaronder Home Assistant, NVDA - NonVisual Desktop Access, enz. Luister naar deze door Piper uitgesproken tekst:

Piper is een project van Open Home Foundation. Het doel van het project is om het project Year of Voice van Home Assistant te ondersteunen.

Piper installeren

Piper kan je rechtstreeks van de Github ontwikkelaars Releases webpagina downloaden. De momenteel laatste versie dateert van 14/11/2023 (let op het versienummer) en kan je downloaden met de opdracht:

dany@pindabook:~$ wget https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_x86_64.tar.gz
--2024-10-20 15:58:47--  https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_x86_64.tar.gz
Herleiden van github.com (github.com)... 140.82.121.4
Verbinding maken met github.com (github.com)|140.82.121.4|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 302 Found
Locatie: https://objects.githubusercontent.com/github-production-release-asset-2e65be/587499842/2263b07f-5c93-4eaf-9b33-ec55605ee66b?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241020%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241020T135847Z&X-Amz-Expires=300&X-Amz-Signature=cffc95eb00ebf0ec544d52a604bf2df83ff6a90a66331c52e56a9a881f73a4c4&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dpiper_linux_x86_64.tar.gz&response-content-type=application%2Foctet-stream [volgen...]
--2024-10-20 15:58:47--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/587499842/2263b07f-5c93-4eaf-9b33-ec55605ee66b?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241020%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241020T135847Z&X-Amz-Expires=300&X-Amz-Signature=cffc95eb00ebf0ec544d52a604bf2df83ff6a90a66331c52e56a9a881f73a4c4&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dpiper_linux_x86_64.tar.gz&response-content-type=application%2Foctet-stream
Herleiden van objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.111.133, 185.199.110.133, 185.199.108.133, ...
Verbinding maken met objects.githubusercontent.com (objects.githubusercontent.com)|185.199.111.133|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 26460462 (25M) [application/octet-stream]
Wordt opgeslagen als: ‘piper_linux_x86_64.tar.gz’

piper_linux_x86_64.tar.gz         100%[==========================================================>]  25,23M  11,4MB/s    in 2,2s    

2024-10-20 15:58:50 (11,4 MB/s) - '‘piper_linux_x86_64.tar.gz’' opgeslagen [26460462/26460462]

Daarna pak je het gedownloade bestand uit met de opdracht:

dany@pindabook:~$ tar -xvf piper_linux_x86_64.tar.gz 
piper/
piper/espeak-ng
piper/libpiper_phonemize.so.1.2.0
...
piper/libespeak-ng.so
piper/libespeak-ng.so.1
piper/libonnxruntime.so

Piper heeft bovendien een stem nodig om te kunnen spreken. De verschillende stemmen voor verschillende talen kan je beluisteren op de Piper Voice Samples webpagina. Stemmen downloaden kan vanaf de Github ontwikkelaars Voices webpagina. Als voorbeeld download je met de volgende twee opdrachten de stem van een Nederlandstalige mannelijke Belg:

dany@pindabook:~$ wget https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/nl/nl_BE/rdh/medium/nl_BE-rdh-medium.onnx
--2024-10-20 16:45:37--  https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/nl/nl_BE/rdh/medium/nl_BE-rdh-medium.onnx
Herleiden van huggingface.co (huggingface.co)... 2600:9000:274d:fc00:17:b174:6d00:93a1, 2600:9000:274d:9200:17:b174:6d00:93a1, 2600:9000:274d:1000:17:b174:6d00:93a1, ...
Verbinding maken met huggingface.co (huggingface.co)|2600:9000:274d:fc00:17:b174:6d00:93a1|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 302 Found
Locatie: https://cdn-lfs.hf.co/repos/ed/06/ed062eb100d7bd80d78f61252cd190fca48cbda97eb1753fb827ff3339a6b11c/fb1a9d89ff53dbd510c5d10bd1365c36a5f76249c3ca603076646fd778003db1?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27nl_BE-rdh-medium.onnx%3B+filename%3D%22nl_BE-rdh-medium.onnx%22%3B&Expires=1729694737&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyOTY5NDczN319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5oZi5jby9yZXBvcy9lZC8wNi9lZDA2MmViMTAwZDdiZDgwZDc4ZjYxMjUyY2QxOTBmY2E0OGNiZGE5N2ViMTc1M2ZiODI3ZmYzMzM5YTZiMTFjL2ZiMWE5ZDg5ZmY1M2RiZDUxMGM1ZDEwYmQxMzY1YzM2YTVmNzYyNDljM2NhNjAzMDc2NjQ2ZmQ3NzgwMDNkYjE%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=KofMSJ0Pz-nfQA8Lb8i-sAMsTHM%7E8iBWPiY4jyZkijb-G2RindwPNN1TOx9-vW%7EWhz0LV3en6dJ23ohT744SJJoflmYQQvE-52OboOk9tyhuiBii1vMX1C1rViRKNqs6m2pZ8boL%7EwnP1ntQkB1EGrfc4DLkLgv6ddgQH6weG3SJcUaSZwfQzVruMmWqoKNYOy29R3rat4ZITYDrNqqsav2dT9WEPHX06n3UjnAnSiDFRRkct-rmhpMdlX%7EZmCB%7E25GomXcwwjIBACFEDJ18ipbIhDjnmixwNcJOpWUEVKCSJDbj6afnXptf4YeZp-Ne9REgZ4zSrQ47-1IE-3TAiA__&Key-Pair-Id=K3RPWS32NSSJCE [volgen...]
--2024-10-20 16:45:37--  https://cdn-lfs.hf.co/repos/ed/06/ed062eb100d7bd80d78f61252cd190fca48cbda97eb1753fb827ff3339a6b11c/fb1a9d89ff53dbd510c5d10bd1365c36a5f76249c3ca603076646fd778003db1?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27nl_BE-rdh-medium.onnx%3B+filename%3D%22nl_BE-rdh-medium.onnx%22%3B&Expires=1729694737&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyOTY5NDczN319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5oZi5jby9yZXBvcy9lZC8wNi9lZDA2MmViMTAwZDdiZDgwZDc4ZjYxMjUyY2QxOTBmY2E0OGNiZGE5N2ViMTc1M2ZiODI3ZmYzMzM5YTZiMTFjL2ZiMWE5ZDg5ZmY1M2RiZDUxMGM1ZDEwYmQxMzY1YzM2YTVmNzYyNDljM2NhNjAzMDc2NjQ2ZmQ3NzgwMDNkYjE%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=KofMSJ0Pz-nfQA8Lb8i-sAMsTHM%7E8iBWPiY4jyZkijb-G2RindwPNN1TOx9-vW%7EWhz0LV3en6dJ23ohT744SJJoflmYQQvE-52OboOk9tyhuiBii1vMX1C1rViRKNqs6m2pZ8boL%7EwnP1ntQkB1EGrfc4DLkLgv6ddgQH6weG3SJcUaSZwfQzVruMmWqoKNYOy29R3rat4ZITYDrNqqsav2dT9WEPHX06n3UjnAnSiDFRRkct-rmhpMdlX%7EZmCB%7E25GomXcwwjIBACFEDJ18ipbIhDjnmixwNcJOpWUEVKCSJDbj6afnXptf4YeZp-Ne9REgZ4zSrQ47-1IE-3TAiA__&Key-Pair-Id=K3RPWS32NSSJCE
Herleiden van cdn-lfs.hf.co (cdn-lfs.hf.co)... 18.239.208.17, 18.239.208.19, 18.239.208.31, ...
Verbinding maken met cdn-lfs.hf.co (cdn-lfs.hf.co)|18.239.208.17|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 63104526 (60M) [application/octet-stream]
Wordt opgeslagen als: ‘nl_BE-rdh-medium.onnx’

nl_BE-rdh-medium.onnx             100%[==========================================================>]  60,18M  11,3MB/s    in 5,3s    

2024-10-20 16:45:42 (11,3 MB/s) - '‘nl_BE-rdh-medium.onnx’' opgeslagen [63104526/63104526]

Een stem bestaat dus uit een onnx bestand (de stem zelf) en een onnx.json bestand met de stemeigenschappen. Het bij de pas gedownloade Belgische mannelijke Nederlandstalige stem horende stemeigenschappen download je met:

dany@pindabook:~$ wget https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/nl/nl_BE/rdh/medium/nl_BE-rdh-medium.onnx.json
--2024-10-20 16:47:06--  https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/nl/nl_BE/rdh/medium/nl_BE-rdh-medium.onnx.json
Herleiden van huggingface.co (huggingface.co)... 2600:9000:274d:9a00:17:b174:6d00:93a1, 2600:9000:274d:c800:17:b174:6d00:93a1, 2600:9000:274d:fc00:17:b174:6d00:93a1, ...
Verbinding maken met huggingface.co (huggingface.co)|2600:9000:274d:9a00:17:b174:6d00:93a1|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 4159 (4,1K) [text/plain]
Wordt opgeslagen als: ‘nl_BE-rdh-medium.onnx.json’

nl_BE-rdh-medium.onnx.json        100%[==========================================================>]   4,06K  --.-KB/s    in 0s      

2024-10-20 16:47:06 (82,8 MB/s) - '‘nl_BE-rdh-medium.onnx.json’' opgeslagen [4159/4159]

De computer laten spreken

Om tekst naar spraak om te zetten, stuur je met de echo opdracht een tekst naar de piper opdracht in de uitgepakte map. Met de --model optie bepaal je welke stem Piper moet gebruiken. De optie --output_file bepaalt in welk audiobestand de spraak wordt opgeslagen. Een volledige uitspraak opdracht wordt dan bijvoorbeeld:

dany@pindabook:~$ echo 'Welkom in de wereld van sprekende computers!' | ./piper/piper --model nl_BE-rdh-medium.onnx --output_file welkom.wav
[2024-10-20 16:50:54.385] [piper] [info] Loaded voice in 0.477432491 second(s)
[2024-10-20 16:50:54.385] [piper] [info] Initialized piper
welkom.wav
[2024-10-20 16:50:54.750] [piper] [info] Real-time factor: 0.13461737524177453 (infer=0.354779361 sec, audio=2.6354648526077096 sec)
[2024-10-20 16:50:54.750] [piper] [info] Terminated piper

Je kunt het audiobestand dan met elke audiospeler afspelen, bijvoorbeeld met de opdracht:

dany@pindabook:~$ aplay welkom.wav 
Playing WAVE 'welkom.wav' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono

De omweg via een audiobestand hoeft niet. Piper kan namelijk de ruwe audiodata rechtstreeks naar een audiospeler sturen. Deze audiospeler moet wel een ruwe audiostream afkomstig van een ander programma kunnen afspelen. De aplay audiospeler heeft deze mogelijkheden, waardoor Piper met de volgende opdracht de spraak direct doorstuurt naar aplay:

dany@pindabook:~$ echo 'Welkom in de wereld van sprekende computers!' | ./piper/piper --model nl_BE-rdh-medium.onnx --output-raw | aplay -r 22050 -f S16_LE -t raw -
Playing raw data 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono
[2024-10-20 16:53:59.843] [piper] [info] Loaded voice in 0.49002268 second(s)
[2024-10-20 16:53:59.844] [piper] [info] Initialized piper
[2024-10-20 16:54:00.449] [piper] [info] Waiting for audio to finish playing...
[2024-10-20 16:54:01.289] [piper] [info] Real-time factor: 0.22639855034179687 (infer=0.588779976 sec, audio=2.6006349206349206 sec)
[2024-10-20 16:54:01.289] [piper] [info] Terminated piper
Piper TTS Text to Speech

Je kunt Piper ook verschillende zinnen na elkaar laten uitspreken. Zelfs door verschillende sprekers, maar enkel inden het stembestand verschillende sprekers bevat. Dit kan je nagaan door de inhoud van het bijhorende onnx.json bestand met de stemeigenschappen te bekijken. We beperken ons hier tot een voorbeeld met twee zinnen en één spreker. Maak met een teksteditor, bijvoorbeeld nano een json bestand aan:

dany@pindabook:~$ nano spreek.json

En voer in het JSON formaat de volgende twee zinnen toe:

{ "text": "Deze zin wordt eerst uitgesproken." }
{ "text": "Daarna hoor je deze zin." }

Daarna geef je de inhoud van het json bestand met de twee zinnen met de cat opdracht door aan Piper. De Piper optie --json-input zorgt dan dat de twee zinnen correct worden uitgesproken:

dany@pindabook:~$ cat spreek.json | ./piper/piper --json-input --model nl_BE-rdh-medium.onnx --output-raw | aplay -r 22050 -f S16_LE -t raw -
Playing raw data 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono
[2024-10-20 17:53:46.971] [piper] [info] Loaded voice in 0.492319541 second(s)
[2024-10-20 17:53:46.972] [piper] [info] Initialized piper
[2024-10-20 17:53:47.344] [piper] [info] Waiting for audio to finish playing...
[2024-10-20 17:53:47.498] [piper] [info] Real-time factor: 0.1505546841698673 (infer=0.312880628 sec, audio=2.078185941043084 sec)
[2024-10-20 17:53:47.687] [piper] [info] Waiting for audio to finish playing...
[2024-10-20 17:53:49.128] [piper] [info] Real-time factor: 0.14246870490234376 (infer=0.49621753 sec, audio=3.4829931972789114 sec)
[2024-10-20 17:53:49.129] [piper] [info] Terminated piper

Alle Piper opties kan je opvragen met de opdracht:

dany@pindabook:~$./piper/piper --help 

usage: ./piper/piper [options]

options:
   -h        --help              show this message and exit
   -m  FILE  --model       FILE  path to onnx model file
   -c  FILE  --config      FILE  path to model config file (default: model path + .json)
   -f  FILE  --output_file FILE  path to output WAV file ('-' for stdout)
   -d  DIR   --output_dir  DIR   path to output directory (default: cwd)
   --output_raw                  output raw audio to stdout as it becomes available
   -s  NUM   --speaker     NUM   id of speaker (default: 0)
   --noise_scale           NUM   generator noise (default: 0.667)
   --length_scale          NUM   phoneme length (default: 1.0)
   --noise_w               NUM   phoneme width noise (default: 0.8)
   --sentence_silence      NUM   seconds of silence after each sentence (default: 0.2)
   --espeak_data           DIR   path to espeak-ng data directory
   --tashkeel_model        FILE  path to libtashkeel onnx model (arabic)
   --json-input                  stdin input is lines of JSON instead of plain text
   --debug                       print DEBUG messages to the console
   -q       --quiet              disable logging

Als je Piper wilt gebruiken op een Raspberry Pi, of je wilt eens een video tutorial bekijken, ziehier:

Piper verwijderen

Piper kan je eenvoudig verwijderen door de uitgepakte map te verwijderen:

dany@pindabook:~$ rm -r piper/

De gedownloade bestanden, waaronder Piper en de stembestanden mag je dan ook verwijderen:

dany@pindabook:~$ rm piper_linux_x86_64.tar.gz nl_BE-rdh-medium.onnx*

Ook de aangemaakte JSON bestanden met spraakopdrachten kan je verwijderen, in ons vorrbeeld:

dany@pindabook:~$ rm spreek.json