Loading...
06-04-2025

Piper is een open source toolkit voor text-to-speech, waarbij de belofte wordt gedaan dat deze werkende op alleen CPU toch behoorlijk snel zou zijn. Het is hierbij ook mogelijk een eigen stem te trainen.

A fast, local neural text to speech system

De laatste 'release' op de Github page is van 14 november 2023, maar afgelopen maand zijn er nog commits toegevoegd. De bedoeling is om te kijken of we de laatste versie op macOS aan de praat kunnen krijgen.

Eerder liep ik tegen een aantal problemen aan. Het downloaden van de release kan via de github pagina. Als je vervolgens de .tar.gz hebt geopent en piper start (niet via de terminal), krijg je al gauw Apple could not verify “piper” is free of malware that may harm your Mac or compromise your privacy. Via de terminal krijg je een geheel andere melding te zien:

% ./piper
dyld[28586]: Library not loaded: @rpath/libespeak-ng.1.dylib
  Referenced from: <65D01FDC-B71E-3786-8B0D-0BFEEC801633> /Users/peter/Downloads/piper/piper
  Reason: tried: '/usr/local/lib/libespeak-ng.1.dylib' (no such file), '/usr/lib/libespeak-ng.1.dylib' (no such file, not in dyld cache)
zsh: abort      ./piper

Wat de foutmelding aangeeft, is dat de libraries die piper wil gebruiken, niet op de juiste plek staan. Of in andere woorden, piper verwacht dat de libraries ergens staan (/usr/local/lib) wat niet het geval is. Daarnaast is de gevraagde library libespeak-ng.1.dylib niet aanwezig in het gedownloade tar-archief.

Piper is afhankelijk van het piper-phonemize project. Dit project zorgt voor het omzetten van de gevraagde tekst naar fonetische symbolen die nodig zijn voor het uitspreken. Ik dacht dat dit weer gebaseerd is op espeak-ng, maar omdat er een specifiek onderdeel hierin ontbreekt, hebben ze er een separaat project van gemaakt. Of iets in die richting.

In het gedownloade tar-archief is piper_phonemize ook aanwezig. Hiervoor geldt hetzelfde als voor het opstarten van piper:

% ./piper_phonemize
dyld[28668]: Library not loaded: @rpath/libpiper_phonemize.1.dylib
  Referenced from: <3D98D201-8BC3-36CB-A5A6-1BF74A1CF7A8> /Users/peter/Downloads/piper/piper_phonemize
  Reason: tried: '/usr/local/lib/libpiper_phonemize.1.dylib' (no such file), '/usr/lib/libpiper_phonemize.1.dylib' (no such file, not in dyld cache)
zsh: abort      ./piper_phonemize

Ook deze library is niet aanwezig in het tar-archief. Als je piper_phonemize download vanaf de github pagina, is te zien dat de inhoud een stuk minder uitgekleed is. Sterker nog, alles wat tot nu toe geroepen wordt dat ontbreekt, is wel aanwezig in dit bestand. Echter krijgen we een zelfde soort foutmelding:

% cd ../piper-phonemize
peter@MacBookPro bin % ./piper_phonemize 
dyld[28738]: Library not loaded: @rpath/libpiper_phonemize.1.dylib
  Referenced from: <D5469D2B-CE4B-3598-B8B1-2374AA52AEF1> /Users/peter/Downloads/piper-phonemize/bin/piper_phonemize
  Reason: tried: '/usr/local/lib/libpiper_phonemize.1.dylib' (no such file), '/usr/lib/libpiper_phonemize.1.dylib' (no such file, not in dyld cache)
zsh: abort      ./piper_phonemize

Na een korte zoektocht blijkt dat deze programma's een directe verwijzing gebruiken naar de libraries (.dylib). Deze is hardcoded in de applicatie. Aangezien ik verder niet zoveel weet van applicaties compileren op macOS, moest ik het antwoord vinden in github reactie bij het piper project.

Via install_name_tool kan het pad van de library aangepast worden, in de executable:

#example, do not copy and paste this
sudo install_name_tool -change @rpath/libespeak-ng.1.dylib $PIPER_PHONEMIZE_DIR/lib/libespeak-ng.1.dylib $PIPER_DIR/piper

De persoon die de oplossing gepost heeft, heeft ook een script erbij geplaatst waarmee je de download en het corrigeren in 1 keer kan uitvoeren. Let wel op dat hij alles onder /usr/local installeert en dat is wat ik in ieder geval niet wil.

De conclusie is dat dus te downloaden release versie, niet out-of-the-box werkt, wat erg jammer is.

Terug naar de het doel. Buiten het kunnen downloaden, wil ik graag de laatste versie kunnen gebruiken. Er is een probleem met de Nederlandse stemmen en ik hoop te kunnen aantonen dat

  1. het probleem niet is opgelost en waar het probleem dan optreed, of
  2. het probleem is opgelost en iedereen is blij

De Github pagina van piper spreekt alleen maar over Linux desktop en 2 Raspberry PI variaties. De vraag is dan ook of er iets anders moet gebeuren voor macOS.

% git clone https://github.com/rhasspy/piper.git
% cd piper
% make all
..
cd build && ctest --config Release
CMake Error: Unknown argument: --config
CMake Error: Run 'ctest --help' for all supported options.
make: *** [all] Error 1

Hier liep ik eerder ook al eens tegenaan. ctest --config release lijkt op mijn machine niet te bestaan, maar ctest -C release wel. Na dit aangepast te hebben in de Makefile loopt het proces wel verder.

Dus de build gaat goed, maar vervolgens lopen we tegen hetzelfde probleem aan:

% ./install/piper
dyld[36638]: Library not loaded: @rpath/libespeak-ng.1.dylib
  Referenced from: <CEAF996E-3687-34F0-BC89-7314F7904719> /Users/peter/Projects/poc/20250406-piper-from-source/piper/install/piper
  Reason: no LC_RPATH's found

Het ziet er meteen naar uit dat de install directory niet alles bevat. Vervolgens heb ik hetzelfde gedaan voor piper_phomemize:

% git clone https://github.com/rhasspy/piper-phonemize pp
% cd pp
% make all
..
cd build && ctest --config Release
CMake Error: Unknown argument: --config
CMake Error: Run 'ctest --help' for all supported options.
make: *** [all] Error 1

nano Makefile
# pas aan naar `ctest -C release`

% make all

Als hij klaar is, staat in de install map een 4tal mappen, waaronder bin directory de piper_phonemize executable bevat. Echter is hiermee het probleem niet opgelost. We hebben dan wel de laatste versie van de code, maar nog steeds hetzelfde probleem.

Gelukkig ben ik niet de enige die hier tegenaan loopt. In Building for MacOS and iOS #14 wordt een zelfde probleem beschreven en wordt er gelukkig ook een oplossing genoemd. Een van de reacties geeft een oplossing gebruik te maken van de variabele DYLD_LIBRARY_PATH. Als ik het onderstaande probeer, dan werkt piper_phonemize!

cd pp
export DYLD_LIBRARY_PATH=`pwd`/install/lib/
./install/bin/piper_phonemize

Maar dan hebben we nog een oplossing voor piper nodig. Deze lijkt veel meer te ontbreken. Gelukkig kunnen we de combinatie van beide projecten hiervoor gebruiken. Ik ga er vanuit dat zowel de clone van piper en piper-phonemize, in dezelfde directory staan:

% ls -lFa
total 0
drwxr-xr-x  22 peter  staff   704 Apr  6 13:36 piper/
drwxr-xr-x  22 peter  staff   704 Apr  6 13:43 pp/

Ik gebruik het volgende om het aan te tonen. pwd zorgt ervoor dat de huidige directory wordt gebruikt als base pad. We zetten hierbij ook het pad voor de espeak data, omdat deze ook volledig in de piper-phonemize beschikbaar is:

PP="`pwd`/pp/install"
LIB="${PP}/lib"
ESPEAK_DATA="${PP}/share/espeak-ng-data"
PIPER_PATH="`pwd`/piper/install"
DYLD_LIBRARY_PATH="${LIB}" ; "${PIPER_PATH}/piper" --version --espeak_data "${ESPEAK_DATA}"

Uiteraard zal dit geen audio genereren, maar het versie nummer wordt wel getoond! Versie 1.2.0 is hiermee geïnstalleerd. Zorg dat het bovenste in de shell script verwerkt wordt en piper kan via de command line uitgevoerd worden.

  • Linux
  • MacOS
  • Piper
  • TTS