Skip to content

Go API 环境下,离线说话人分离(GPU)很慢,请问有什么优化建议吗? #3239

@tumingke0

Description

@tumingke0

sherpa-onnx 的 Go API 来处理长音频(比如一段 21 分钟的 WAV 音频),处理流程是:离线说话人分离 + 离线 ASR (SenseVoice)。

我已经加上了 -DSHERPA_ONNX_ENABLE_GPU=ON 参数,自己从源码编译了带有 CUDA 支持的 .so 共享库,并替换了 Go module 缓存中的文件,成功启用了 GPU 加速。

在测试中我发现,ASR 解码部分的 GPU 加速非常明显,速度极快;但是说话人分离这一步,处理 21 分钟的音频需要将近 5 分钟,这在我们后续处理几小时的长录音时会遇到严重的性能瓶颈。

以下是我的环境和配置信息:

  1. 运行环境

系统: Linux (基于 AutoDL 容器)GPU: NVIDIA GeForce RTX 3090 (24GB 显存)CUDA 版本: 12.8 / 13.0开发语言: Go (github.com/k2-fsa/sherpa-onnx-go)测试音频: 21.2 分钟 (16000Hz, 单声道 Mono, WAV)

  1. 使用的模型

分割模型: sherpa-onnx-pyannote-segmentation-3-0/model.onnx
声纹嵌入模型: 3dspeaker_speech_eres2net_base_sv_zh-cn_3dspeaker_16k.onnx
ASR 模型: sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/model.int8.onnx (SenseVoice int8 量化版)

在 RTX 3090 上,

OfflineSpeakerDiarization (Pyannote + 3DSpeaker) 处理 21 分钟录音耗时约 5 分钟,这个速度是符合预期的正常表现吗?还是我的参数配置(比如缺少什么多线程参数或者内部 Provider 处理问题)不对?在目前架构下,聚类(Clustering)步骤是不是纯 CPU 运行的?这部分是否是不可优化的核心瓶颈?对于长时间录音,目前库里有没有更小、更快的分割/声纹模型可以替换,能够在牺牲一点点精度的情况下来大幅度换取速度?如果业务上确实需要处理 6 小时级别的超大音频,且强制要求区分说话人,官方是否有其他工程上的架构或优化建议?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions