Skip to content

【暴露的问题比断句严重】实时语音,切分不够彻底,怎么解决 #3727

Open

Description

@andyuan1000

实时语音,切分不够彻底,怎么解决
Image

Activity

  1. added
    bugSomething isn't working
    needs triageNeeds maintainer triage and routing
    on Sep 23, 2026
  2. andyuan1000 commented on Sep 24, 2026

    @andyuan1000
    Author

    实时语音,切分不够彻底,怎么解决 Image

    画框的代表,同一个人的说话,被切断了。

  3. LauraGPT commented on Sep 28, 2026

    @LauraGPT
    Collaborator

    看了原图和补充说明,圈出的两段是 19.5–24.4s / SPK2 与 24.4–31.5s / SPK3。这里需要区分“同一人的一句话被分成两段”和“同一人被分配成两个说话人标签”;仅调 VAD 静音阈值不能同时保证解决这两类问题。

    另外,图里 41.3–45.4s 排在 19.5–24.4s 前面。建议同时核对未经过界面排序/拼接的原始结果,先确认时间顺序来自服务端还是展示层。截图本身不足以判断根因。

    排查相关实现时,我复现了一个独立的说话人分配错误,并提交了 #3733:旧 distribute_spk 会重复累计首个领先片段的重叠时长。例如同一句中 A 占 4 秒、B 占 6 秒,却分配给 A;同一标签的非连续片段也可能漏计。候选修复按说话人累计每段的实际交集,32 项直接回归及相关 HTTP/实时服务等共 202 项测试通过。PR 已通过线上 MOSS adapter 与 NumPy 兼容性检查并合并主分支;这是主分支改动,不表示现有安装已包含修复;这不等于已经复现或解决你这段音频的问题,也不涉及声学模型准确率验证。

    为了继续定位,请补充下面这组最小信息,不需要上传整段私密录音:

    • FunASR 版本、实际模型名称,以及使用的是 Python AutoModel、WebSocket 服务还是第三方页面;附模型初始化和调用参数。
    • 圈出位置前后的一小段可公开音频(仅在有权分享时提供),并标出你认为应该保持同一说话人的时间范围。
    • 对应的原始 sentence_info,或服务实际返回的 JSON;如果每个音频块分别调用,请附相邻两次返回以及送入块的时间范围。

    同一说话人可以有多个句段,句段边界不必等于说话人切换;不同独立推理请求产生的聚类编号也不能直接当作跨请求的身份 ID。先保留原始分段和标签,不建议在界面上强行把 SPK2、SPK3 全局合并。这个 issue 保持开放,等原始结果对照后再确定是哪一层需要修复。

  4. andyuan1000 commented on Oct 12, 2026

    @andyuan1000
    Author

    对应补充如下:

    1. 复现环境(最小定位信息)

    • FunASR 版本:本地复现环境 1.4.2(venv);线上运行 1.4.15(容器部署,与本地同代码)
    • 调用方式:自研 WebSocket 服务(realtime_ws.py,非官方 client 页面)。协议:连接后发文本 START → LANGUAGE:zh → 二进制 Int16 PCM 16kHz 单声道(4096 帧/块)→ STOP;服务端返回 {"sentences":[{start,end,text,spk,...}], "partial":..., "is_final":...}
    • 实际模型与初始化参数(均为 AutoModel(..., disable_update=True)):
      • ASR:iic/speech_seaco_paraformer_large_asr_nat-zh-cn-16k-common-vocab8404(SeACo-Paraformer-Large,非流式;device=cuda,fp16=False,punc=True 接 ct-punc 补标点)
      • VAD:iic/speech_fsmn_vad_zh-cn-16k-common-pytorch(device=cpu,ncpu=1)
      • 说话人:iic/speech_campplus_sv_zh-cn_16k-common(cam++,device=cuda)
    • 处理链路与关键参数:fsmn-vad 切句 → paraformer 整段解码 → 句子确认 → cam++ 对该句提 spk_embedding → distribute_spk(sentence_list, sd_time_list) → sentence["spk"]。VAD 参数(config 覆盖模型默认):max_single_segment_time=15000ms、max_end_silence_time=800ms、max_start_silence_time=3000ms、speech_noise_thres=0.6、speech_to_sil_time_thres=150、chunk_size_ms=60。说话人跟踪:threshold=0.6、max_history_chunks=128、max_speakers=15、ClusterBackend(merge_thr=0.78)。

    2. 关于时间顺序(41.3–45.4s 排在 19.5–24.4s 前面)

    同意截图不足以判断根因。我们会核对服务端返回的原始 sentence JSON 顺序与时间戳(跳过前端展示层),确认乱序来自服务端下发还是页面拼接/排序,再回来同步。

    3. 关于 SPK2/SPK3 不强行合并

    同意。我们不会在前端全局合并 SPK2/SPK3,保留原始分段与标签,等原始结果对照后确定是哪一层需要修复。

    4. 关于 distribute_spk(PR#3733)

    我们已复现同类分配错误(同句 A 占 4s、B 占 6s 却分给 A 的场景),并按 PR#3733 的修复思路在用户侧代码准备了 monkey-patch(不打 funasr 第三方包源码),在正式升级到含修复的 funasr 版本前临时生效;升级后会移除 patch。句段边界 ≠ 说话人切换这点我们理解,也会按"同一说话人可有多个句段"来对照数据。

    5. 待补充项(我们这边会补)

    • 圈出位置(19.5–24.4s / 24.4–31.5s)前后一小段可公开音频(有权限分享的部分)
    • 对应的原始 sentence_info JSON(服务端实际返回,含 start/end/text/spk 字段,未排序/未拼接版本);如按音频块分别调用,附相邻两次返回及送入块的时间范围
    • 我们会标注认为应该保持同一说话人的时间范围

    大佬,这个问题说话人分不干净一般怎么改尼?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds triageNeeds maintainer triage and routing

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions