Files
FunASR/tests_models/test_eres2netv2.py
T
游雁 106cbb69a3 feat: add ERes2NetV2 speaker model with full AutoModel integration
Integrates ERes2NetV2 from 3D-Speaker into FunASR as a speaker
verification/diarization model. Can be used standalone or as spk_model
combined with VAD + ASR for speaker-attributed transcription.

Usage (standalone speaker embedding):
    model = AutoModel(model="iic/speech_eres2netv2_sv_zh-cn_16k-common")
    res = model.generate(input="audio.wav")
    embedding = res[0]["spk_embedding"]  # shape: [1, 192]

Usage (with ASR + speaker diarization):
    model = AutoModel(
        model="paraformer-zh",
        vad_model="fsmn-vad",
        spk_model="iic/speech_eres2netv2_sv_zh-cn_16k-common",
    )
    res = model.generate(input="audio.wav")

Tested end-to-end: ModelScope download + embedding extraction verified.

New files:
- funasr/models/eres2net/eres2netv2.py (network architecture)
- funasr/models/eres2net/model.py (FunASR wrapper with inference)
- tests_models/test_eres2netv2.py
- examples/industrial_data_pretraining/eres2netv2_sv/demo.py
- examples/industrial_data_pretraining/eres2netv2_sv/demo_sv.py
2026-05-20 05:27:53 +00:00

68 lines
2.2 KiB
Python

#!/usr/bin/env python3
"""Test ERes2NetV2: speaker verification/diarization with ASR"""
import sys
import time
def main():
from funasr import AutoModel
url_zh = "https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_zh.wav"
# Test 1: ERes2NetV2 as spk_model combined with VAD + ASR
print("[ERes2NetV2] Loading model with VAD + ASR + SPK...")
t0 = time.time()
model = AutoModel(
model="iic/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch",
vad_model="iic/speech_fsmn_vad_zh-cn-16k-common-pytorch",
vad_kwargs={"max_single_segment_time": 60000},
spk_model="iic/speech_eres2netv2_sv_zh-cn_16k-common",
device="cuda:0",
disable_update=True,
)
print("[ERes2NetV2] Model loaded in %.1fs" % (time.time() - t0))
# Test with speaker diarization
print("[ERes2NetV2] Running inference with speaker diarization...")
t0 = time.time()
res = model.generate(
input=url_zh,
batch_size_s=300,
)
print("[ERes2NetV2] Inference done in %.1fs" % (time.time() - t0))
if res and len(res) > 0 and "text" in res[0]:
print("[ERes2NetV2] Result: %s" % res[0]["text"])
if "spk" in res[0]:
print("[ERes2NetV2] Speaker: %s" % res[0]["spk"])
print("[ERes2NetV2] Test 1 PASSED")
else:
print("[ERes2NetV2] Test 1 FAILED - no text in result")
return 1
# Test 2: ERes2NetV2 standalone speaker embedding
print("[ERes2NetV2] Test 2: Standalone speaker embedding...")
t0 = time.time()
spk_model = AutoModel(
model="iic/speech_eres2netv2_sv_zh-cn_16k-common",
device="cuda:0",
disable_update=True,
)
res = spk_model.generate(input=url_zh)
print("[ERes2NetV2] Embedding done in %.1fs" % (time.time() - t0))
if res and len(res) > 0 and "spk_embedding" in res[0]:
emb = res[0]["spk_embedding"]
print("[ERes2NetV2] Embedding shape: %s" % str(emb.shape))
print("[ERes2NetV2] Test 2 PASSED")
else:
print("[ERes2NetV2] Test 2 FAILED - no spk_embedding in result")
return 1
print("[ERes2NetV2] All tests PASSED")
return 0
if __name__ == "__main__":
sys.exit(main())