Pyannote Speaker Diarization离线使用报错求助
此前在线加载Pyannote说话人 diarization 模型的代码可正常运行:
from pyannote.audio import Pipeline access_token = 'xxxxxxxxxxx' model = Pipeline.from_pretrained( "pyannote/speaker-diarization-3.1", use_auth_token=access_token) path_in = 'blabla/1-137-A-32.wav' num_speakers = 1 model(path_in, num_speakers=num_speakers).labels()
尝试离线使用时,按官方教程配置本地目录与pyannote_offline_config.yaml后,直接加载yaml模型报错:"A pipeline must be instantiated with pipeline.instantiate(parameters) before it can be applied.";调用instantiate方法传入参数仍报相同错误。仅结合在线模型ID与本地yaml加载时本地可正常运行,但上传至GitLab后出现模型下载认证报错;本地无yaml仅加载在线模型也可正常运行。
1. 确保离线模型文件完整
不要只复制单独的pipeline.yaml或配置文件,必须下载完整的模型仓库内容,包括所有权重、子组件配置。用huggingface-cli命令下载:
huggingface-cli download pyannote/speaker-diarization-3.1 --local-dir ./local-speaker-diarization --local-dir-use-symlinks False
该命令会将模型的所有文件(包括主pipeline配置、子模型权重、组件配置)下载到./local-speaker-diarization目录。
2. 正确加载本地离线模型
方式一:直接加载本地完整模型目录
不需要单独的pyannote_offline_config.yaml,直接用本地目录路径加载:
from pyannote.audio import Pipeline # 指向本地下载的完整模型目录 model = Pipeline.from_pretrained("./local-speaker-diarization") path_in = 'blabla/1-137-A-32.wav' num_speakers = 1 model(path_in, num_speakers=num_speakers).labels()
这种方式下from_pretrained会自动解析目录内的配置,完成模型实例化,无需手动调用instantiate。
方式二:使用自定义yaml配置
如果必须用pyannote_offline_config.yaml,需确保yaml内所有组件的path字段都指向本地对应的子模型目录(绝对路径或相对项目根目录的路径),示例yaml结构:
version: 3.1 pipeline: name: pyannote.audio.pipelines.speaker_diarization.SpeakerDiarization params: clustering: name: pyannote.audio.pipelines.clustering.HierarchicalClustering params: embedding: path: ./local-speaker-diarization/embedding segmentation: path: ./local-speaker-diarization/segmentation # 其他组件同理,全部指向本地路径
加载时直接传入yaml路径即可:
from pyannote.audio import Pipeline model = Pipeline.from_pretrained("./pyannote_offline_config.yaml") model(path_in, num_speakers=num_speakers).labels()
3. 解决GitLab上的认证报错问题
GitLab环境无法自动下载在线模型,需:
- 将完整的本地模型目录通过Git LFS上传到GitLab仓库(因为模型权重文件较大,普通Git无法处理大文件)
- 修改代码中的模型路径,指向GitLab仓库内的模型目录(相对路径),彻底移除在线模型ID和
use_auth_token参数,避免触发下载请求
4. 排查instantiate报错原因
直接加载单独yaml文件报错的核心原因是:yaml仅定义了pipeline结构,但未指定实际模型组件的本地路径,导致pipeline无法加载权重完成实例化。确保yaml内所有组件的path都正确指向本地已下载的子模型目录,from_pretrained会自动完成实例化,无需手动调用instantiate。
内容的提问来源于stack exchange,提问作者Tütü

