Implémentation de mode de streaming du système Piper TTS en C ++ avec le support d'accélération (facultatif) RK3588 NPU. Nommé d'après "parler" dans Esperanto.
Avant la construction, vous devrez remplir les dépendances suivantes
(API / serveur Web)
(Support RKNN)
Dans quel piper-phoenomize et onnxruntime binaire (pas la source! Sauf si vous voulez vous construire!) Il faut probablement être téléchargé et décompressé manuellement. Ensuite, exécutez Cmake et pointez les dossiers que vous les avez recompressés.
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 . Ensuite, exécutez paroli-cli et tapez dans la console pour synthétiser la parole. Veuillez vous référer aux sections ultérieures pour générer les modèles.
./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)
Un serveur API Web est également fourni afin que d'autres applications puissent facilement effectuer du texte en parole. Pour plus de détails, veuillez consulter le document API Web pour plus de détails. Par défaut, une interface utilisateur de démonstration est accessible à la racine de l'URL. Le serveur API prend en charge les deux réponses avec l'audio compressé pour réduire les besoins en bande passante et le streaming audio via WebSocket.
Pour l'exécuter:
./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 8848Et pour invoquer 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.opusDémo:
Pour activer les cas d'utilisation où le service est exposé pour une raison quelconque. Le serveur API prend en charge un schéma d'authentification de base. L'indicateur --auth générera un jeton de support qui est différent à chaque fois et l'API de synthèse WebSocket et HTTP ne fonctionnera que si elle est activée. --auth [YOUR_TOKEN] définira le jeton sur votre_token. De plus, la définition de la variable d'environnement PAROLI_TOKEN définira le jeton de support sur la variable d'environnement pour laquelle la variable d'environnement est définie.
Authentication: Bearer <insert the token>
L'interface utilisateur Web ne fonctionnera pas lorsque l'authentification est activée
Pour obtenir les modèles d'encodeur et de décodeur, vous devrez soit les télécharger ou en créer un à partir de points de contrôle. Les points de contrôle sont le modèle brut qualifié généré par le modèle. Veuillez vous référer à Piper's Training.MD pour plus de détails. Pour convertir les points de contrôle en paires de fichiers ONNX, vous aurez besoin de Piper Fork de MUSH42 et de la branche de streaming. Courir
python3 -m piper_train.export_onnx_streaming /path/to/your/traning/lighting_logs/version_0/checkpoints/blablablas.ckpt /path/to/output/directoryQuelques modèles juridiques à 100% sont fournis sur HuggingFace.
Par défaut, les modèles fonctionnent sur le CPU et pourraient avoir faim et lent. Si vous souhaitez utiliser un GPU et, etc., vous pouvez passer l'indicateur --accelerator cuda dans la CLI pour l'activer. Pour l'instant, le seul accélérateur pris en charge est CUDA. Mais ROCM peut être facilement pris en charge, juste je n'ai pas le matériel pour le tester. N'hésitez pas à contribuer.
Ceci est la liste des accélérateurs pris en charge:
cuda - Nvidia Cudatensorrt - Nvidia Tensorrt De plus, sur les systèmes basés sur RK3588, le support NPU peut être activé en passant -DUSE_RKNN=ON Cmake et en passant un modèle RKNN au lieu de ONNX comme décodeur. Résultant en ~ 4,3x d'accélération par rapport à l'exécution sur les noyaux du processeur RK3588. Notez que l'indicateur accelerator n'a aucun effet lorsque le modèle RKNN est utilisé et que seul le décodeur peut fonctionner sur la NPU RK3588.
RockChip ne fournit aucun ensemble quelconque pour installer les bibliothèques et les en-têtes. Cela doit être fait manuellement.
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/De plus, la conversion d'Onnx en RKNN doit être effectuée sur un ordinateur x64. Au moment de la rédaction de ce document, vous souhaitez probablement installer la version de Python 3.10 car il s'agit de la même version qui fonctionne avec Piper en amont. RKNN-TOOLKIT2 La version 1.6.0 est requise.
# 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.rknnPour utiliser RKNN pour l'inférence, passez simplement le modèle RKNN dans la CLI. Une erreur apparaîtra si RKNN est passé, mais la prise en charge RKNN n'est pas activée lors de la compilation.
./paroli-cli --encoder /path/to/your/encoder.rknn --decoder /path/to/your/decoder.onnx -c /path/to/your/model.json
# ^^^^
# The only change FAIRE:
Il n'y a aucun bon moyen de réduire la latence de synthèse sur RK3588 en plus de RockChip améliorant le RKNNRT et leur compilateur. L'encodeur est un graphique dynamique et RKNN ne fonctionnera pas. Et la façon dont ils implémentent le copropriété multi-NPU interdisent une inférence par lots uniques plus rapide. Multi lot peut être réalisé plus rapidement, mais je ne vois pas la valeur de celui-ci car il est déjà assez rapide pour un usage domestique.