我目前正在使用Python进行说话人分割的工作,并使用pyannote来进行嵌入。我的嵌入函数如下所示:
import torchimport librosafrom pyannote.core import Segmentdef embeddings_(audio_path,resegmented,range): model_emb = torch.hub.load('pyannote/pyannote-audio', 'emb') embedding = model_emb({'audio': audio_path}) for window, emb in embedding: assert isinstance(window, Segment) assert isinstance(emb, np.ndarray) y, sr = librosa.load(audio_path) myDict={} myDict['audio'] = audio_path myDict['duration'] = len(y)/sr data=[] for i in resegmented: excerpt = Segment(start=i[0], end=i[0]+range) emb = model_emb.crop(myDict,excerpt) data.append(emb.T) data= np.asarray(data) return data.reshape(len(data),512)
当我运行
embeddings = embeddings_(audiofile,resegmented,2)
我得到了以下错误:
ParameterError: Mono data must have shape (samples,). Received shape=(1, 87488721)
回答:
我遇到了同样的错误,但我找到了一个解决方法。对于我来说,错误是在”pyannote/audio/features/utils.py”中触发的,当它尝试使用以下代码行重新采样音频时:y = librosa.core.resample(y.T, sample_rate, self.sample_rate).T
这是我的解决方法
def get_features(self, y, sample_rate): # 转换为单声道 if self.mono: y = np.mean(y, axis=1, keepdims=True) y = np.squeeze(y) # 添加这一行 # 如果采样率不匹配,则重新采样 if (self.sample_rate is not None) and (self.sample_rate != sample_rate): y = librosa.core.resample(y.T, sample_rate, self.sample_rate).T sample_rate = self.sample_rate # 增强数据 if self.augmentation is not None: y = self.augmentation(y, sample_rate) # TODO: 这件事情有多耗时(需要进行性能分析...) if len(y.shape) == 1: # 添加这一行 y = y[:,np.newaxis] # 添加这一行 try: valid = valid_audio(y[:, 0], mono=True) except ParameterError as e: msg = f"在增强波形时出现问题。" raise ValueError(msg) return y
对y
使用np.squeeze
来进行librosa.core.resample
,然后使用y[:,np.newaxis]
将它的形状更改为(samples, 1)以用于valid = valid_audio(y[:, 0], mono=True)