Почему цикл в 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('На ноль делить нельзя')