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 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]
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
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 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