---
license: apache-2.0
---
# Ming-UniAudio
📑 Technical Report|📖Project Page |🤗 Hugging Face| 🤖 ModelScope
## Introduction
Ming-UniAudio is a novel framework that unifies speech understanding, generation, and editing. Its core is a unified continuous speech tokenizer that effectively unifies semantic and acoustic features within an end-to-end model. We developed a speech language model that strikes a balance between generation and understanding capabilities based on the unified continuous audio tokenizer. Leveraging this foundational model, which exhibits robust performance in both domains, we further trained a dedicated speech editing model built upon [Ming-Lite-Omni](https://github.com/inclusionAI/Ming). Crucially, Ming-UniAudio is the first to enable universal, free-form speech editing guided solely by natural language instructions, handling complex semantic and acoustic modifications without manual region specification.
- 🔥 First unified continuous speech tokenizer for both understanding and generation tasks: [MingTok-Audio](https://github.com/inclusionAI/MingTok-Audio)
- 🔥 First Speech LLM with unifed continuous tokenizer for both understanding and generation: [Ming-UniAudio](https://huggingface.co/inclusionAI/Ming-UniAudio-16B-A3B)
- 🔥 First universal free-form speech editing model for various semantic and acoustic editing task without any temporal regime: [Ming-UniAudio-Edit](https://huggingface.co/inclusionAI/Ming-UniAudio-16B-A3B-Edit)
- 🔥 First benchmark for free-form speech editing: [Ming-Freeform-Audio-Edit-Benchmark](https://huggingface.co/datasets/inclusionAI/Ming-Freeform-Audio-Edit-Benchmark)
## 📌 Updates
* [2025.09.30] 🔥 We release [Ming-UniAudio](https://xqacmer.github.io/Ming-Unitok-Audio.github.io/) with significant improvements across speech understanding, generation, and free-form editing tasks.
## Key Features
Ming-UniAudio features key optimizations as follows, compared to other audio-assisted LLMs:
- **Unified Continuous Speech Tokenizer**: Ming-UniAudio proposes a unified continuous speech tokenizer [MingTok-Audio](https://github.com/inclusionAI/MingTok-Audio) based on a VAE framework with a causal Transformer architecture, the first continuous speech tokenizer to effectively integrate semantic and acoustic features, and enables a closed-loop system with LLMs through hierarchical feature representations, makes it suitable for both understanding and generation tasks
- **Unified Speech Language Model for Generation and Understanding**: We pretrain an end-to-end unified speech language model with a single LLM backbone for both understanding and generation tasks, enhanced with a Diffusion Head to ensure high-fidelity speech synthesis.
- **Instruction-Guided Free-Form Speech Editing**: We introduce the first instruction-guided, free-form speech editing framework that supports comprehensive semantic and acoustic edits without requiring explicit edit regions, along with [Ming-Freeform-Audio-Edit](https://github.com/inclusionAI/Ming-Freeform-Audio-Edit), the first open-source evaluation set for such tasks.
## Evaluation
In various benchmark tests, Ming-UniAudio demonstrates highly competitive results compared to industry-leading models of similar scale.
### Speech Understanding
Context ASR performance comparison on various audio benchmark datasets.
| Datasets |
Model |
Performance |
Speech-English
WER | NE-WER | NE-FNR
|
Dialogue-English
WER | NE-WER | NE-FNR
|
Speech-Mandarin
WER | NE-WER | NE-FNR
|
Dialogue-Mandarin
WER | NE-WER | NE-FNR
|
Understanding
Context ASR
|
Qwen2-Audio |
11.49 | 27.27 | 35.08 |
13.99 | 33.02 | 32.92 |
9.92 | 24.10 | 30.02 |
7.00 | 22.76 | 26.17 |
| Baichuan-Audio |
7.52 | 5.87 | 4.55 |
5.66 | 10.01 | 3.64 |
2.16 | 6.65 | 2.35 |
2.96 | 11.48 | 3.94 |
| Kimi-Audio |
2.90 | 6.68 | 8.01 |
4.67 | 13.50 | 11.31 |
1.95 | 11.13 | 15.28 |
2.90 | 15.91 | 16.68 |
| Baichuan-Omni-1.5 |
8.16 | 7.69 | 6.53 |
9.91 | 14.40 | 5.54 |
2.98 | 8.39 | 4.71 |
5.00 | 16.83 | 7.84 |
| Qwen2.5-Omni-3B |
3.99 | 7.80 | 9.69 |
4.83 | 14.36 | 12.85 |
2.13 | 10.55 | 14.11 |
3.12 | 15.07 | 15.17 |
| Qwen2.5-Omni-7B |
3.96 | 7.38 | 8.72 |
5.32 | 11.83 | 9.24 |
1.84 | 9.80 | 12.19 |
2.40 | 14.06 | 13.17 |
| Ming-UniAudio-16B-A3B-Edit(ours) |
4.00 | 3.56 | 3.69 |
5.34 | 8.73 | 2.53 |
1.58 | 5.98 | 2.40 |
3.04 | 9.50 | 1.48 |
### Speech Editing
Performance on various audio benchmark datasets.
| Datasets |
Model |
Performance |
Deletion-basic
Deletion
|
Ming-UniAudio-16B-A3B-Edit |
WER(%) zh | en
11.89 | 14.85
22.92 | 27.60
|
ACC zh | en
100 | 82.22
82.92 | 85
|
SIM zh | en
0.78 | 0.76
0.81 | 0.74
|
no-edit WER(%) zh | en
11.49 | 24.26
17.50 | 35.21
|
Insertion-basic
Insertion
|
Ming-UniAudio-16B-A3B-Edit |
WER(%) zh | en
3.42 | 6.63
3.89 | 7.592
|
ACC zh | en
80 | 71.43
79.31 | 62.31
|
SIM zh | en
0.83 | 0.79
0.83 | 0.79
|
no-edit WER(%) zh | en
3.52 | 17.70
4.10 | 18.84
|
Substitution-basic
Substitution
|
Ming-UniAudio-16B-A3B-Edit |
WER(%) zh | en
4.52 | 8.99
4.56 | 7.64
|
ACC zh | en
78.62 | 59.78
76.62 | 65.62
|
SIM zh | en
0.82 | 0.78
0.83 | 0.77
|
no-edit WER(%) zh | en
4.63 | 19.28
4.75 | 18.39
|
Dialect Conversion
|
Ming-UniAudio-16B-A3B-Edit |
WER(%)
8.93
|
ACC
0.50
|
SIM
0.66
|
-
|
Speed changing
|
Ming-UniAudio-16B-A3B-Edit |
WER(%) zh | en
5.88 | 17.53
|
SIM zh | en
0.66 | 0.57
|
RDE(%) zh | en
6.36 | 5.92
|
-
|
Pitch changing
|
Ming-UniAudio-16B-A3B-Edit |
WER(%) zh | en
7.45 | 13.37
|
SIM zh | en
0.36 | 0.24
|
-
|
-
|
Volume changing
|
Ming-UniAudio-16B-A3B-Edit |
WER(%) zh | en
1.71 | 1.35
|
SIM zh | en
0.86 | 0.80
|
RAE(%) zh | en
14.9 | 11.7
|
-
|
Denoise
Performance comparison on various audio benchmark datasets. The best results are in bold.
| Datasets |
Model |
Model Type |
DNSMOS OVRL |
DNSMOS SIG |
DNSMOS BAK |
| Denoise |
FullSubNet |
specialized |
2.93 |
3.05 |
3.51 |
| Inter-Subnet |
2.98 |
3.17 |
3.15 |
| CDiffuSE |
2.84 |
3.37 |
3.52 |
| SGMSE |
3.11 |
3.47 |
3.41 |
| StoRM |
3.15 |
3.54 |
3.69 |
| GenSE |
3.43 |
3.65 |
4.18 |
| MiMo-Audio |
general |
3.30 |
3.56 |
4.10 |
| Ming-UniAudio-16B-A3B-Edit(ours) |
3.26 |
3.59 |
3.97 |
## Model & Benchmark Downloads
You can download our latest model and Benchmark from both Huggingface and ModelScope.
|**Type**| **Model** | **Input modality** | **Oput modality** | **Download** |
|:-----------------------|:-----------------------|:----------------------:| :---------------: |:------------------------------------------------------------------------------------------------------------------------------------------------------------:|
Tokenizer| MingTok-Audio | audio | audio | [🤗 HuggingFace](https://huggingface.co/inclusionAI/MingTok-Audio)
[🤖 ModelScope](https://modelscope.cn/models/inclusionAI/MingTok-Audio) |
SpeechLLM| Ming-UniAudio-16B-A3B | audio | audio | [🤗 HuggingFace](https://huggingface.co/inclusionAI/Ming-UniAudio-16B-A3B)
[🤖 ModelScope](https://modelscope.cn/models/inclusionAI/Ming-UniAudio-16B-A3B) |
SpeechLLM| Ming-UniAudio-16B-A3B-Edit | text, audio | text, audio | [🤗 HuggingFace](https://huggingface.co/inclusionAI/Ming-UniAudio-16B-A3B-Edit)
[🤖 ModelScope](https://modelscope.cn/models/inclusionAI/Ming-UniAudio-16B-A3B-Edit) |
Benchmark| Ming-Freeform-Audio-Edit | - | - | [🤗 HuggingFace](https://huggingface.co/datasets/inclusionAI/Ming-Freeform-Audio-Edit-Benchmark)
[🤖 ModelScope](https://modelscope.cn/datasets/inclusionAI/Ming-Freeform-Audio-Edit-Benchmark)
[Eval tools](https://github.com/inclusionAI/Ming-Freeform-Audio-Edit)|
If you're in mainland China, we strongly recommend you to download our model from 🤖 ModelScope.
```
pip install modelscope
modelscope download --model inclusionAI/Ming-UniAudio-16B-A3B-Edit --local_dir inclusionAI/Ming-UniAudio-16B-A3B-Edit --revision master
```
Note: This download process will take several minutes to several hours, depending on your network conditions.
## Use Cases
Additional demonstration cases are available on our project [page](https://xqacmer.github.io/Ming-Unitok-Audio.github.io/).
## Environment Preparation
### Installation with pip
```shell
pip install -r requirements.txt
```
### Installation with docker
You can also initialize the environment by building the docker image. First clone this repository:
```shell
git clone --depth 1 https://github.com/inclusionAI/Ming-UniAudio
cd Ming-UniAudio
```
Then build the docker image with the provided Dockerfile in `docker/docker-py310-cu121`. This step might take a while:
```shell
docker build -t ming:py310-cu121 docker/docker-py310-cu121
```
At last, start the container with the current repo directory mounted:
```shell
docker run -it --gpus all -v "$(pwd)":/workspace/Ming-UniAudio ming:py310-cu121 ming:py310-cu121 /bin/bash
```
You can run the model with python interface. You may download the huggingface model in the repo directory first (`.../Ming-UniAudio/`) or mount the downloaded model path when starting the container.
## Example Usage
We provide a step-by-step running example:
Step 1 - Download the source code
```
git clone https://github.com/inclusionAI/Ming-UniAudio
cd Ming-UniAudio
```
Step 2 - Download the Ming-UniAudio model weights and create a soft link to the source code directory
Download our model following `Model & Benchmark Downloads`
```shell
mkdir inclusionAI
ln -s /path/to/inclusionAI/Ming-UniAudio-16B-A3B-Edit inclusionAI/Ming-UniAudio-16B-A3B-Edit
```
Step 3 - Enter the code directory, you can refer to the following codes to run the Ming-UniAudio model.
```shell
jupyter notebook cookbooks/demo.ipynb
```
We also provide a simple example on the usage of this repo. For detailed usage, please refer to [demobook.ipynb](https://github.com/inclusionAI/Ming-UniAudio/blob/main/cookbooks/demo.ipynb).
```python
import warnings
import torch
from transformers import AutoProcessor
from modeling_bailingmm import BailingMMNativeForConditionalGeneration
import random
import numpy as np
from loguru import logger
def seed_everything(seed=1895):
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
seed_everything()
warnings.filterwarnings("ignore")
class MingAudio:
def __init__(self, model_path, device="cuda:0"):
self.device = device
self.model = BailingMMNativeForConditionalGeneration.from_pretrained(
model_path,
torch_dtype=torch.bfloat16,
low_cpu_mem_usage=True,
).eval().to(torch.bfloat16).to(self.device)
self.processor = AutoProcessor.from_pretrained(".", trust_remote_code=True)
self.tokenizer = self.processor.tokenizer
self.sample_rate = self.processor.audio_processor.sample_rate
self.patch_size = self.processor.audio_processor.patch_size
def speech_understanding(self, messages):
text = self.processor.apply_chat_template(messages, add_generation_prompt=True)
image_inputs, video_inputs, audio_inputs = self.processor.process_vision_info(messages)
inputs = self.processor(
text=[text],
images=image_inputs,
videos=video_inputs,
audios=audio_inputs,
return_tensors="pt",
).to(self.device)
for k in inputs.keys():
if k == "pixel_values" or k == "pixel_values_videos" or k == "audio_feats":
inputs[k] = inputs[k].to(dtype=torch.bfloat16)
logger.info(f"input: {self.tokenizer.decode(inputs['input_ids'].cpu().numpy().tolist()[0])}")
generated_ids = self.model.generate(
**inputs,
max_new_tokens=512,
eos_token_id=self.processor.gen_terminator,
)
generated_ids_trimmed = [
out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = self.processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)[0]
return output_text
def speech_generation(
self,
text,
prompt_wav_path,
prompt_text,
lang='zh',
output_wav_path='out.wav'
):
waveform = self.model.generate_tts(
text=text,
prompt_wav_path=prompt_wav_path,
prompt_text=prompt_text,
patch_size=self.patch_size,
tokenizer=self.tokenizer,
lang=lang,
output_wav_path=output_wav_path,
sample_rate=self.sample_rate,
device=self.device
)
return waveform
def speech_edit(
self,
messages,
output_wav_path='out.wav'
):
text = self.processor.apply_chat_template(messages, add_generation_prompt=True)
image_inputs, video_inputs, audio_inputs = self.processor.process_vision_info(messages)
inputs = self.processor(
text=[text],
images=image_inputs,
videos=video_inputs,
audios=audio_inputs,
return_tensors="pt",
).to(self.device)
ans = torch.tensor([self.tokenizer.encode('')]).to(inputs['input_ids'].device)
inputs['input_ids'] = torch.cat([inputs['input_ids'], ans], dim=1)
attention_mask = inputs['attention_mask']
inputs['attention_mask'] = torch.cat((attention_mask, attention_mask[:, :1]), dim=-1)
for k in inputs.keys():
if k == "pixel_values" or k == "pixel_values_videos" or k == "audio_feats":
inputs[k] = inputs[k].to(dtype=torch.bfloat16)
logger.info(f"input: {self.tokenizer.decode(inputs['input_ids'].cpu().numpy().tolist()[0])}")
edited_speech, edited_text = self.model.generate_edit(
**inputs,
tokenizer=self.tokenizer,
output_wav_path=output_wav_path
)
return edited_speech, edited_text
if __name__ == "__main__":
model = MingAudio("inclusionAI/Ming-UniAudio-16B-A3B-Edit")
# Edit
messages = [
{
"role": "HUMAN",
"content": [
{"type": "audio", "audio": "data/wavs/00004768-00000024.wav", "target_sample_rate": 16000},
{
"type": "text",
"text": "Please recognize the language of this speech and transcribe it. And insert '实现' before the character or word at index 3.\n",
},
],
},
]
response = model.speech_edit(messages=messages)
logger.info(f"Generated Response: {response}")
```
Note: We test the examples on hardware of NVIDIA H800-80GB/H20-96G with CUDA 12.4.
## Citation
If you find our work helpful, feel free to give us a cite.