mirror of
https://github.com/mudler/LocalAI.git
synced 2026-06-14 19:58:44 -04:00
CrispASR's piper backend phonemizes non-English text via espeak-ng (dlopen, the MIT-clean path; English uses a built-in G2P). The FROM scratch crispasr image shipped none of it, so non-English piper voices loaded but failed synthesis with "phonemization failed". Bundle the espeak-ng runtime so they work: - Dockerfile.golang: install espeak-ng-data + libespeak-ng1 and its libpcaudio0 / libsonic0 deps in the crispasr builder (espeak's dlopen fails without the latter two). - package.sh: copy libespeak-ng.so.1, libpcaudio.so.0, libsonic.so.0 into package/lib/ and the espeak-ng-data dir into the package root. - run.sh: export CRISPASR_ESPEAK_DATA_PATH so the bundled data is found. Add 9 single-speaker piper voices (de/en/it, incl. Italian paola + riccardo) to the gallery, run through backend:piper, hosted at LocalAI-Community/piper-voices-GGUF (converted from rhasspy/piper-voices with CrispASR's convert-piper-to-gguf.py). Only single-speaker low/medium voices are included; the engine does not yet support multi-speaker or high-quality piper decoders. All 9 verified end-to-end: each synthesizes a WAV at the model's native sample rate using only the image-bundled espeak payload. Assisted-by: Claude:claude-opus-4-8 [Claude Code] Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
58 lines
1.5 KiB
Bash
Executable File
58 lines
1.5 KiB
Bash
Executable File
#!/bin/bash
|
|
set -ex
|
|
|
|
# Get the absolute current dir where the script is located
|
|
CURDIR=$(dirname "$(realpath $0)")
|
|
|
|
cd /
|
|
|
|
echo "CPU info:"
|
|
if [ "$(uname)" != "Darwin" ]; then
|
|
grep -e "model\sname" /proc/cpuinfo | head -1
|
|
grep -e "flags" /proc/cpuinfo | head -1
|
|
fi
|
|
|
|
LIBRARY="$CURDIR/libgocrispasr-fallback.so"
|
|
|
|
if [ "$(uname)" != "Darwin" ]; then
|
|
if grep -q -e "\savx\s" /proc/cpuinfo ; then
|
|
echo "CPU: AVX found OK"
|
|
if [ -e $CURDIR/libgocrispasr-avx.so ]; then
|
|
LIBRARY="$CURDIR/libgocrispasr-avx.so"
|
|
fi
|
|
fi
|
|
|
|
if grep -q -e "\savx2\s" /proc/cpuinfo ; then
|
|
echo "CPU: AVX2 found OK"
|
|
if [ -e $CURDIR/libgocrispasr-avx2.so ]; then
|
|
LIBRARY="$CURDIR/libgocrispasr-avx2.so"
|
|
fi
|
|
fi
|
|
|
|
# Check avx 512
|
|
if grep -q -e "\savx512f\s" /proc/cpuinfo ; then
|
|
echo "CPU: AVX512F found OK"
|
|
if [ -e $CURDIR/libgocrispasr-avx512.so ]; then
|
|
LIBRARY="$CURDIR/libgocrispasr-avx512.so"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
export LD_LIBRARY_PATH=$CURDIR/lib:$LD_LIBRARY_PATH
|
|
export CRISPASR_LIBRARY=$LIBRARY
|
|
|
|
# Point piper's espeak-ng phonemizer at the bundled voice data. The variable
|
|
# names the directory CONTAINING espeak-ng-data (package.sh drops it next to
|
|
# this script). Harmless when espeak-ng wasn't bundled.
|
|
export CRISPASR_ESPEAK_DATA_PATH=$CURDIR
|
|
|
|
# If there is a lib/ld.so, use it
|
|
if [ -f $CURDIR/lib/ld.so ]; then
|
|
echo "Using lib/ld.so"
|
|
echo "Using library: $LIBRARY"
|
|
exec $CURDIR/lib/ld.so $CURDIR/crispasr "$@"
|
|
fi
|
|
|
|
echo "Using library: $LIBRARY"
|
|
exec $CURDIR/crispasr "$@"
|