1. 研究背景
最近有一位粉丝找我给他电脑远程安装一个名为kotoba_whisper的项目,这个是huggingface中开源的一个项目,专门提升了对日语的语音识别准确率,同时还支持区分说话人。这篇文章主要记录我在部署中遇到的坑以及解决方法。
2. 坑之transformers版本问题
项目开源地址:
https://huggingface.co/kotoba-tech/kotoba-whisper-v2.2
我是根据上面地址写的readme文档部署的,但是会存在一些依赖问题。
首先就是transformers版本,如果使用官方说明文档中的命令安装的是最新版本的,在只需官方提供的demo代码时会出现下面的错误。
AttributeError: 'SegmentationModel' object has no attribute 'all_tied_weights_keys'. Did you mean: '_tied_weights_keys'?
这是transformers版本问题,但是作者在开发这个项目的时候用的版本和现在我们安装的版本不一样,这里解决方法是修改transformers源码,打开下面代码。
transformers/modeling_utils.py
找到下面这行代码,大概在4748行。
for key in missing_keys - self.all_tied_weights_keys.keys():
把这语句替换为下面两条语句。
all_tied_keys = getattr(self, "all_tied_weights_keys", {})
for key in missing_keys - (all_tied_keys.keys() if hasattr(all_tied_keys, "keys") else []):
3. 坑之pyannote.audio版本问题
同样我使用官方readme文档中的命令安装的pyannote.audio也是最新版本的,和当时作者用的版本也不一致,因此也需要修改源码或者降低版本。这里我直接修改源码解决。
首先修改源码之前,运行代码会报下面的错误。
AttributeError: 'DiarizeOutput' object has no attribute 'labels
这是因为新版本的pyannote.audio不是直接调用lables函数,可以打开下面的代码,修改源码。
kotoba_whisper.py
找到194行的位置,把原先的
labels = list(sd.labels())
修改为下面这样
labels = list(sd.speaker_diarization.labels())
同时我们还需要修改另外一条语句,否则会报下面的错误。
AttributeError: 'DiarizeOutput' object has no attribute 'label_timeline'
找到196行,把原先的
timelines = list(sd.label_timeline(s))
修改为下面这样
timelines = list(sd.speaker_diarization.label_timeline(s))
到此,全部的报错都解决了,接下来就可以试试效果了。
4. 运行效果
运行官方提供的代码
import torch
import torch.nn as nn
setattr(nn.Module, 'all_tied_weights_keys', {})
from transformers import pipeline
# config
model_id = "kotoba-tech/kotoba-whisper-v2.2"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model_kwargs = {"attn_implementation": "sdpa"} if torch.cuda.is_available() else {}
# load model
pipe = pipeline(
model=model_id,
torch_dtype=torch_dtype,
device=device,
model_kwargs=model_kwargs,
batch_size=8,
trust_remote_code=True,
)
# run inference
result = pipe("sample_diarization_japanese.mp3", chunk_length_s=15)
print(result)
这里我在文件开头位置添加了下面的语句
import torch.nn as nn
setattr(nn.Module, 'all_tied_weights_keys', {})
其实这个现在可以去掉了,当时是为了解决transformers版本问题添加的,上面已经修改了transformers源码解决了,可以删除这两条语句了。
执行命令运行。
python demo.py
出现下面的结果。

可以看到有时间戳,文本内容和说话人标识。
Q.E.D.


