# VoxCPM2 + vLLM-Omni PoC para servir o modelo `openbmb/VoxCPM2` com vLLM-Omni, usando GPU NVIDIA e Podman. O serviço expõe uma API compatível com OpenAI em `POST /v1/audio/speech` e oferece: - Síntese de voz em WAV; - Streaming de áudio PCM `s16le`, mono, 48 kHz; - Perfis de voz pré-calculados; - Criação de novos perfis de voz em um container temporário. > Use somente áudios de referência com consentimento explícito e documentado. ## Pré-requisitos No host: - Oracle Linux 9 ou outra distribuição Linux compatível; - GPU NVIDIA compatível (a PoC foi validada em OCI `VM.GPU.A10.1`); - Driver NVIDIA funcional; - Podman e NVIDIA Container Toolkit/CDI configurados; - Acesso à internet no primeiro build e primeiro boot. Valide a GPU no host: ```bash nvidia-smi -L ``` Valide o acesso à GPU pelo Podman: ```bash podman run --rm \ --device nvidia.com/gpu=all \ --security-opt label=disable \ ubuntu \ nvidia-smi -L ``` ## Build ```bash git clone cd voxcpm-vllm-omni mkdir -p runtime/hf-cache runtime/voices podman build --pull=newer \ -t voxcpm-omni:0.28.0-1 \ -f Containerfile . ``` ## Executar o servidor Para acesso apenas local: ```bash podman run -d \ --name voxcpm-omni \ --restart=always \ --device nvidia.com/gpu=all \ --security-opt label=disable \ --ipc=host \ -p 127.0.0.1:8000:8000 \ -v "$PWD/runtime/hf-cache:/root/.cache/huggingface" \ -v "$PWD/runtime/voices:/opt/voices:ro" \ voxcpm-omni:0.28.0-1 ``` No primeiro boot, o modelo será baixado para `runtime/hf-cache/`. ```bash podman logs -f voxcpm-omni curl http://127.0.0.1:8000/v1/models curl http://127.0.0.1:8000/v1/audio/voices ``` ## Gerar WAV ```bash curl -sS -X POST http://127.0.0.1:8000/v1/audio/speech \ -H "Content-Type: application/json" \ -d '{ "model": "openbmb/VoxCPM2", "input": "Olá. Este é um teste de síntese de voz.", "voice": "default", "response_format": "wav" }' \ --output teste.wav ``` Para usar uma voz pre-processada, substitua `default` pelo nome do perfil, por exemplo `carbonera`. ## Streaming PCM ```bash curl --no-buffer -sS -X POST http://127.0.0.1:8000/v1/audio/speech \ -H "Content-Type: application/json" \ -d '{ "model": "openbmb/VoxCPM2", "input": "Olá. Este é um teste de streaming.", "voice": "default", "stream": true, "stream_format": "audio", "response_format": "pcm" }' \ --output resposta.pcm ``` Formato retornado: PCM `s16le`, mono, 48 kHz. ## Criar uma voz pre-processada Os arquivos de referência não devem ir para o Git. Com o serviço parado: ```bash podman stop voxcpm-omni PROMPT_TEXT="$(tr '\n' ' ' < "$PWD/reference-audio/nome-da-voz.txt")" podman run --rm \ --device nvidia.com/gpu=all \ --security-opt label=disable \ --ipc=host \ -v "$PWD/runtime/hf-cache:/root/.cache/huggingface" \ -v "$PWD/runtime/voices:/opt/voices" \ -v "$PWD/reference-audio/nome-da-voz.wav:/opt/input/voz.wav:ro" \ voxcpm-omni:0.28.0-1 \ python /opt/vllm-omni/examples/online_serving/text_to_speech/voxcpm2/precompute_custom_voice.py \ --model openbmb/VoxCPM2 \ --voice-name nome-da-voz \ --ref-audio /opt/input/voz.wav \ --prompt-text "$PROMPT_TEXT" \ --mode ref_continuation \ --output-dir /opt/voices \ --device cuda podman start voxcpm-omni ``` Confira a nova voz: ```bash curl http://127.0.0.1:8000/v1/audio/voices ``` ## Dados persistentes ```text runtime/hf-cache/ Pesos baixados do modelo runtime/voices/ Perfis .safetensors e manifesto das vozes ``` Esses diretórios não são versionados no Git. Para migrar vozes aprovadas entre hosts, copie `runtime/voices/` por um canal seguro. ## Segurança Não exponha a porta 8000 diretamente à internet sem controles adicionais. Para acesso remoto, restrinja firewall e NSG/Security List da OCI ao IP ou à rede autorizada e use um proxy reverso com TLS e autenticação.