Implementación del modo de transmisión del sistema PIPER TTS en C ++ con soporte (opcional) RK3588 NPU Aceleración. Llamado así por "hablar" en Esperanto.
Antes de construir, deberá cumplir con las siguientes dependencias
(API/servidor web)
(Soporte RKNN)
En el que piper-phoenomize y onnxruntime Binary (¡no la fuente! ¡A menos que quieran construirlos mismos!) Es probable que se descargue y descomprima manualmente. Luego, ejecute cmake y apunte a las carpetas que las recompensó.
mkdir build
cd build
cmake .. -DORT_ROOT=/path/to/your/onnxruntime-linux-aarch64-1.14.1 -DPIPER_PHONEMIZE_ROOT=/path/to/your/piper-phonemize-2023-11-14 -DCMAKE_BUILD_TYPE=Release
make -j
# IMPORTANT! Copy espeak-ng-data or pass `--espeak_data` CLI flag
cp -r /path/to/your/piper-phonemize-2023-11-14/share/espeak-ng-data . Luego ejecuta paroli-cli y escriba en la consola para sintetizar el habla. Consulte las secciones posteriores para generar los modelos.
./paroli-cli --encoder /path/to/your/encoder.onnx --decoder /path/to/your/decoder.onnx -c /path/to/your/model.json
...
[2023-12-23 03:13:12.452] [paroli] [info] Wrote /home/marty/Documents/rkpiper/build/./1703301190238261389.wav
[2023-12-23 03:13:12.452] [paroli] [info] Real-time factor: 0.16085024956315996 (infer=2.201744556427002 sec, audio=13.688163757324219 sec)
También se proporciona un servidor de API web para que otras aplicaciones puedan realizar fácilmente texto a voz. Para obtener más detalles, consulte el documento de la API web para obtener más detalles. Por defecto, se puede acceder a una interfaz de usuario de demostración en la raíz de la URL. El servidor API es compatible con la respuesta con audio comprimido para reducir el requisito de ancho de banda y la transmisión de audio a través de WebSocket.
Para ejecutarlo:
./paroli-server --encoder /path/to/your/encoder.onnx --decoder /path/to/your/decoder.onnx -c /path/to/your/model.json --ip 0.0.0.0 --port 8848E invocar TSS
curl http://your.server.address:8848/api/v1/synthesise -X POST -H ' Content-Type: application/json ' -d ' {"text": "To be or not to be, that is the question"} ' > test.opusManifestación:
Para habilitar casos de uso donde el servicio esté expuesto por cualquier razón. El servidor API admite un esquema de autenticación básica. La bandera --auth generará un token de portador que es diferente cada vez y tanto la API de síntesis de WebSocket y HTTP solo funcionará si está habilitada. --auth [YOUR_TOKEN] establecerá el token en Your_Token. Además, la configuración de la variable de entorno PAROLI_TOKEN establecerá el token de portador en cualquier variable de entorno.
Authentication: Bearer <insert the token>
La interfaz de usuario web no funcionará cuando la autenticación esté habilitada
Para obtener los modelos de codificador y decodificador, deberá descargarlos o crear uno desde los puntos de control. Los puntos de control son el modelo crudo entrenado que genera Piper. Consulte Piper's Training.md para más detalles. Para convertir los puntos de control en pares de archivos ONNX, necesitará la bifurcación Piper de Mush42 y la rama de transmisión. Correr
python3 -m piper_train.export_onnx_streaming /path/to/your/traning/lighting_logs/version_0/checkpoints/blablablas.ckpt /path/to/output/directorySe proporcionan algunos modelos 100% legales en Huggingface.
Por defecto, los modelos se ejecutan en la CPU y podrían tener una potencia hambrienta y lenta. Si desea usar una GPU y, etc., puede pasar la bandera --accelerator cuda en la CLI para habilitarla. Por ahora, el único acelerador compatible es CUDA. Pero ROCM se puede admitir fácilmente, solo no tengo el hardware para probarlo. Siéntete libre de contribuir.
Esta es la lista de aceleradores compatibles:
cuda - NVIDIA CUDAtensorrt - Nvidia Tensorrt Además, en los sistemas basados en RK3588, el soporte de NPU se puede habilitar pasando -DUSE_RKNN=ON en cmake y pasando un modelo RKNN en lugar de ONNX como decodificador. Dando como resultado una aceleración de ~ 4.3x en comparación con la ejecución en los núcleos de CPU RK3588. Tenga en cuenta que la bandera accelerator no tiene efecto cuando se usa el modelo A RKNN y solo el decodificador puede ejecutarse en la NPU RK3588.
Rockchip no proporciona ningún paquete de algún tipo para instalar las bibliotecas y encabezados. Esto debe hacerse manualmente.
git clone https://github.com/rockchip-linux/rknn-toolkit2
cd rknn-toolkit2/rknpu2/runtime/Linux/librknn_api
sudo cp aarch64/librknnrt.so /usr/lib/
sudo cp include/ * /usr/include/Además, la conversión de ONNX a RKNN debe hacerse en una computadora X64. Al escribir este documento, es probable que desee instalar la versión para Python 3.10, ya que esta es la misma versión que funciona con Upstream Piper. Se requiere RKNN-Toolkit2 versión 1.6.0.
# Install rknn-toolkit2
git clone https://github.com/rockchip-linux/rknn-toolkit2
cd rknn-toolkit2/tree/master/rknn-toolkit2/packages
pip install rknn_toolkit2-1.6.0+81f21f4d-cp310-cp310-linux_x86_64.whl
# Run the conversion script
python tools/decoder2rknn.py /path/to/model/decoder.onnx /path/to/model/decoder.rknnPara usar RKNN para inferencia, simplemente pase el modelo RKNN en la CLI. Aparecerá un error si se pasa RKNN pero el soporte de RKNN no está habilitado durante la compilación.
./paroli-cli --encoder /path/to/your/encoder.rknn --decoder /path/to/your/decoder.onnx -c /path/to/your/model.json
# ^^^^
# The only change HACER:
No hay una buena manera de reducir la latencia de síntesis en RK3588 además de Rockchip mejorando Rknnrt y su compilador. El codificador es un gráfico dinámico, por lo que RKNN no funcionará. Y cómo implementan un coprocesamiento multi-NPU prohíbe una inferencia de lotes único más rápida. Multi lotes se puede hacer más rápido, pero no veo su valor, ya que ya es lo suficientemente rápido para uso en casa.