Implementierung des Streaming -Modus des Piper -TTS -Systems in C ++ mit (optional) RK3588 -NPU -Beschleunigungsunterstützung. Benannt nach "Sprechen" in Esperanto.
Vor dem Aufbau müssen Sie die folgenden Abhängigkeiten erfüllen
(API/Webserver)
(RKNN -Unterstützung)
In welchem piper-phoenomize und onnxruntime Binary (nicht die Quelle! Wenn Sie sich selbst bauen möchten!) Muss wahrscheinlich manuell heruntergeladen und dekomprimiert werden. Führen Sie anschließend CMake aus und verweisen Sie auf die Ordner, die Sie ihnen empfohlen haben.
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 . Führen Sie anschließend paroli-cli und geben Sie in die Konsole ein, um die Sprache zu synthetisieren. Weitere Informationen finden Sie in späteren Abschnitten, um die Modelle zu generieren.
./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)
Ein Web -API -Server wird ebenfalls bereitgestellt, damit andere Anwendungen den Text problemlos mit Sprache ausführen können. Weitere Informationen finden Sie im Web -API -Dokument für Einzelheiten. Standardmäßig kann auf eine Demo -Benutzeroberfläche an der Wurzel der URL zugegriffen werden. Der API -Server unterstützt beide reagieren mit komprimiertem Audio, um die Bandbreitenanforderungen zu verringern und Audio über WebSocket zu streamen.
Um es auszuführen:
./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 8848Und TSS aufzurufen
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.opusDemo:
Um Anwendungsfälle zu ermöglichen, in denen der Dienst aus irgendeinem Grund ausgesetzt ist. Der API -Server unterstützt ein grundlegendes Authentifizierungsschema. Das --auth -Flaggen erzeugt ein Trägertoken, das jedes Mal anders ist, und sowohl in WebSocket- als auch die HTTP -Synthese -API funktionieren nur, wenn es aktiviert ist. --auth [YOUR_TOKEN] wird das Token auf Your_Token setzen. Darüber hinaus setzt die Variable der PAROLI_TOKEN -Umgebungsvariable das Trägertoken auf die Umgebungsvariable.
Authentication: Bearer <insert the token>
Die Web -Benutzeroberfläche funktioniert nicht, wenn die Authentifizierung aktiviert ist
Um die Encoder- und Decoder -Modelle zu erhalten, müssen Sie sie entweder herunterladen oder eines von Kontrollpunkten erstellen. Checkpoints sind der ausgebildete Rohmodell -Piper -Piper. Weitere Informationen finden Sie in Piper's Training.md. Um Checkpoints in ONNX -Dateipaare umzuwandeln, benötigen Sie die Piper Fork von Mush42 und den Streaming -Zweig. Laufen
python3 -m piper_train.export_onnx_streaming /path/to/your/traning/lighting_logs/version_0/checkpoints/blablablas.ckpt /path/to/output/directoryEinige 100% rechtliche Modelle werden zum Umarmungsface bereitgestellt.
Standardmäßig werden die Modelle auf der CPU ausgeführt und können hungrig und langsam mit Strom versorgt werden. Wenn Sie eine GPU und usw. verwenden möchten, können Sie die --accelerator cuda in der CLI übergeben, um sie zu aktivieren. Derzeit ist der einzige unterstützte Beschleuniger CUDA. Aber ROCM kann leicht unterstützt werden, nur ich habe nicht die Hardware, um sie zu testen. Fühlen Sie sich frei zu beitragen.
Dies ist die Liste der unterstützten Beschleuniger:
cuda - NVIDIA CUDAtensorrt - Nvidia Tensorrt Zusätzlich kann bei RK3588 -basierten Systemen die NPU -Unterstützung aktiviert werden, indem -DUSE_RKNN=ON in CMake übergeben und ein RKNN -Modell anstelle von ONNX als Decoder übergeben wird. Dies führt zu einer Geschwindigkeit von ~ 4,3x, verglichen mit dem Laufen auf den RK3588 -CPU -Kernen. Beachten Sie, dass das accelerator -Flag keine Wirkung hat, wenn das A -RKNN -Modell verwendet wird und nur der Decoder auf der RK3588 -NPU ausgeführt wird.
Rockchip bietet keine Art Paket zur Installation der Bibliotheken und Header. Dies muss manuell erfolgen.
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/Außerdem muss das Umwandeln von ONNX in RKNN auf einem X64 -Computer durchgeführt werden. Zum Schreiben dieses Dokuments möchten Sie wahrscheinlich die Version für Python 3.10 installieren, da dies dieselbe Version ist, die mit Upstream Piper funktioniert. RKNN-TOOLKIT2 Version 1.6.0 ist erforderlich.
# 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.rknnUm RKNN für Inferenz zu verwenden, geben Sie einfach das RKNN -Modell in der CLI weiter. Ein Fehler wird angezeigt, wenn RKNN eingegeben wird, aber RKNN -Unterstützung beim Kompilieren nicht aktiviert ist.
./paroli-cli --encoder /path/to/your/encoder.rknn --decoder /path/to/your/decoder.onnx -c /path/to/your/model.json
# ^^^^
# The only change Todo:
Es gibt keinen guten Weg, um die Syntheselatenz auf RK3588 zu verringern, neben Rockchip, die RKNNRT und ihr Compiler verbessert. Der Encoder ist ein dynamisches Diagramm, daher funktioniert RKNN nicht. Und wie sie Multi-NPU-Co-Prozess implementieren, verbietet eine schnellere Single-Batch-Inferenz. Multi -Batch kann schneller gemacht werden, aber ich sehe den Wert nicht, da er bereits schnell genug für den Heimgebrauch ist.