การใช้โหมดสตรีมการใช้งานระบบ Piper TTS ใน C ++ ด้วย (ไม่บังคับ) รองรับการเร่งความเร็ว RK3588 NPU ตั้งชื่อตาม "การพูด" ใน Esperanto
ก่อนที่จะสร้างคุณจะต้องปฏิบัติตามการพึ่งพาต่อไปนี้
(API/เว็บเซิร์ฟเวอร์)
(สนับสนุน RKNN)
ซึ่ง piper-phoenomize และ onnxruntime Binary (ไม่ใช่แหล่งที่มา! เว้นแต่คุณต้องการสร้างตัวเอง!) อาจต้องดาวน์โหลดและคลายการบีบอัดด้วยตนเอง หลังจากนั้นเรียกใช้ cmake และชี้ไปที่โฟลเดอร์ที่คุณอัดใหม่
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 . หลังจากนั้นเรียกใช้ paroli-cli และพิมพ์ลงในคอนโซลเพื่อสังเคราะห์คำพูด โปรดดูส่วนในภายหลังสำหรับการสร้างโมเดล
./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)
เซิร์ฟเวอร์ Web API มีให้เพื่อให้แอปพลิเคชันอื่น ๆ สามารถดำเนินการข้อความเป็นคำพูดได้อย่างง่ายดาย สำหรับรายละเอียดโปรดดูเอกสาร Web API สำหรับรายละเอียด โดยค่าเริ่มต้นการสาธิต UI สามารถเข้าถึงได้ที่รูทของ URL เซิร์ฟเวอร์ API รองรับทั้งการตอบสนองด้วยเสียงที่ถูกบีบอัดเพื่อลดความต้องการแบนด์วิดท์และสตรีมเสียงผ่าน WebSocket
เพื่อเรียกใช้:
./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 8848และเรียกใช้ 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.opusการสาธิต:
เพื่อเปิดใช้งานกรณีการใช้งานที่บริการถูกเปิดเผยไม่ว่าด้วยเหตุผลใดก็ตาม เซิร์ฟเวอร์ API รองรับรูปแบบการรับรองความถูกต้องพื้นฐาน -ธง --auth จะสร้างโทเค็นผู้ถือที่แตกต่างกันทุกครั้งและทั้ง WebSocket และ HTTP Synthesis API จะทำงานได้ก็ต่อเมื่อเปิดใช้งาน --auth [YOUR_TOKEN] จะตั้งค่าโทเค็นเป็น our_token นอกจากนี้การตั้งค่าตัวแปรสภาพแวดล้อม PAROLI_TOKEN จะตั้งค่าโทเค็นผู้ถือเป็นสิ่งที่ตัวแปรสภาพแวดล้อมถูกตั้งค่าเป็น
Authentication: Bearer <insert the token>
เว็บ UI จะไม่ทำงานเมื่อเปิดใช้งานการรับรองความถูกต้อง
ในการรับรุ่นเข้ารหัสและตัวถอดรหัสคุณจะต้องดาวน์โหลดหรือสร้างจากจุดตรวจ จุดตรวจคือ Piper รุ่นดิบที่ผ่านการฝึกอบรมมา โปรดดูที่ Piper's Training.md สำหรับรายละเอียด ในการแปลงจุดตรวจเป็นคู่ไฟล์ ONNX คุณจะต้องใช้ Piper Fork ของ Mush42 และสาขาสตรีมมิ่ง วิ่ง
python3 -m piper_train.export_onnx_streaming /path/to/your/traning/lighting_logs/version_0/checkpoints/blablablas.ckpt /path/to/output/directoryรูปแบบทางกฎหมาย 100% มีให้ใน HuggingFace
โดยค่าเริ่มต้นโมเดลทำงานบน CPU และอาจเป็นพลังหิวและช้า หากคุณต้องการใช้ GPU และ ฯลฯ .. คุณสามารถส่งธง --accelerator cuda ใน CLI เพื่อเปิดใช้งานได้ สำหรับตอนนี้ตัวเร่งความเร็วที่รองรับเพียงอย่างเดียวคือ CUDA แต่ ROCM สามารถรองรับได้ง่ายเพียงแค่ฉันไม่มีฮาร์ดแวร์ในการทดสอบ อย่าลังเลที่จะมีส่วนร่วม
นี่คือรายการของตัวเร่งความเร็วที่รองรับ:
cuda - Nvidia Cudatensorrt - Nvidia Tensorrt นอกจากนี้ในระบบที่ใช้ RK3588 การสนับสนุน NPU สามารถเปิดใช้งานได้โดยผ่าน -DUSE_RKNN=ON เข้าสู่ CMAKE และผ่านโมเดล RKNN แทน ONNX เป็นตัวถอดรหัส ส่งผลให้เกิดการเร่งความเร็ว ~ 4.3x เปรียบเทียบกับการทำงานบนแกน CPU RK3588 โปรดทราบว่าธง accelerator ไม่มีผลเมื่อใช้โมเดล RKNN และเฉพาะตัวถอดรหัสเท่านั้นที่สามารถทำงานบน RK3588 NPU ได้
Rockchip ไม่ได้จัดเตรียมแพ็คเกจใด ๆ เพื่อติดตั้งไลบรารีและส่วนหัว สิ่งนี้จะต้องทำด้วยตนเอง
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/นอกจากนี้การแปลง ONNX เป็น RKNN จะต้องทำบนคอมพิวเตอร์ X64 ในการเขียนเอกสารนี้คุณอาจต้องการติดตั้งเวอร์ชันสำหรับ Python 3.10 เนื่องจากเป็นเวอร์ชันเดียวกับที่ใช้งานได้กับ Upstream Piper จำเป็นต้องใช้ RKNN-TOOLKIT2 เวอร์ชัน 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.rknnหากต้องการใช้ RKNN สำหรับการอนุมานเพียงผ่านโมเดล RKNN ใน CLI ข้อผิดพลาดจะปรากฏขึ้นหาก RKNN ถูกส่งผ่าน แต่การสนับสนุน RKNN ไม่ได้เปิดใช้งานระหว่างการรวบรวม
./paroli-cli --encoder /path/to/your/encoder.rknn --decoder /path/to/your/decoder.onnx -c /path/to/your/model.json
# ^^^^
# The only change สิ่งที่ต้องทำ:
ไม่มีวิธีที่ดีในการลดเวลาแฝงการสังเคราะห์บน RK3588 นอกเหนือจาก Rockchip ปรับปรุง RKNNRT และคอมไพเลอร์ของพวกเขา ตัวเข้ารหัสเป็นกราฟแบบไดนามิกดังนั้น RKNN จะไม่ทำงาน และวิธีที่พวกเขาใช้ Multi-NPU Co-Process ห้ามมิให้มีการอนุมานเป็นชุดเดี่ยวที่เร็วขึ้น แบทช์หลายชุดสามารถทำได้เร็วขึ้น แต่ฉันไม่เห็นคุณค่าของมันเพราะมันเร็วพอสำหรับการใช้บ้าน