4.1 KiB
MOSS-TTS-Nano on Ascend NPU
Summary
- Model:
OpenMOSS-Team/MOSS-TTS-Nano - Task: multilingual text-to-speech with a reference voice
- Hardware: one Ascend 910B3 64GB NPU
- Output: 48 kHz mono audio
- Serving API: OpenAI-compatible
/v1/audio/speech
MOSS-TTS-Nano combines a small autoregressive language model with
OpenMOSS-Team/MOSS-Audio-Tokenizer-Nano. Both components run on the same
NPU. The codec is a separate checkpoint and must be available even when the
main model has already been downloaded.
Environment
Use an aligned vLLM, vLLM-Ascend, and vLLM-Omni environment. The following configuration was validated:
- Image:
quay.nju.edu.cn/ascend/vllm-omni:v0.28.0 - Ascend device: 910B3 64GB
- CANN: 9.1.0
- vLLM: 0.28.0
- Execution mode: eager
See the NPU installation guide for the complete container device and driver mounts.
Download checkpoints
export HF_HOME=/models/huggingface-cache
hf download OpenMOSS-Team/MOSS-TTS-Nano
# This dependency is loaded from its model ID by the MOSS-TTS-Nano config.
hf download OpenMOSS-Team/MOSS-Audio-Tokenizer-Nano
For an air-gapped server, populate HF_HOME with the audio-tokenizer snapshot
before startup and set HF_HUB_OFFLINE=1. Do not omit the audio tokenizer:
the main model directory does not contain its weights.
Start the server
Expose one physical NPU and keep the stage's logical device as 0:
export ASCEND_RT_VISIBLE_DEVICES=0
export HF_HOME=/models/huggingface-cache
vllm serve OpenMOSS-Team/MOSS-TTS-Nano \
--omni \
--trust-remote-code \
--host 0.0.0.0 \
--port 8091
--trust-remote-code is required because both checkpoints provide custom
Transformers model implementations. The bundled moss_tts_nano.yaml deploy
configuration enables eager execution; ACL graph capture is not used for this
model path.
Voice-cloning request
ref_audio accepts an HTTP URL or a base64 data URL. A non-streaming request
returns a WAV file:
curl http://localhost:8091/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"model": "OpenMOSS-Team/MOSS-TTS-Nano",
"input": "Hello, this is a voice cloning test on Ascend NPU.",
"stream": false,
"response_format": "wav",
"ref_audio": "https://example.com/reference.wav"
}' \
--output output.wav
Streaming raw PCM uses the same endpoint:
curl http://localhost:8091/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"model": "OpenMOSS-Team/MOSS-TTS-Nano",
"input": "你好,这是一段流式语音合成测试。",
"stream": true,
"stream_format": "audio",
"response_format": "pcm",
"ref_audio": "https://example.com/reference.wav"
}' \
--output output.pcm
Raw PCM output is signed 16-bit little-endian mono at 48 kHz.
Validation
The Ascend 910B3 validation covered:
- English non-streaming WAV output;
- Chinese streaming PCM output;
- repeat generation with the same seed producing byte-identical WAV files;
- two concurrent non-streaming requests;
- waveform checks for a non-empty, finite, non-silent signal at 48 kHz.
The first request includes one-time NPU kernel warmup. In the validated setup, the first non-streaming request took about 22.7 seconds, a repeated request took about 7.5 seconds, and streaming produced its first audio chunk in about 0.38 seconds. These figures are functional reference measurements, not a performance guarantee.
Current limitations
- The model runs in eager mode; ACL graph mode has not been enabled.
- Concurrent HTTP requests are accepted but generated serially. Do not raise
the stage's
max_num_seqsabove1: the remote model and audio tokenizer share RNG and streaming decode state, and interleaved generation can corrupt audio. - The remote model's CUDA-only
flash_attention_2path is replaced with PyTorch SDPA on Ascend. - The current non-CUDA model wrapper loads the language model and audio codec in float32. Quantized checkpoints have not been validated.
- A reference audio clip is required for
voice_clonemode.