---
title: campplus_sv-ONNX
canonical_url: "https://www.modelscope.cn/models/Maiteka/campplus_sv-ONNX"
md_url: "https://www.modelscope.cn/models/Maiteka/campplus_sv-ONNX.md"
repository: Maiteka/campplus_sv-ONNX
chinese_name: "说话人确认模型-ONNX版本"
last_updated: 2026-04-05
library_name:
  - pytorch
  - onnx
frameworks:
  - Pytorch
downloads: 116
stars: 3
---

# campplus_sv-ONNX

> campplus_sv-ONNX - Maiteka 在 ModelScope 开源的模型。这是一个用于**说话人验证（Speaker Verification）**的 ONNX 模型：`campplus_sv.onnx`。模型输入语音后输出 192 维说话人嵌入向量（speaker embedding），可用于：判断两段语音是否来自同一人构建声纹库 并进行相似度检索本模型主要面向中文普通话场景。

- **Repository**: Maiteka/campplus_sv-ONNX
- **Downloads**: 116
- **Stars**: 3
- **Last updated**: 2026-04-05

Source: https://www.modelscope.cn/models/Maiteka/campplus_sv-ONNX

---

# CAM++ 中文说话人识别模型（ONNX）

## 模型简介

这是一个用于**说话人验证（Speaker Verification）**的 ONNX 模型：`campplus_sv.onnx`。

模型输入语音后输出 192 维说话人嵌入向量（speaker embedding），可用于：

- 判断两段语音是否来自同一人
- 构建声纹库并进行相似度检索

本模型主要面向中文普通话场景。

---

## 输入输出规格

### 输入

- 输入名：`fbank`
- 形状：`(1, T, 80)`
- 类型：`float32`

说明：
- `T` 为时间帧数（与音频时长相关）
- `80` 为 log-Mel FBank 特征维度

### 输出

- 形状：`(1, 192)`
- 类型：`float32`

输出向量已做 L2 归一化，可直接使用点积作为余弦相似度。

---

## 快速使用

### 1) 安装依赖

```bash
pip install numpy onnxruntime torch torchaudio soundfile
```

### 2) 提取单条语音 embedding

```python
import numpy as np
import onnxruntime as ort
import soundfile as sf
import torch
import torchaudio


def load_wav_16k_mono(wav_path: str, target_sr: int = 16000) -> torch.Tensor:
    wav, sr = sf.read(wav_path, dtype="float32", always_2d=False)
    wav = torch.from_numpy(wav)
    if wav.dim() == 1:
        wav = wav.unsqueeze(0)
    else:
        wav = wav.T[:1, :]  # 多通道时取第一通道
    if sr != target_sr:
        wav = torchaudio.functional.resample(wav, sr, target_sr)
    return wav


def compute_fbank(waveform: torch.Tensor) -> np.ndarray:
    feats = torchaudio.compliance.kaldi.fbank(
        waveform,
        num_mel_bins=80,
        sample_frequency=16000,
        dither=0.0,
    )
    feats = feats - feats.mean(dim=0, keepdim=True)
    return feats.numpy().astype(np.float32)


session = ort.InferenceSession("campplus_sv.onnx", providers=["CPUExecutionProvider"])

wav = load_wav_16k_mono("test.wav")
fbank = compute_fbank(wav)                  # (T, 80)
inp = np.expand_dims(fbank, axis=0)         # (1, T, 80)

emb = session.run(None, {"fbank": inp})[0][0]  # (192,)
print("embedding shape:", emb.shape)
```

### 3) 两段语音相似度

```python
import numpy as np


def cosine_sim(emb1: np.ndarray, emb2: np.ndarray) -> float:
    # 模型输出已归一化，点积即余弦相似度
    return float(np.dot(emb1, emb2))


sim = cosine_sim(emb1, emb2)
print(f"similarity = {sim:.4f}")

# 经验阈值（建议按你的业务数据再标定）
threshold = 0.36
print("同一说话人" if sim >= threshold else "不同说话人")
```

---

## 使用建议

- 建议输入音频时长：1~10 秒
- 建议使用干净近讲语音
- 阈值需结合实际业务数据调优

---

## 许可证

请遵循原始模型及上游项目的开源许可证要求。
