---
title: speech_flatsepreformer_separation_temporal_8k_base_libri2mix100
canonical_url: "https://www.modelscope.cn/models/iic/speech_flatsepreformer_separation_temporal_8k_base_libri2mix100"
md_url: "https://www.modelscope.cn/models/iic/speech_flatsepreformer_separation_temporal_8k_base_libri2mix100.md"
repository: iic/speech_flatsepreformer_separation_temporal_8k_base_libri2mix100
chinese_name: "FLA-T-SepReformer-语音分离-单麦-8k-Base"
last_updated: 2026-09-10
license: "CC BY-NC 4.0"
pipeline_tag: speech-separation
tasks:
  - speech-separation
model_type:
  - flasepformer
library_name:
  - pytorch
  - onnx
frameworks:
  - pytorch
domain:
  - audio
downloads: 22
stars: 15
tags:
  - Alibaba
  - Audio
  - "Speech Separation"
  - FLASepformer
  - "Focused Linear Attention"
  - "语音分离"
---

# speech_flatsepreformer_separation_temporal_8k_base_libri2mix100

> speech_flatsepreformer_separation_temporal_8k_base_libri2mix100 - iic 在 ModelScope 开源的模型。FLASepformer语音分离模型介绍

iic/speech_flatsepreformer_separation_temporal_8k_base_libri2mix100 是 ModelScope 魔搭社区上的speech-separation模型，采用 CC BY-NC 4.0 许可。

- **Repository**: iic/speech_flatsepreformer_separation_temporal_8k_base_libri2mix100
- **License**: CC BY-NC 4.0
- **Tasks**: speech-separation
- **Tags**: Alibaba, Audio, Speech Separation, FLASepformer, Focused Linear Attention, 语音分离
- **Downloads**: 22
- **Stars**: 15
- **Last updated**: 2026-09-10

Source: https://www.modelscope.cn/models/iic/speech_flatsepreformer_separation_temporal_8k_base_libri2mix100

---

# FLASepformer语音分离模型介绍

**本模型卡发布的是 FLA-SepReformer-B：模型采用纯时域建模，在 Libri2Mix-100（train-100）上训练，用于 8 kHz 单声道双说话人语音分离。**

FLASepformer是面向长语音序列的高效单声道语音分离模型，有两个变体 FLA-SepReformer和FLA-TFLocoformer。

模型输入为一段包含两位说话人的8 kHz单声道混合语音，输出为两路独立的说话人语音。

在餐厅、会议室、访谈或多人通话中，不同说话人的声音经常同时出现。麦克风会把这些声音叠加成一条混合音频，而听者通常只想听清其中某个人的内容。人类可以凭借选择性听觉在嘈杂人群中关注特定说话人，这就是经典的“鸡尾酒会问题”；让自动系统获得类似的多说话人分离能力，则一直是语音处理领域的重要挑战。

语音分离（Speech Separation）的目标是把重叠在同一段录音中的多个说话人信号拆分为相互独立的语音流，为后续的收听、转写和分析提供更清晰的输入。它与主要去除环境噪声的语音降噪不同，也不要求像目标说话人提取那样预先提供某位说话人的参考语音；本次发布模型面向干净条件下的双说话人分离，并输出两个说话人的语音。

模型的潜在应用场景：

* 分离多人会议、访谈、播客及视频中的重叠人声，生成便于编辑的独立音轨。
* 作为自动语音识别（ASR）的前处理模块，减少重叠语音对转写结果的影响。
* 支持客服录音、远程会议和双人通话中的说话内容分析。
* 为说话人分割（Speaker Diarization）、说话人识别、字幕制作及其他语音机器学习任务提供前端处理。

## 模型描述

语音分离需要从单通道混合语音中恢复每位说话人的独立语音。对于较长的语音序列，已有方法通常通过下采样、分块或时频变换缩短序列，再使用Transformer捕获全局信息。然而，标准自注意力需要构造完整的注意力矩阵，其时间和空间复杂度随序列长度呈二次增长。即使模型已经对输入进行了压缩，处理长音频时的显存占用和推理时间仍会快速增加。

为解决这一问题，我们将Focused Linear Attention（FLA）引入语音分离，并提出FLASepformer。FLA通过改变矩阵乘法顺序，先聚合键和值，再与查询进行计算，从而避免显式构造长度平方规模的注意力矩阵，使注意力的计算和显存复杂度随序列长度线性增长。模型因此能够更高效地处理长语音，同时保留并行训练能力和全局信息建模能力。

普通线性注意力虽然高效，但容易产生过于平滑的注意力分布，并受到低秩特征表达的限制。FLASepformer从以下三个方面增强线性注意力：

* **Focused Function：** 对query和key进行pull-push映射，使相似特征更加接近、无关特征更加分离，从而形成更集中的注意力分布，增强长距离语音特征的选择能力。
* **DWC1d局部补偿：** 使用适合语音序列的一维depthwise convolution补充局部信息，提高特征多样性，缓解普通线性注意力的低秩表达问题。
* **Gated模块：** 根据当前token的特征生成门控权重，对FLA输出进行自适应控制，使模型能够选择性地融合全局上下文，并进一步改善分离性能。

FLASepformer包含FLA-SepReformer和FLA-TFLocoformer两个变体。T-SepReformer（基础结构来自SepReformer）与TF-Locoformer均为已有语音分离模型，本工作的重点不是重新提出这两种基础结构，而是将Gated FLA用于它们的长序列建模模块：FLA-SepReformer替换SepReformer Global Transformer中的全局注意力；FLA-TFLocoformer替换TF-Locoformer Temporal Modeling中的自注意力，同时保留原有的Frequency Modeling与Conv-SwiGLU等模块。

![图1. Gated FLA、FLA-SepReformer与FLA-TFLocoformer模型结构](description/model.jpg)

## 长语音推理效率

FLASepformer将长序列注意力的复杂度从二次降低为线性。实验表明，模型在保持有竞争力的语音分离性能的同时，能够减少长音频推理的显存占用并缩短推理时间。

以30秒混合语音为例，FLA-SepReformer-T/B/L相对对应规模的SepReformer分别获得2.29倍、1.91倍和1.49倍的推理加速，GPU显存占用分别约为对应模型的15.8%、20.9%和31.9%。FLA-TFLocoformer同样将Temporal Modeling的注意力复杂度从二次降为线性，使推理时间和显存占用随音频长度更加平稳地增长。

![图2. WSJ0-2Mix上的SI-SNRi与GPU推理时间对比](description/sisnr_wsj02mix_gputime.jpg)

![图3. 不同音频长度下的GPU推理时间与显存占用](description/RTF_GPU_Usage.jpg)

## 模型的使用方式

模型pipeline输入为一个8000 Hz采样率的单声道wav文件，内容为两位说话人的混合语音，输出为分离后的两个单声道PCM音频。

### 环境准备

* 本模型支持Linux、Windows和MacOS平台。
* 安装ModelScope及推理所需依赖：

```shell
pip install modelscope torch numpy soundfile
```

* 目前Modelscope包尚未更新，请用最新源码安装

```shell
python -m pip install -U \
  "modelscope @ git+https://github.com/modelscope/modelscope.git@master"
```

* 本模型使用SoundFile处理wav文件。Linux用户需要安装SoundFile的底层依赖库libsndfile；Windows和MacOS通常不需要额外操作。以Ubuntu为例：

```shell
sudo apt-get update
sudo apt-get install libsndfile1
```

### 代码范例

根据需要从以下两个模型ID中选择一个：

```python
model_id = 'damo/speech_flatflocoformer_separation_timefrequency_8k_middle_libri2mix360'
# model_id = 'damo/speech_flatsepreformer_separation_temporal_8k_base_libri2mix100'
```

完整推理代码如下：

```python
import numpy as np
import soundfile as sf
from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks


# input可以是URL，也可以是本地文件路径；音频必须为8 kHz单声道wav
input = 'https://modelscope.cn/api/v1/models/damo/speech_flatflocoformer_separation_timefrequency_8k_middle_libri2mix360/repo?Revision=master&FilePath=examples/mix_speech1.wav'
model_id = 'damo/speech_flatflocoformer_separation_timefrequency_8k_middle_libri2mix360'

separation = pipeline(Tasks.speech_separation, model=model_id)
result = separation(input)

for i, signal in enumerate(result[OutputKeys.OUTPUT_PCM_LIST]):
    save_file = f'output_spk{i + 1}.wav'
    sf.write(save_file, np.frombuffer(signal, dtype=np.int16), 8000)
```



### ONNX导出与推理

下面的示例支持本次发布的两个模型。FLA-SepReformer可以直接导出从波形到两路波形的完整ONNX模型；FLA-TFLocoformer包含复数STFT/iSTFT操作，因此ONNX文件仅包含分离器，推理时仍使用PyTorch完成STFT与iSTFT。两个模型均支持动态batch和动态音频长度。

#### 导出ONNX模型

通过环境变量`MODEL_ID`选择模型，默认导出FLA-TFLocoformer-M；`MODEL_ID`也可以设置为已下载的本地模型目录。输出文件默认为当前目录下的`onnx_model.onnx`。

```python
import inspect
import os

import onnx
import torch
import torch.nn as nn
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks


MODEL_ID = os.environ.get(
    'MODEL_ID',
    'damo/speech_flatflocoformer_separation_timefrequency_8k_middle_libri2mix360')
ONNX_PATH = os.environ.get('ONNX_PATH', 'onnx_model.onnx')


class TFLocoformerOnnxWrapper(nn.Module):
    """将复数频谱拆成ONNX支持的实部和虚部张量。"""

    def __init__(self, separator):
        super().__init__()
        self.separator = separator

    def forward(self, mixture_real, mixture_imag):
        batch = torch.stack((mixture_real, mixture_imag), dim=1)
        batch_size, _, frames, freqs = batch.shape

        with torch.autocast(device_type=batch.device.type, enabled=False):
            batch = self.separator.conv(batch)

        frequency_index = 0
        time_index = 0
        for layer_type in self.separator.layers_type:
            if layer_type == 'f':
                batch = self.separator.f_blocks[frequency_index](batch)
                frequency_index += 1
            else:
                batch = self.separator.t_blocks[time_index](batch)
                time_index += 1

        with torch.autocast(device_type=batch.device.type, enabled=False):
            batch = self.separator.deconv(batch)

        batch = batch.reshape(
            batch_size, self.separator.num_spk, 2, frames, freqs)
        return batch[:, :, 0], batch[:, :, 1]


separation = pipeline(
    Tasks.speech_separation, model=MODEL_ID, device='cpu')
model = separation.model.eval()

if 'flatflocoformer' in str(MODEL_ID):
    export_model = TFLocoformerOnnxWrapper(model.separator).eval()
    example_inputs = (
        torch.randn(1, 126, 65),
        torch.randn(1, 126, 65),
    )
    input_names = ['mixture_real', 'mixture_imag']
    output_names = ['sources_real', 'sources_imag']
    dynamic_axes = {
        'mixture_real': {0: 'batch', 1: 'frames'},
        'mixture_imag': {0: 'batch', 1: 'frames'},
        'sources_real': {0: 'batch', 2: 'frames'},
        'sources_imag': {0: 'batch', 2: 'frames'},
    }
    metadata = {
        'input_domain': 'stft',
        'n_fft': '128',
        'hop_length': '64',
    }
elif 'flatsepreformer' in str(MODEL_ID):
    export_model = model
    example_inputs = (torch.randn(1, 8000), )
    input_names = ['mixture']
    output_names = ['sources']
    dynamic_axes = {
        'mixture': {0: 'batch', 1: 'samples'},
        'sources': {0: 'batch', 1: 'samples'},
    }
    metadata = {'input_domain': 'waveform'}
else:
    raise ValueError(f'不支持导出该模型：{MODEL_ID}')

export_options = {}
if 'dynamo' in inspect.signature(torch.onnx.export).parameters:
    export_options['dynamo'] = False

torch.onnx.export(
    export_model,
    example_inputs,
    ONNX_PATH,
    opset_version=17,
    input_names=input_names,
    output_names=output_names,
    dynamic_axes=dynamic_axes,
    **export_options,
)

onnx_model = onnx.load(ONNX_PATH)
metadata.update({'sample_rate': '8000', 'num_speakers': '2'})
for key, value in metadata.items():
    item = onnx_model.metadata_props.add()
    item.key = key
    item.value = value
onnx.checker.check_model(onnx_model)
onnx.save(onnx_model, ONNX_PATH)
print(f'ONNX模型已导出到：{ONNX_PATH}')
```

导出另一个模型时，可在命令行中指定`MODEL_ID`：

```shell
MODEL_ID=damo/speech_flatsepreformer_separation_temporal_8k_base_libri2mix100 python export_onnx.py
```

#### 使用ONNX Runtime推理

下面的代码会读取ONNX元数据，自动判断模型使用波形输入还是STFT输入，并将分离结果保存为`output_spk1.wav`和`output_spk2.wav`。

```python
import os

import numpy as np
import onnxruntime
import soundfile as sf
import torch


ONNX_PATH = os.environ.get('ONNX_PATH', 'onnx_model.onnx')
AUDIO_PATH = os.environ.get('AUDIO_PATH', 'examples/mix_speech1.wav')

mixture, sample_rate = sf.read(AUDIO_PATH, dtype='float32')
if sample_rate != 8000:
    raise ValueError(f'音频采样率必须为8000 Hz，当前为{sample_rate} Hz')
if mixture.ndim != 1:
    raise ValueError(f'音频必须为单声道，当前shape为{mixture.shape}')

session = onnxruntime.InferenceSession(
    ONNX_PATH, providers=['CPUExecutionProvider'])
metadata = session.get_modelmeta().custom_metadata_map

if metadata.get('input_domain') == 'waveform':
    sources = session.run(
        None, {'mixture': mixture[None].astype(np.float32)})[0]
    sources = sources[0].transpose(1, 0)
elif metadata.get('input_domain') == 'stft':
    mixture_tensor = torch.from_numpy(mixture).unsqueeze(0)
    mixture_std = torch.std(mixture_tensor, dim=1, keepdim=True)
    if mixture_std.item() == 0:
        raise ValueError('输入音频不能是静音')
    normalized = mixture_tensor / mixture_std
    window = torch.hann_window(128, dtype=normalized.dtype)
    spectrogram = torch.stft(
        normalized,
        n_fft=128,
        hop_length=64,
        win_length=128,
        window=window,
        center=True,
        normalized=False,
        onesided=True,
        return_complex=True,
    ).transpose(1, 2)
    sources_real, sources_imag = session.run(
        None,
        {
            'mixture_real': spectrogram.real.numpy(),
            'mixture_imag': spectrogram.imag.numpy(),
        },
    )
    source_specs = torch.complex(
        torch.from_numpy(sources_real), torch.from_numpy(sources_imag))
    waves = [
        torch.istft(
            source_specs[:, speaker].transpose(1, 2),
            n_fft=128,
            hop_length=64,
            win_length=128,
            window=window,
            center=True,
            normalized=False,
            onesided=True,
            length=mixture.shape[0],
            return_complex=False,
        ) * mixture_std
        for speaker in range(source_specs.shape[1])
    ]
    sources = torch.cat(waves, dim=0).numpy()
else:
    raise ValueError('ONNX模型缺少有效的input_domain元数据')

for speaker, source in enumerate(sources, start=1):
    peak = np.max(np.abs(source))
    output = source if peak == 0 else source * (0.5 / peak)
    output_path = f'output_spk{speaker}.wav'
    sf.write(output_path, output.astype(np.float32), sample_rate)
    print(f'已保存：{output_path}')
```


### 模型局限性

* 本模型仅支持8000 Hz单声道音频，并固定输出两个说话人声源；不支持自动判断说话人数。
* 本模型使用干净、完全重叠的Libri2Mix双说话人混合语音训练。噪声、混响、音乐、歌声、电话信道及明显不同于训练数据的录音条件可能造成性能下降。
* 两路输出的说话人顺序不固定，同一说话人在不同音频中不一定对应相同的输出序号。
* Gated FLA使注意力复杂度随序列长度线性增长，但当前pipeline仍会一次性载入并处理完整音频，不属于流式语音分离模型。

## 许可证及使用限制

本模型采用[CC BY-NC 4.0（Creative Commons Attribution-NonCommercial 4.0 International）](https://creativecommons.org/licenses/by-nc/4.0/legalcode.en)许可协议。

本模型仅限非商业学术研究用途，严禁商用。本次发布不包含原始训练数据，如需获取请自行向各数据提供方申请并签署相应许可协议。下游用户须自行确保符合各数据提供方的许可条款。本模型输出不得用于生物特征识别或监控用途或其它违反法律法规和相关规定的行为。



## 训练数据介绍

FLASepformer论文使用WSJ0-2Mix、WHAM!、WHAMR!和Libri2Mix评估模型。其中，本次发布的FLA-SepReformer-B使用Libri2Mix的train-100子集训练，FLA-TFLocoformer-M使用train-360子集训练。

Libri2Mix由LibriSpeech语音构造双说话人混合数据。train-100约29小时，train-360约106小时，验证集与测试集各约5.5小时。本次发布的两个模型均采用8 kHz、full-overlap、min版本的干净混合语音。

## 数据评估及结果

论文中按一位小数报告的对应结果分别为：FLA-TFLocoformer-M在Libri2Mix-360上达到22.2 dB SI-SNRi和22.4 dB SDRi；FLA-SepReformer-B在Libri2Mix-100上达到20.3 dB SI-SNRi和20.7 dB SDRi。论文中的其他结果用于说明不同规模FLASepformer的整体性能与效率，不代表本次发布包含其他数据集或其他规模的checkpoint。

![表1. 模型在WSJ0-2Mix上的性能对比](description/matrix_wsj02mix.jpg)

![表2. 模型在WHAM!、WHAMR!和Libri2Mix-100上的性能对比](description/matrix_wham_whamr_libri2mix100.jpg)

![表3. 模型在Libri2Mix-360上的性能对比](description/matrix_libri2mix360.jpg)

### 指标说明

* SI-SNR（Scale-Invariant Signal-to-Noise Ratio）衡量估计语音相对参考语音的失真程度，并消除整体幅度缩放的影响；数值越高表示分离质量越好。
* SI-SNRi和SDRi分别表示分离结果相对输入混合语音在SI-SNR和SDR上的提升量。
* SAR、SDR和SIR分别反映伪影、总体失真和残留干扰。

### 相关论文以及引用信息

论文：[FLASepformer: Efficient Speech Separation with Gated Focused Linear Attention Transformer](https://www.isca-archive.org/interspeech_2025/wang25j_interspeech.html)

```bibtex
@inproceedings{wang25j_interspeech,
  title     = {{FLASepformer: Efficient Speech Separation with Gated Focused Linear Attention Transformer}},
  author    = {Haoxu Wang and Yiheng Jiang and Gang Qiao and Pengteng Shi and Biao Tian},
  year      = {2025},
  booktitle = {{Interspeech 2025}},
  pages     = {1468--1472},
  doi       = {10.21437/Interspeech.2025-1315},
}
```
