Почему цикл в Python дает ошибку там, где без него аудиофайл обрабатывается корректно?

Строю алгоритм распознавания человека по его голосу с помощью библиотеки speechbrain. Записи каждого спикера у меня разложены по папкам spk1, spk2 и т.д., лежащим в директории speaker. Работаю в Google Colab.

Построил протокол проверки: для начала сравнил все записи одного человека с самим собой. Рассчитал accuracy. Затем стал это делать, сравнивая каждый файл всякого спикера со всеми записями, кроме своих.

И вот какая загвоздка. Если реализую метод сравнения вручную, то система отрабатывает без ошибки: дает tensor([True]) или tensor([False]).

from speechbrain.pretrained import SpeakerRecognition
verification = SpeakerRecognition.from_hparams(source="speechbrain/spkrec-ecapa-voxceleb", savedir="pretrained_models/spkrec-ecapa-voxceleb")
score, prediction = verification.verify_files('/content/drive/MyDrive/speaker/spk11/spk_11_track_1.wav', '/content/drive/MyDrive/speaker/spk12/spk_12_track_1.wav')

Однако стоит запустить цикл, как все полностью либо частично рушится. При первом проходе (сравниваем свои голоса) часть файлов дает ошибку (хотя другая часть отрабатывает корректно при удалении "ошибочных" файлов):

RuntimeError: Error loading audio file: failed to open file spk_8_track_4.wav

Эта ошибка могла бы свидетельствовать об ошибочности описанного до файла пути либо ошибки в указании его имени, если б не корректная работа "вручную".

Со вторым проходом еще печальней: там последовательно приходится удалить решительно все файлы.

С чем это может быть связано?

Код (сравнение всяких записей, кроме своих):

# подход распознавания на основе ECAPA: сравниваем несвои голоса 
!pip install speechbrain
from speechbrain.pretrained import SpeakerRecognition
from itertools import product, chain
from os import walk
import torch

nums_true=0
nums_total=0

all_files = dict()
for root, dirs, files in walk('/content/drive/MyDrive/speaker'):
    if not files:
        continue
    all_files[root] = files

for root in all_files.copy():
    files = all_files[root]
    del all_files[root] 
    
    # собираем по одному файлу для каждого списка (в итоге получаем идентичные 12 списков)
    other_files = list(chain(*[all_files[key] for key in all_files]))

    # Пример: product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    result = list(product(files, other_files))
    # print(result)
    for pairs in result:
      # print(pairs)
      verification = SpeakerRecognition.from_hparams(source="speechbrain/spkrec-ecapa-voxceleb", savedir="pretrained_models/spkrec-ecapa-voxceleb")
      score, prediction = verification.verify_files(os.path.join(root, pairs[0]), os.path.join(root, pairs[1]))
      nums_total+=1
      if prediction == torch.tensor([True]):
          nums_true+=1

# считаем метрику accuracy:
if nums_total !=0:
  accuracy = nums_true/nums_total
  print(accuracy)
else:
  print('На ноль делить нельзя')

Ответы (0 шт):