113 lines
3.7 KiB
Markdown
113 lines
3.7 KiB
Markdown
# Ming-omni-tts Online Serving
|
|||
|
|
|
||
|
|
Serve the dense `inclusionAI/Ming-omni-tts-0.5B` two-stage TTS model through
|
||
|
|
the OpenAI-compatible `/v1/audio/speech` endpoint.
|
||
|
|
|
||
|
|
## Start Server
|
||
|
|
|
||
|
|
```bash
|
||
|
|
vllm-omni serve inclusionAI/Ming-omni-tts-0.5B \
|
||
|
|
--deploy-config vllm_omni/deploy/ming_tts.yaml \
|
||
|
|
--omni \
|
||
|
|
--port 8091 \
|
||
|
|
--enforce-eager
|
||
|
|
```
|
||
|
|
|
||
|
|
Or:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cd examples/online_serving/text_to_speech/ming_tts
|
||
|
|
./run_server.sh
|
||
|
|
```
|
||
|
|
|
||
|
|
The tested ROCm environment is summarized in the
|
||
|
|
[Ming recipe](https://github.com/vllm-project/vllm-omni/blob/main/recipes/inclusionAI/Ming-omni-tts-0.5B.md).
|
||
|
|
|
||
|
|
## Send Requests
|
||
|
|
|
||
|
|
The Python client targets `http://localhost:8091/v1` with `api_key=EMPTY`; it
|
||
|
|
does not call OpenAI's hosted API.
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python openai_speech_client.py \
|
||
|
|
--text "你好,这是 Ming 在线语音合成测试。" \
|
||
|
|
--max-new-tokens 200
|
||
|
|
```
|
||
|
|
|
||
|
|
Style or dialect controls can be plain text or Ming JSON. The upstream
|
||
|
|
dialect example also uses `yue_prompt.wav` for speaker conditioning:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python openai_speech_client.py \
|
||
|
|
--text "我觉得社会企业同个人都有责任" \
|
||
|
|
--instruction-json '{"方言":"广粤话"}' \
|
||
|
|
--ref-audio /path/to/yue_prompt.wav \
|
||
|
|
--max-new-tokens 200
|
||
|
|
```
|
||
|
|
|
||
|
|
When `--ref-audio` is supplied without `--ref-text`, the server extracts the
|
||
|
|
Ming speaker embedding, matching upstream `use_spk_emb=True`, without using the
|
||
|
|
audio as a zero-shot prompt.
|
||
|
|
|
||
|
|
Reference-audio cloning:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python openai_speech_client.py \
|
||
|
|
--text "我们的愿景是构建未来服务业的数字化基础设施,为世界带来更多微小而美好的改变。" \
|
||
|
|
--ref-audio /path/to/10002287-00000094.wav \
|
||
|
|
--ref-text "在此奉劝大家别乱打美白针。" \
|
||
|
|
--max-new-tokens 200
|
||
|
|
```
|
||
|
|
|
||
|
|
Podcast-style multi-speaker prompt:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python openai_speech_client.py \
|
||
|
|
--text " speaker_1:你可以说一下,就大概说一下,可能虽然我也不知道,我看过那部电影没有。
|
||
|
|
speaker_2:就是那个叫什么,变相一节课的嘛。
|
||
|
|
speaker_1:嗯。
|
||
|
|
speaker_2:一部搞笑的电影。
|
||
|
|
speaker_1:一部搞笑的。" \
|
||
|
|
--ref-audio /path/to/CTS-CN-F2F-2019-11-11-423-012-A.wav \
|
||
|
|
--ref-audio /path/to/CTS-CN-F2F-2019-11-11-423-012-B.wav \
|
||
|
|
--ref-text " speaker_1:并且我们还要进行每个月还要考核 笔试的话还要进行笔试,做个,当服务员还要去笔试了
|
||
|
|
speaker_2:对啊,这真的很奇怪,就是 单纯的因,单纯自己工资不高,只是因为可能人家那个店比较出名一点,就对你苛刻要求"
|
||
|
|
```
|
||
|
|
|
||
|
|
Streaming PCM:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python openai_speech_client.py \
|
||
|
|
--text "你好,这是流式输出测试。" \
|
||
|
|
--stream \
|
||
|
|
--output ming_output.pcm
|
||
|
|
```
|
||
|
|
|
||
|
|
`run_curl.sh` keeps small smoke checks:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
./run_curl.sh basic
|
||
|
|
REF_AUDIO=/path/to/reference.wav REF_TEXT="在此奉劝大家别乱打美白针。" ./run_curl.sh zero_shot
|
||
|
|
./run_curl.sh stream
|
||
|
|
```
|
||
|
|
|
||
|
|
## Request Fields
|
||
|
|
|
||
|
|
| Field | Ming meaning |
|
||
|
|
|-------|--------------|
|
||
|
|
| `input` | target text |
|
||
|
|
| `instructions` | plain style text, or JSON object for structured Ming controls |
|
||
|
|
| `voice` | Ming IP voice label unless it resolves to an uploaded speaker |
|
||
|
|
| `language` | Ming `方言` control |
|
||
|
|
| `ref_audio` | speaker reference; with `ref_text`, also supplies the prompt waveform |
|
||
|
|
| `ref_text` | transcript enabling zero-shot or podcast prompt-latent conditioning |
|
||
|
|
| `speaker_embedding` | 192-d Ming speaker embedding |
|
||
|
|
| `max_new_tokens` | Ming `max_decode_steps` |
|
||
|
|
|
||
|
|
## Notes
|
||
|
|
|
||
|
|
- `ref_audio` accepts local paths through the client, remote URLs, `file://`,
|
||
|
|
or `data:` URLs.
|
||
|
|
- Non-streaming responses return WAV bytes; streaming responses return PCM.
|
||
|
|
- Music-only `bgm` generation is offline-only until the API exposes Ming
|
||
|
|
prompt-mode selection.
|