Modo de streaming Implementação do sistema Piper TTS em C ++ com suporte de aceleração (opcional) RK3588 NPU. Nomeado após "falar" em Esperanto.
Antes de construir, você precisará cumprir as seguintes dependências
(API/Web Server)
(Suporte RKNN)
Em que piper-phoenomize e onnxruntime binário (não a fonte! A menos que você queira se construir!) Provavelmente precisa ser baixado e descomprimido manualmente. Depois, execute o Cmake e aponte para as pastas que você as recompressou.
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 . Posteriormente, execute paroli-cli e digite o console para sintetizar a fala. Consulte as seções posteriores para gerar os 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)
Um servidor de API da Web também é fornecido para que outros aplicativos possam executar facilmente o texto na fala. Para detalhes, consulte o documento da API da Web para obter detalhes. Por padrão, uma interface do usuário demo pode ser acessada na raiz do URL. O servidor API suporta ambos respondendo com áudio compactado para reduzir o requisito de largura de banda e transmitir áudio via websocket.
Para executá -lo:
./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 para 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.opusDemonstração:
Para ativar casos de uso em que o serviço é exposto por qualquer motivo. O servidor API suporta um esquema básico de autenticação. O sinalizador --auth gerará um token do portador que é diferente toda vez e a API da síntese do WebSocket e HTTP só funcionará se ativado. --auth [YOUR_TOKEN] definirá o token para o seu_token. Além disso, definir a variável de ambiente PAROLI_TOKEN definirá o token do portador para qualquer que a variável de ambiente esteja definida.
Authentication: Bearer <insert the token>
A interface da web não funcionará quando a autenticação estiver ativada
Para obter os modelos de codificador e decodificador, você precisará baixá -los ou criar um dos pontos de verificação. Os pontos de verificação são o modelo de modelo bruto treinado que o Piper gera. Consulte o Treinamento do Piper.MD para obter detalhes. Para converter pontos de verificação em pares de arquivos ONNX, você precisará de Piper Fork do Mush42 e da ramificação de streaming. Correr
python3 -m piper_train.export_onnx_streaming /path/to/your/traning/lighting_logs/version_0/checkpoints/blablablas.ckpt /path/to/output/directoryCerca de modelos 100% legais são fornecidos no Huggingface.
Por padrão, os modelos são executados na CPU e podem estar com fome de energia e devagar. Se você quiser usar uma GPU e, etc., você pode passar pela bandeira --accelerator cuda na CLI para habilitá -la. Por enquanto, o único acelerador suportado é o CUDA. Mas o ROCM pode ser facilmente suportado, apenas não tenho o hardware para testá -lo. Sinta -se à vontade para contribuir.
Esta é a lista de aceleradores suportados:
cuda - NVIDIA CUDAtensorrt - Nvidia Tensorrt Além disso, nos sistemas baseados em RK3588, o suporte da NPU pode ser ativado pela passagem -DUSE_RKNN=ON em CMake e passando um modelo RKNN em vez de ONNX como decodificador. Resultando em ~ 4,3x de aceleração comparada à execução dos núcleos da CPU RK3588. Observe que o sinalizador accelerator não tem efeito quando o modelo A RKNN é usado e apenas o decodificador pode ser executado na NPU RK3588.
O RockChip não fornece algum tipo de pacote para instalar as bibliotecas e cabeçalhos. Isso tem que ser feito 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/Além disso, a conversão de ONNX para RKNN deve ser feita em um computador X64. Após a redação deste documento, você provavelmente deseja instalar a versão do Python 3.10, pois esta é a mesma versão que funciona com o upstream Piper. RKNN-TOOLKIT2 Versão 1.6.0 é necessário.
# 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 o RKNN para inferência, basta passar no modelo RKNN na CLI. Um erro aparecerá se o RKNN for passado, mas o suporte RKNN não ativado durante a compilação.
./paroli-cli --encoder /path/to/your/encoder.rknn --decoder /path/to/your/decoder.onnx -c /path/to/your/model.json
# ^^^^
# The only change PENDÊNCIA:
Não há uma boa maneira de reduzir a latência de síntese no RK3588, além do rock, melhorando o RKNNRT e seu compilador. O codificador é um gráfico dinâmico, portanto, o RKNN não funcionará. E como eles implementam o co-processamento multi-NPU proíbe a inferência mais rápida em lote único. O lote múltiplo pode ser feito mais rápido, mas não vejo o valor, pois já é rápido o suficiente para o uso doméstico.