Implementasi mode streaming dari sistem Piper TTS di C ++ dengan (opsional) Dukungan Akselerasi NPU RK3588. Dinamai setelah "berbicara" di Esperanto.
Sebelum membangun, Anda perlu memenuhi dependensi berikut
(API/Server Web)
(Dukungan RKNN)
Di mana piper-phoenomize dan onnxruntime biner (bukan sumber! Kecuali jika Anda ingin membangun diri Anda sendiri!) Kemungkinan perlu diunduh dan didekompresi secara manual. Setelah itu jalankan CMake dan arahkan ke folder yang Anda rekatkan.
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 . Setelah itu jalankan paroli-cli dan ketik ke konsol untuk mensintesis pidato. Silakan merujuk ke bagian selanjutnya untuk menghasilkan model.
./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)
Server API Web juga disediakan sehingga aplikasi lain dapat dengan mudah melakukan teks untuk berbicara. Untuk detailnya, silakan merujuk ke dokumen API Web untuk detailnya. Secara default, demo UI dapat diakses di akar URL. Server API mendukung kedua respons dengan audio terkompresi untuk mengurangi persyaratan bandwidth dan streaming audio melalui WebSocket.
Untuk menjalankannya:
./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 8848Dan untuk memohon 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.opusDemo:
Untuk mengaktifkan kasus penggunaan di mana layanan diekspos untuk alasan apa pun. Server API mendukung skema otentikasi dasar. Bendera --auth akan menghasilkan token pembawa yang berbeda setiap waktu dan baik Websocket dan HTTP Sintesis API hanya akan berfungsi jika diaktifkan. --auth [YOUR_TOKEN] akan mengatur token ke your_token. Selanjutnya pengaturan variabel lingkungan PAROLI_TOKEN akan mengatur token pembawa apa pun yang diatur variabel lingkungan.
Authentication: Bearer <insert the token>
UI web tidak akan berfungsi saat otentikasi diaktifkan
Untuk mendapatkan model encoder dan decoder, Anda harus mengunduhnya atau membuatnya dari pos pemeriksaan. Pos Pemeriksaan adalah model Raw Maw yang dihasilkan Piper terlatih. Silakan merujuk ke Piper's Training.md untuk detailnya. Untuk mengonversi pos pemeriksaan menjadi pasangan file ONNX, Anda akan membutuhkan Piper Fork Mush42 dan cabang streaming. Berlari
python3 -m piper_train.export_onnx_streaming /path/to/your/traning/lighting_logs/version_0/checkpoints/blablablas.ckpt /path/to/output/directorySekitar 100% model hukum disediakan di Huggingface.
Secara default, model berjalan pada CPU dan bisa menjadi lebih lapar dan lambat. Jika Anda ingin menggunakan GPU dan, dll. Anda dapat melewati --accelerator cuda di CLI untuk mengaktifkannya. Untuk saat ini satu -satunya akselerator yang didukung adalah CUDA. Tapi ROCM dapat dengan mudah didukung, hanya saja saya tidak memiliki perangkat keras untuk mengujinya. Jangan ragu untuk berkontribusi.
Ini adalah daftar akselerator yang didukung:
cuda - Nvidia Cudatensorrt - Nvidia Tensorrt Selain itu, pada sistem berbasis RK3588, dukungan NPU dapat diaktifkan dengan lulus -DUSE_RKNN=ON ke CMake dan melewati model RKNN alih -alih ONNX sebagai dekoder. Menghasilkan ~ 4,3x speedup dibandingkan dengan berjalan pada core CPU RK3588. Perhatikan bahwa bendera accelerator tidak berpengaruh ketika model A RKNN digunakan dan hanya dekoder yang dapat berjalan pada RK3588 NPU.
Rockchip tidak menyediakan paket apa pun untuk menginstal perpustakaan dan header. Ini harus dilakukan secara manual.
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/Juga, mengonversi ONNX ke RKNN harus dilakukan pada komputer X64. Pada saat menulis dokumen ini, Anda mungkin ingin menginstal versi untuk Python 3.10 karena ini adalah versi yang sama yang berfungsi dengan Piper hulu. Diperlukan RKNN-ToolKit2 Versi 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.rknnUntuk menggunakan RKNN untuk inferensi, cukup lulus model RKNN di CLI. Kesalahan akan muncul jika RKNN dilewatkan tetapi dukungan RKNN tidak diaktifkan selama kompilasi.
./paroli-cli --encoder /path/to/your/encoder.rknn --decoder /path/to/your/decoder.onnx -c /path/to/your/model.json
# ^^^^
# The only change TODO:
Tidak ada cara yang baik untuk mengurangi latensi sintesis pada RK3588 selain Rockchip meningkatkan RKNNRT dan kompilernya. Encoder adalah grafik dinamis sehingga RKNN tidak akan berfungsi. Dan bagaimana mereka menerapkan proses bersama multi-NPU melarang inferensi batch tunggal yang lebih cepat. Multi batch dapat dibuat lebih cepat tetapi saya tidak melihat nilainya karena sudah cukup cepat untuk digunakan di rumah.