|
请问各位大佬,语音端点检测将两个人说的话识别为一句如何解决。 例子[{'key': 'crop', 'text': '喂,你好,我是交通银行服务中心客服代表,为防范微信诈骗保障账户安全。我行,对您进行间断的回访。请问您是郭先生本人吗?嗯,是。' |
Replies: 1 comment
|
这不是一个单纯的 ASR “识别精度”问题,需要先区分两个目标:
你第二个例子的时间戳里,前一句最后一个词到回答第一个词约有 只需要按这段静音切开可以先把端点静音阈值降到 300–500 ms,例如从 400 ms 开始: from funasr import AutoModel
model = AutoModel(
model="paraformer-zh",
vad_model="fsmn-vad",
vad_kwargs={"max_end_silence_time": 400},
punc_model="ct-punc",
)
res = model.generate(input="call.wav", batch_size_s=60)
print(res[0]["text"])这对你示例中的 640 ms 停顿有机会切开,但阈值越低,客服句子内部的自然停顿也越容易被切碎,所以应在一批真实电话上比较 300/400/500 ms,而不是只看一条录音。 需要真正区分两个人加入 CAM++ 说话人模型;已知通话固定为两人时,可以传 from funasr import AutoModel
model = AutoModel(
model="paraformer-zh",
vad_model="fsmn-vad",
vad_kwargs={"max_end_silence_time": 400},
punc_model="ct-punc",
spk_model="cam++",
spk_mode="punc_segment",
)
res = model.generate(
input="call.wav",
batch_size_s=60,
preset_spk_num=2,
)
for seg in res[0].get("sentence_info", []):
print(seg["start"], seg["end"], seg["spk"], seg["sentence"])当前流水线会在 VAD/ASR/标点之后计算说话人 embedding、聚类并写入 还有一个与你的“另一个人说得很短”直接相关的限制:当前 CAM++ 后处理会把 短于 0.7 秒 的说话人片段平滑到相邻说话人(源码)。我在 PyPI FunASR 1.3.14 上做了最小校验,0.6 秒的中间说话人片段会被合并,1.2 秒则保留。因此,极短的“嗯”“是”即使启用 CAM++ 也不能保证独立成段;如果业务必须保留所有不足 0.7 秒的插话,需要使用可配置最短说话时长的 diarization 后处理,并在真实电话集上同时评估误切率。 |
这不是一个单纯的 ASR “识别精度”问题,需要先区分两个目标:
你第二个例子的时间戳里,前一句最后一个词到回答第一个词约有
3730 - 3090 = 640 ms的间隔。当前 FSMN-VAD 配置的max_end_silence_time默认是 800 ms(配置源码),所以 640 ms 的停顿仍被保留在同一个 VAD 片段里,符合当前配置。只需要按这段静音切开
可以先把端点静音阈值降到 300–500 ms,例如从 400 ms 开始:
这对你示例中的 640 ms 停顿有机会切开,但阈值越低,客服句子内部的自然停顿也越容易被切碎,所以应在一批真实电话上比较 300/400/500 ms,而不是只看一条录音。
max_single_segment_time和batch_size_s都不…