Signed-off-by: Yueqian Lin <70319226+linyueqian@users.noreply.github.com> Signed-off-by: Yueqian Lin <linyueqian@outlook.com> Co-authored-by: Hongsheng Liu <liuhongsheng4@huawei.com>
MOSS-TTS-Nano
Model checkpoint
| Model | Description |
|---|---|
OpenMOSS-Team/MOSS-TTS-Nano |
0.1B AR LM + MOSS-Audio-Tokenizer-Nano codec, 48 kHz mono (mixed down from upstream stereo), ZH/EN/JA |
No built-in speaker presets. Every request must include
ref_audio. The server uses upstream's recommendedvoice_clonemode (per upstream's README andinfer.pyexample). The OpenAI-schemavoiceandref_textfields are accepted but ignored —voice_clonedoes not consume a transcript, and upstream'scontinuationmode (the only path that acceptsprompt_text) emits near-silent output with a reference clip + transcript pair, so it is not exposed here.Sample reference clips are available in the upstream repo under
assets/audio/(e.g.zh_1.wav,en_2.wav,jp_2.wav).
Gradio Demo
An interactive Gradio demo is available with custom voice cloning and streaming support. Upload your own reference audio in the UI.
# Option 1: Launch server + Gradio together
./run_gradio_demo.sh
# Option 2: If server is already running
python gradio_demo.py --api-base http://localhost:8091
Then open http://localhost:7860 in your browser.
Launch the Server
vllm serve OpenMOSS-Team/MOSS-TTS-Nano --omni --port 8091
The deploy config at vllm_omni/deploy/moss_tts_nano.yaml auto-loads; no
--stage-configs-path, --trust-remote-code, or --enforce-eager flags
are needed.
Or use the convenience script:
./run_server.sh
Send TTS Request
Every request needs ref_audio (base64 data URL). Reuse a saved sample:
# Fetch a sample reference clip from the upstream repo (one-off).
# Cache under XDG_CACHE_HOME so it survives across runs and stays user-scoped.
REF_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/moss-tts-nano"
mkdir -p "$REF_DIR"
REF_WAV="$REF_DIR/zh_1.wav"
[ -s "$REF_WAV" ] || curl -L -o "$REF_WAV" https://raw.githubusercontent.com/OpenMOSS/MOSS-TTS-Nano/main/assets/audio/zh_1.wav
REF_AUDIO=$(base64 -w 0 "$REF_WAV")
curl -X POST http://localhost:8091/v1/audio/speech \
-H "Content-Type: application/json" \
-d "{
\"input\": \"你好,这是语音合成测试。\",
\"ref_audio\": \"data:audio/wav;base64,${REF_AUDIO}\",
\"response_format\": \"wav\"
}" --output output.wav
Using Python
import base64
import os
import urllib.request
from pathlib import Path
import httpx
ref_dir = Path(os.environ.get("XDG_CACHE_HOME", Path.home() / ".cache")) / "moss-tts-nano"
ref_dir.mkdir(parents=True, exist_ok=True)
ref_wav = ref_dir / "zh_1.wav"
if not ref_wav.exists() or ref_wav.stat().st_size == 0:
urllib.request.urlretrieve(
"https://raw.githubusercontent.com/OpenMOSS/MOSS-TTS-Nano/main/assets/audio/zh_1.wav",
ref_wav,
)
with ref_wav.open("rb") as f:
ref_audio_b64 = base64.b64encode(f.read()).decode("ascii")
response = httpx.post(
"http://localhost:8091/v1/audio/speech",
json={
"input": "你好,这是语音合成测试。",
"ref_audio": f"data:audio/wav;base64,{ref_audio_b64}",
"response_format": "wav",
},
timeout=300.0,
)
with open("output.wav", "wb") as f:
f.write(response.content)
Streaming
curl -X POST http://localhost:8091/v1/audio/speech \
-H "Content-Type: application/json" \
-d "{
\"input\": \"Hello, streaming output from MOSS-TTS-Nano.\",
\"ref_audio\": \"data:audio/wav;base64,${REF_AUDIO}\",
\"stream\": true,
\"response_format\": \"pcm\"
}" --no-buffer | play -t raw -r 48000 -e signed -b 16 -c 1 -
Note: Output is 48 kHz mono PCM. Upstream's audio tokenizer is internally stereo at 48 kHz; the model wrapper averages the two channels into mono before reaching the engine, so playback duration / pitch are correct against the WAV header's 48 kHz rate.
API Parameters
MOSS-TTS-Nano uses the standard /v1/audio/speech endpoint.
| Parameter | Type | Default | Description |
|---|---|---|---|
input |
string | required | Text to synthesize (ZH / EN / JA) |
ref_audio |
string | required | Base64 data URL of the reference audio clip |
ref_text |
string | accepted, ignored | Schema-compatible field; voice_clone mode does not consume a transcript |
response_format |
string | "wav" |
Audio format: wav, mp3, flac, pcm |
stream |
bool | false | Stream raw PCM chunks |
max_new_tokens |
int | 4096 | Maximum tokens to generate |
The voice and ref_text fields from the OpenAI schema are accepted but
ignored — there are no built-in speaker presets in MOSS-TTS-Nano, and
upstream's voice_clone mode does not consume a transcript.
Troubleshooting
libnvrtc.so.13: cannot open shared object file: torchaudio 2.10+ defaults to torchcodec which requires NVRTC. vLLM-Omni patches this automatically at model load time to use soundfile instead.- Connection refused: Ensure the server is running on the correct port.
- Flashinfer version mismatch: Set
FLASHINFER_DISABLE_VERSION_CHECK=1if you see version warnings. - Out of memory: The default
gpu_memory_utilization=0.3is conservative. Increase it in the stage config if you have more VRAM available.