Создание i-векторной системы
i-векторы представляют собой компактные статистические представления идентичности, извлеченной из звуковых сигналов. ivectorSystem создает обучаемую i-векторную систему для извлечения i-векторов и выполнения задач классификации, таких как распознавание говорящего, диаризация говорящего и классификация звука. Можно также определить пороги для задач открытых наборов и зарегистрировать метки в системе для классификации открытых и закрытых наборов.
InputType - Тип ввода'audio' (по умолчанию) | 'features'Тип ввода, указанный как 'audio' или 'features'.
'audio' - Система i-векторов принимает монозвуковые сигналы в качестве входных. Аудиоданные обрабатываются для извлечения 20 частотных кепстральных коэффициентов (MFCC), дельта-MFCC и дельта-дельта MFCC для коэффициентов 60 на кадр.
Если для InputType установлено значение 'audio' при создании i-векторной системы обучающими данными могут быть:
Массив ячеек одноканальных аудиосигналов, каждый из которых определен как вектор столбца с базовым типом single или double.
Один audioDatastore объект или signalDatastore объект, который указывает на набор данных монозвуковых сигналов.
A TransformedDatastore с нижележащим audioDatastore или signalDatastore указывает на набор данных монозвуковых сигналов. Выходные данные вызовов read из хранилища данных преобразования должны быть монозвуковые сигналы с базовым типом данных single или double.
'features' - i-вектор принимает предварительно извлеченные звуковые характеристики в качестве входных данных.
Если для InputType установлено значение 'features' при создании i-векторной системы обучающими данными могут быть:
Массив ячеек матриц с базовым типом single или double. Матрицы должны состоять из звуковых функций, в которых количество функций (столбцов) блокируется в первый раз. trainExtractor вызывается, и количество транзитных участков (строк) имеет переменный размер. Количество функций, вводимых при последующих вызовах любой из функций объекта, должно быть равно количеству функций, используемых при вызове trainExtractor.
A TransformedDatastore объект с нижележащим audioDatastore или signalDatastore чей read имеет вывод, как описано в предыдущем маркере.
A signalDatastore объект, чей read функция имеет выход, как описано в первом маркере.
Пример: ivs = ivectorSystem('InputType','audio')
Типы данных: char | string
SampleRate - Частота дискретизации аудиосигнала в Гц16000 (по умолчанию) | положительный скалярЧастота дискретизации входного звука в Гц, заданная как положительный скаляр.
Примечание
'SampleRate' свойство применяется только тогда, когда 'InputType' имеет значение 'audio'.
Пример: ivs = ivectorSystem('InputType','audio','SampleRate',48000)
Типы данных: single | double
DetectSpeech - Применить обнаружение речиtrue (по умолчанию) | falseПрименить обнаружение речи, указанное как true или false. С 'DetectSpeech' установить в значение truei-векторная система извлекает признаки только из областей, где обнаружена речь.
Примечание
DetectSpeech свойство применяется только тогда, когда InputType имеет значение 'audio'.
ivectorSystem использует detectSpeech функция обнаружения областей речи.
Пример: ivs = ivectorSystem('InputType','audio','DetectSpeech',true)
Типы данных: logical | single | double
EnrolledLabels - Таблица, содержащая зарегистрированные метки0около-2 таблица (по умолчанию)Это свойство доступно только для чтения.
Таблица, содержащая зарегистрированные метки, заданная как таблица. Имена строк таблицы соответствуют меткам, а имена столбцов соответствуют i-вектору шаблона и количеству отдельных i-векторов, используемых для создания i-вектора шаблона. Число i-векторов, используемых для генерации i-вектора шаблона, может рассматриваться как мера уверенности в шаблоне.
Типы данных: table
trainExtractor | Экстрактор i-вектора поезда |
trainClassifier | Классификатор i-вектора поезда |
enroll | Регистрация наклеек |
unenroll | Отменить регистрацию наклеек |
detectionErrorTradeoff | Оценка бинарной системы классификации |
verify | Проверить метку |
identify | Идентификация метки |
ivector | Извлечь i-вектор |
info | Вернуться к конфигурации обучения и информации о данных |
release | Разрешить изменение значений свойств и входных характеристик |
Используйте базу данных отслеживания основного тона Грацского технологического университета (PTDB-TUG) [1]. Набор данных состоит из 20 англоязычных носителей, читающих 2342 фонетически насыщенных предложения из корпуса TIMIT. Загрузите и извлеките набор данных. В зависимости от системы загрузка и извлечение набора данных может занять около 1,5 часов.
url = 'https://www2.spsc.tugraz.at/databases/PTDB-TUG/SPEECH_DATA_ZIPPED.zip'; downloadFolder = tempdir; datasetFolder = fullfile(downloadFolder,'PTDB-TUG'); if ~exist(datasetFolder,'dir') disp('Downloading PTDB-TUG (3.9 G) ...') unzip(url,datasetFolder) end
Создание audioDatastore объект, указывающий на набор данных. Набор данных первоначально предназначался для использования в обучении и оценке трекинга и включает в себя показания ларингографа и базовые решения тона. Используйте только оригинальные аудиозаписи.
ads = audioDatastore([fullfile(datasetFolder,"SPEECH DATA","FEMALE","MIC"),fullfile(datasetFolder,"SPEECH DATA","MALE","MIC")], ... 'IncludeSubfolders',true, ... 'FileExtensions','.wav');
Имена файлов содержат идентификаторы динамиков. Декодируйте имена файлов для установки меток в audioDatastore объект.
ads.Labels = extractBetween(ads.Files,'mic_','_'); countEachLabel(ads)
ans=20×2 table
Label Count
_____ _____
F01 236
F02 236
F03 236
F04 236
F05 236
F06 236
F07 236
F08 234
F09 236
F10 236
M01 236
M02 236
M03 236
M04 236
M05 236
M06 236
⋮
Чтение аудиофайла из набора данных, прослушивание и печать.
[audioIn,audioInfo] = read(ads); fs = audioInfo.SampleRate; t = (0:size(audioIn,1)-1)/fs; sound(audioIn,fs) plot(t,audioIn) xlabel('Time (s)') ylabel('Amplitude') axis([0 t(end) -1 1]) title('Sample Utterance from Data Set')

Разделите audioDatastore объект в четыре: один для обучения, один для регистрации, один для оценки компромисса обнаружение-ошибка и один для тестирования. В комплект обучения входят 16 спикеров. Набор регистрации, анализ ошибок обнаружения и тестовые наборы содержат остальные четыре динамика.
speakersToTest = categorical(["M01","M05","F01","F05"]); adsTrain = subset(ads,~ismember(ads.Labels,speakersToTest)); ads = subset(ads,ismember(ads.Labels,speakersToTest)); [adsEnroll,adsTest,adsDET] = splitEachLabel(ads,3,1);
Отображение распределения меток audioDatastore объекты.
countEachLabel(adsTrain)
ans=16×2 table
Label Count
_____ _____
F02 236
F03 236
F04 236
F06 236
F07 236
F08 234
F09 236
F10 236
M02 236
M03 236
M04 236
M06 236
M07 236
M08 236
M09 236
M10 236
countEachLabel(adsEnroll)
ans=4×2 table
Label Count
_____ _____
F01 3
F05 3
M01 3
M05 3
countEachLabel(adsTest)
ans=4×2 table
Label Count
_____ _____
F01 1
F05 1
M01 1
M05 1
countEachLabel(adsDET)
ans=4×2 table
Label Count
_____ _____
F01 232
F05 232
M01 232
M05 232
Создайте i-векторную систему. По умолчанию i-векторная система предполагает, что вход в систему представляет собой монозвуковые сигналы.
speakerVerification = ivectorSystem('SampleRate',fs)speakerVerification =
ivectorSystem with properties:
InputType: 'audio'
SampleRate: 48000
DetectSpeech: 1
EnrolledLabels: [0×2 table]
Для обучения экстрактора i-векторной системы вызовите trainExtractor. Укажите 128 компонентов универсальной фоновой модели (UBM) и 5 итераций максимизации ожидания. Укажите общий ранг пространства изменчивости (TVS) как 64, а число итераций как 3.
trainExtractor(speakerVerification,adsTrain, ... 'UBMNumComponents',128,'UBMNumIterations',5, ... 'TVSRank',64,'TVSNumIterations',3)
Calculating standardization factors ....done. Training universal background model ........done. Training total variability space ...done. i-vector extractor training complete.
Для обучения классификатора i-векторной системы используйте trainClassifier. Чтобы уменьшить размерность i-векторов, укажите число собственных векторов в проекционной матрице как 16. Укажите число измерений в модели вероятностного линейного дискриминантного анализа (PLDA) как 16, а число итераций как 3.
trainClassifier(speakerVerification,adsTrain,adsTrain.Labels, ... 'NumEigenvectors',16, ... 'PLDANumDimensions',16,'PLDANumIterations',3)
Extracting i-vectors ...done. Training projection matrix .....done. Training PLDA model ......done. i-vector classifier training complete.
Для проверки параметров, использовавшихся ранее для обучения i-векторной системы, используйте info.
info(speakerVerification)
i-vector system input Input feature vector length: 60 Input data type: double trainExtractor Train signals: 3774 UBMNumComponents: 128 UBMNumIterations: 5 TVSRank: 64 TVSNumIterations: 3 trainClassifier Train signals: 3774 Train labels: F02 (236), F03 (236) ... and 14 more NumEigenvectors: 16 PLDANumDimensions: 16 PLDANumIterations: 3
Разделить набор регистрации.
[adsEnrollPart1,adsEnrollPart2] = splitEachLabel(adsEnroll,1,2);
Для регистрации динамиков в системе i-vector вызовите enroll.
enroll(speakerVerification,adsEnrollPart1,adsEnrollPart1.Labels)
Extracting i-vectors ...done. Enrolling i-vectors .......done. Enrollment complete.
При регистрации динамики доступны только для чтения EnrolledLabels обновляется зарегистрированными метками и соответствующими i-векторами шаблона. Таблица также отслеживает количество сигналов, используемых для создания i-вектора шаблона. Как правило, использование большего количества сигналов приводит к лучшему шаблону.
speakerVerification.EnrolledLabels
ans=4×2 table
ivector NumSamples
_____________ __________
F01 {16×1 double} 1
F05 {16×1 double} 1
M01 {16×1 double} 1
M05 {16×1 double} 1
Зарегистрируйте вторую часть набора регистрации, а затем снова просмотрите таблицу зарегистрированных меток. Обновляются шаблоны i-векторов и количество выборок.
enroll(speakerVerification,adsEnrollPart2,adsEnrollPart2.Labels)
Extracting i-vectors ...done. Enrolling i-vectors .......done. Enrollment complete.
speakerVerification.EnrolledLabels
ans=4×2 table
ivector NumSamples
_____________ __________
F01 {16×1 double} 3
F05 {16×1 double} 3
M01 {16×1 double} 3
M05 {16×1 double} 3
Чтобы оценить i-векторную систему и определить порог принятия решения для проверки говорящего, вызовите detectionErrorTradeoff.
[results, eerThreshold] = detectionErrorTradeoff(speakerVerification,adsDET,adsDET.Labels);
Extracting i-vectors ...done. Scoring i-vector pairs ...done. Detection error tradeoff evaluation complete.
Первый выход из detectionErrorTradeoff - структура с двумя полями: CSS и PLDA. Каждое поле содержит таблицу. Каждая строка таблицы содержит возможный порог принятия решения для задач верификации громкоговорителя и соответствующую частоту ложных аварийных сигналов (FAR) и частоту ложных отклонений (FRR). FAR и FRR определяются с использованием зарегистрированных меток говорящих и ввода данных в detectionErrorTradeoff функция.
results
results = struct with fields:
PLDA: [1000×3 table]
CSS: [1000×3 table]
results.CSS
ans=1000×3 table
Threshold FAR FRR
_________ _______ ___
0.25324 1 0
0.25398 0.99964 0
0.25472 0.99964 0
0.25546 0.99928 0
0.2562 0.99928 0
0.25694 0.99928 0
0.25768 0.99928 0
0.25842 0.99928 0
0.25916 0.99928 0
0.25991 0.99928 0
0.26065 0.99928 0
0.26139 0.99928 0
0.26213 0.99928 0
0.26287 0.99928 0
0.26361 0.99928 0
0.26435 0.99928 0
⋮
results.PLDA
ans=1000×3 table
Threshold FAR FRR
_________ ___ _______
-11.389 0 0.99892
-11.124 0 0.99892
-10.858 0 0.99892
-10.593 0 0.99892
-10.327 0 0.99892
-10.061 0 0.99784
-9.7958 0 0.99784
-9.5303 0 0.99784
-9.2647 0 0.99784
-8.9991 0 0.99784
-8.7335 0 0.99784
-8.4679 0 0.99784
-8.2023 0 0.99784
-7.9367 0 0.99569
-7.6712 0 0.99353
-7.4056 0 0.99353
⋮
Второй выход из detectionErrorTradeoff - структура с двумя полями: CSS и PLDA. Соответствующее значение является порогом принятия решения, который приводит к равной частоте ошибок (когда FAR и FRR равны).
eerThreshold
eerThreshold = struct with fields:
PLDA: 30.3075
CSS: 0.8682
При первом звонке detectionErrorTradeoff, необходимо предоставить данные и соответствующие метки для оценки. Впоследствии можно получить ту же самую информацию или другой анализ, используя те же самые базовые данные, путем вызова detectionErrorTradeoff без данных и меток.
Звонить detectionErrorTradeoff второй раз без аргументов данных или выходных аргументов для визуализации компромисса «обнаружение-ошибка».
detectionErrorTradeoff(speakerVerification)

Звонить detectionErrorTradeoff снова. На этот раз визуализируйте только компромисс между обнаружением и ошибкой для бомбардира PLDA.
detectionErrorTradeoff(speakerVerification,'Scorer',"plda")

В зависимости от приложения можно использовать пороговое значение, которое взвешивает стоимость ошибки ложного аварийного сигнала выше или ниже, чем стоимость ошибки ложного отклонения. Вы также можете использовать данные, которые не отражают предшествующую вероятность присутствия говорящего. Вы можете использовать minDCF параметр для указания пользовательских затрат и предварительной вероятности. Звонить detectionErrorTradeoff опять же, на этот раз укажите стоимость ложного отклонения как 1, стоимость ложного принятия как 2 и предыдущую вероятность присутствия говорящего как 0,1.
costFR = 1; costFA = 2; priorProb = 0.1; detectionErrorTradeoff(speakerVerification,'Scorer',"plda",'minDCF',[costFR,costFA,priorProb])

Звонить detectionErrorTradeoff снова. На этот раз, получите minDCF порог для бомбардира PLDA и параметры функции стоимости обнаружения.
[~,minDCFThreshold] = detectionErrorTradeoff(speakerVerification,'Scorer',"plda",'minDCF',[costFR,costFA,priorProb])
minDCFThreshold = 22.3400
Тестовая система верификации динамиков
Считывание сигнала из тестового набора.
adsTest = shuffle(adsTest); [audioIn,audioInfo] = read(adsTest); knownSpeakerID = audioInfo.Label
knownSpeakerID = 1×1 cell array
{'F01'}
Для выполнения проверки громкоговорителя вызовите verify с помощью звукового сигнала и указать идентификатор громкоговорителя, бомбардир и порог для бомбардира. verify функция возвращает логическое значение, указывающее, принят или отклонен идентификатор говорящего, и оценку, указывающую сходство входного звука и i-вектора шаблона, соответствующего зарегистрированной метке.
[tf,score] = verify(speakerVerification,audioIn,knownSpeakerID,"plda",eerThreshold.PLDA); if tf fprintf('Success!\nSpeaker accepted.\nSimilarity score = %0.2f\n\n',score) else fprinf('Failure!\nSpeaker rejected.\nSimilarity score = %0.2f\n\n',score) end
Success! Speaker accepted. Similarity score = 0.97
Снова вызовите проверку громкоговорителя. На этот раз укажите неверный идентификатор громкоговорителя.
possibleSpeakers = speakerVerification.EnrolledLabels.Properties.RowNames; imposterIdx = find(~ismember(possibleSpeakers,knownSpeakerID)); imposter = possibleSpeakers(imposterIdx(randperm(numel(imposterIdx),1)))
imposter = 1×1 cell array
{'M05'}
[tf,score] = verify(speakerVerification,audioIn,imposter,"plda",eerThreshold.PLDA); if tf fprintf('Failure!\nSpeaker accepted.\nSimilarity score = %0.2f\n\n',score) else fprintf('Success!\nSpeaker rejected.\nSimilarity score = %0.2f\n\n',score) end
Success! Speaker rejected. Similarity score = 0.48
Ссылки
[1] Лаборатория обработки сигналов и речевой связи. https://www.spsc.tugraz.at/databases-and-tools/ptdb-tug-pitch-tracking-database-from-graz-university-of-technology.html. Доступно 12 декабря 2019 года.
Используйте базу данных переписи (также известную как база данных AN4) из группы распознавания надежной речи CMU [1]. Набор данных содержит записи мужских и женских предметов, говорящих словами и цифрами. Вспомогательная функция в этом примере загружает набор данных, преобразует необработанные файлы в FLAC и возвращает два audioDatastore объекты, содержащие учебный набор и тестовый набор. По умолчанию набор данных сокращается так, что пример выполняется быстро. Полный набор данных можно использовать путем установки ReduceDataset в значение false.
[adsTrain,adsTest] = HelperAN4Download('ReduceDataset',true);Разбейте набор тестовых данных на наборы регистрации и тестирования. Используйте два слова для регистрации, а оставшиеся - для тестового набора. Как правило, чем больше высказываний используется для регистрации, тем выше производительность системы. Однако большинство практических применений ограничено небольшим набором заявлений о регистрации.
[adsEnroll,adsTest] = splitEachLabel(adsTest,2);
Проверьте распределение динамиков в комплектах обучения, тестирования и регистрации. Динамики в наборе обучения не перекрываются с динамиками в наборах тестирования и регистрации.
summary(adsTrain.Labels)
fejs 13
fmjd 13
fsrb 13
ftmj 13
fwxs 12
mcen 13
mrcb 13
msjm 13
msjr 13
msmn 9
summary(adsEnroll.Labels)
fvap 2
marh 2
summary(adsTest.Labels)
fvap 11
marh 11
Создайте i-векторную систему, которая принимает входные данные элемента.
fs = 16e3; iv = ivectorSystem('SampleRate',fs,'InputType','features');
Создание audioFeatureExtractor Изобретение относится к медицине и может быть использовано для выделения кепстральных коэффициентов гамматона (GTCC), дельты GTCC, дельты-дельты GTCC и шага из периодических окон Ганна 50 мс с перекрытием 45 мс.
afe = audioFeatureExtractor('gtcc',true,'gtccDelta',true,'gtccDeltaDelta',true,'pitch',true,'SampleRate',fs); afe.Window = hann(round(0.05*fs),'periodic'); afe.OverlapLength = round(0.045*fs); afe
afe =
audioFeatureExtractor with properties:
Properties
Window: [800×1 double]
OverlapLength: 720
SampleRate: 16000
FFTLength: []
SpectralDescriptorInput: 'linearSpectrum'
Enabled Features
gtcc, gtccDelta, gtccDeltaDelta, pitch
Disabled Features
linearSpectrum, melSpectrum, barkSpectrum, erbSpectrum, mfcc, mfccDelta
mfccDeltaDelta, spectralCentroid, spectralCrest, spectralDecrease, spectralEntropy, spectralFlatness
spectralFlux, spectralKurtosis, spectralRolloffPoint, spectralSkewness, spectralSlope, spectralSpread
harmonicRatio
To extract a feature, set the corresponding property to true.
For example, obj.mfcc = true, adds mfcc to the list of enabled features.
Создание преобразованных хранилищ данных путем добавления извлечения элементов в read функция adsTrain и adsEnroll.
trainLabels = adsTrain.Labels; adsTrain = transform(adsTrain,@(x)extract(afe,x)); enrollLabels = adsEnroll.Labels; adsEnroll = transform(adsEnroll,@(x)extract(afe,x));
Обучите как экстрактор, так и классификатор с помощью обучающего комплекта.
trainExtractor(iv,adsTrain, ... 'UBMNumComponents',64, ... 'UBMNumIterations',5, ... 'TVSRank',32, ... 'TVSNumIterations',3);
Calculating standardization factors ....done. Training universal background model ........done. Training total variability space ...done. i-vector extractor training complete.
trainClassifier(iv,adsTrain,trainLabels, ... 'NumEigenvectors',16, ... ... "PLDANumDimensions",16, ... "PLDANumIterations",5);
Extracting i-vectors ...done. Training projection matrix .....done. Training PLDA model ........done. i-vector classifier training complete.
Зарегистрируйте динамики из набора регистрации.
enroll(iv,adsEnroll,enrollLabels)
Extracting i-vectors ...done. Enrolling i-vectors .....done. Enrollment complete.
Оцените точность прогнозирования на уровне файла в тестовом наборе.
numCorrect = 0; reset(adsTest) for index = 1:numel(adsTest.Files) features = extract(afe,read(adsTest)); results = identify(iv,features,'plda'); trueLabel = adsTest.Labels(index); predictedLabel = results.Label(1); isPredictionCorrect = trueLabel==predictedLabel; numCorrect = numCorrect + isPredictionCorrect; end fprintf('File Accuracy: %0.2f percent\n', 100*numCorrect/numel(adsTest.Files))
File Accuracy: 100.00 percent
Ссылки
[1] «CMU Sphinx Group - аудио базы данных». http://www.speech.cs.cmu.edu/databases/an4/. Доступ 19 декабря 2019 года.
Загрузите и распакуйте набор данных классификации звука среды. Этот набор данных состоит из записей, помеченных как один из 10 различных классов звука (ESC-10).
url = 'http://ssd.mathworks.com/supportfiles/audio/ESC-10.zip'; downloadFolder = tempdir; datasetFolder = fullfile(downloadFolder,'ESC-10'); if ~exist(datasetFolder,'dir') disp('Downloading ESC-10 ...') unzip(url,downloadFolder) end
Создание audioDatastore объект для управления данными и их разделения на наборы обучения и проверки. Звонить countEachLabel для отображения распределения классов звука и количества уникальных меток.
ads = audioDatastore(datasetFolder,'IncludeSubfolders',true,'LabelSource','foldernames'); countEachLabel(ads)
ans=10×2 table
Label Count
______________ _____
chainsaw 40
clock_tick 40
crackling_fire 40
crying_baby 40
dog 40
helicopter 40
rain 40
rooster 38
sea_waves 40
sneezing 40
Прослушайте один из файлов.
[audioIn,audioInfo] = read(ads); fs = audioInfo.SampleRate; sound(audioIn,fs) audioInfo.Label
ans = categorical
chainsaw
Разбейте хранилище данных на обучающие и тестовые наборы.
[adsTrain,adsTest] = splitEachLabel(ads,0.8);
Создание audioFeatureExtractor для извлечения всех возможных функций из звука.
afe = audioFeatureExtractor('SampleRate',fs, ... 'Window',hamming(round(0.03*fs),'periodic'), ... 'OverlapLength',round(0.02*fs)); params = info(afe,'all'); params = structfun(@(x)true,params,'UniformOutput',false); set(afe,params); afe
afe =
audioFeatureExtractor with properties:
Properties
Window: [1323×1 double]
OverlapLength: 882
SampleRate: 44100
FFTLength: []
SpectralDescriptorInput: 'linearSpectrum'
Enabled Features
linearSpectrum, melSpectrum, barkSpectrum, erbSpectrum, mfcc, mfccDelta
mfccDeltaDelta, gtcc, gtccDelta, gtccDeltaDelta, spectralCentroid, spectralCrest
spectralDecrease, spectralEntropy, spectralFlatness, spectralFlux, spectralKurtosis, spectralRolloffPoint
spectralSkewness, spectralSlope, spectralSpread, pitch, harmonicRatio
Disabled Features
none
To extract a feature, set the corresponding property to true.
For example, obj.mfcc = true, adds mfcc to the list of enabled features.
Создайте два каталога в текущей папке: train и test. Извлеките элементы из наборов данных обучения и тестирования и запишите их в соответствующие каталоги в виде файлов MAT. Предварительное извлечение функций позволяет сэкономить время при необходимости оценки различных комбинаций функций или конфигураций обучения.
mkdir('train') mkdir('test') outputType = ".mat"; writeall(adsTrain,'train','WriteFcn',@(x,y,z)writeFeatures(x,y,z,afe)) writeall(adsTest,'test','WriteFcn',@(x,y,z)writeFeatures(x,y,z,afe))
Создайте хранилища данных сигналов, чтобы указать на звуковые функции.
sdsTrain = signalDatastore('train','IncludeSubfolders',true); sdsTest = signalDatastore('train','IncludeSubfolders',true);
Создание массивов меток в том же порядке, что и signalDatastore файлы.
labelsTrain = categorical(extractBetween(sdsTrain.Files,'ESC-10\','\')); labelsTest = categorical(extractBetween(sdsTest.Files,'ESC-10\','\'));
Создайте хранилище данных преобразования из хранилищ данных сигнала, чтобы изолировать и использовать только нужные функции. Можно использовать выходные данные из info на audioFeatureExtractor для сопоставления выбранных элементов с индексом в матрице элементов. Можно поэкспериментировать с примером, выбрав различные элементы.
featureIndices = info(afe)
featureIndices = struct with fields:
linearSpectrum: [1×662 double]
melSpectrum: [663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694]
barkSpectrum: [695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726]
erbSpectrum: [727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769]
mfcc: [770 771 772 773 774 775 776 777 778 779 780 781 782]
mfccDelta: [783 784 785 786 787 788 789 790 791 792 793 794 795]
mfccDeltaDelta: [796 797 798 799 800 801 802 803 804 805 806 807 808]
gtcc: [809 810 811 812 813 814 815 816 817 818 819 820 821]
gtccDelta: [822 823 824 825 826 827 828 829 830 831 832 833 834]
gtccDeltaDelta: [835 836 837 838 839 840 841 842 843 844 845 846 847]
spectralCentroid: 848
spectralCrest: 849
spectralDecrease: 850
spectralEntropy: 851
spectralFlatness: 852
spectralFlux: 853
spectralKurtosis: 854
spectralRolloffPoint: 855
spectralSkewness: 856
spectralSlope: 857
spectralSpread: 858
pitch: 859
harmonicRatio: 860
idxToUse = [featureIndices.harmonicRatio, ... featureIndices.spectralRolloffPoint, ... featureIndices.spectralFlux, ... featureIndices.spectralSlope]; tdsTrain = transform(sdsTrain,@(x)x(:,idxToUse)); tdsTest = transform(sdsTest,@(x)x(:,idxToUse));
Создайте i-векторную систему, которая принимает входные данные элемента.
soundClassifier = ivectorSystem("InputType",'features');
Обучите экстрактор и классификатор с помощью обучающего комплекта.
trainExtractor(soundClassifier,tdsTrain,'UBMNumComponents',200,'TVSRank',150);
Calculating standardization factors ....done. Training universal background model .....done. Training total variability space ...done. i-vector extractor training complete.
trainClassifier(soundClassifier,tdsTrain,labelsTrain,'NumEigenvectors',50,'PLDANumDimensions',50)
Extracting i-vectors ...done. Training projection matrix .....done. Training PLDA model ........done. i-vector classifier training complete.
Зарегистрируйте метки из обучающего набора, чтобы создать шаблоны i-векторов для каждого из звуков окружающей среды.
enroll(soundClassifier,tdsTrain,labelsTrain)
Extracting i-vectors ...done. Enrolling i-vectors .............done. Enrollment complete.
Используйте identify функция на тестовом аппарате для возврата выводимой метки системы.
reset(tdsTest) inferredLabels = labelsTest; inferredLabels(:) = inferredLabels(1); scorer ="css"; for ii = 1:numel(labelsTest) features = read(tdsTest); tableOut = identify(soundClassifier,features,scorer,'NumCandidates',1); inferredLabels(ii) = tableOut.Label(1); end
Создайте матрицу путаницы для визуализации производительности тестового набора.
uniqueLabels = unique(labelsTest); cm = zeros(numel(uniqueLabels)); for ii = 1:numel(uniqueLabels) for jj = 1:numel(uniqueLabels) cm(ii,jj) = sum((labelsTest==uniqueLabels(ii)) & (inferredLabels==uniqueLabels(jj))); end end labelStrings = replace(string(uniqueLabels),"_"," "); heatmap(labelStrings,labelStrings,cm) colorbar off ylabel('True Labels') xlabel('Predicted Labels') accuracy = mean(inferredLabels==labelsTest); title(sprintf("Accuracy = %0.2f %%",accuracy*100))

Отпустите i-векторную систему.
release(soundClassifier)
Вспомогательные функции
function writeFeatures(audioIn,info,~,afe) % Extract features features = extract(afe,audioIn); % Replace the file extension of the suggested output name with MAT. filename = strrep(info.SuggestedOutputName,".wav",'.mat'); % Save the MFCC coefficients to the MAT file. save(filename,"features") end
Загрузите и распакуйте набор данных воздушного компрессора [1]. Этот набор данных состоит из записей от воздушных компрессоров в исправном состоянии или одного из семи неисправных состояний.
url = 'https://www.mathworks.com/supportfiles/audio/AirCompressorDataset/AirCompressorDataset.zip'; downloadFolder = fullfile(tempdir,'aircompressordataset'); datasetLocation = tempdir; if ~exist(fullfile(tempdir,'AirCompressorDataSet'),'dir') loc = websave(downloadFolder,url); unzip(loc,fullfile(tempdir,'AirCompressorDataSet')) end
Создание audioDatastore объект для управления данными и их разделения на наборы обучения и проверки.
ads = audioDatastore(downloadFolder,'IncludeSubfolders',true,'LabelSource','foldernames'); [adsTrain,adsTest] = splitEachLabel(ads,0.8,0.2);
Прочитайте аудиофайл из хранилища данных и сохраните частоту дискретизации. Прослушайте звуковой сигнал и постройте график сигнала во временной области.
[x,fileInfo] = read(adsTrain); fs = fileInfo.SampleRate; sound(x,fs) t = (0:size(x,1)-1)/fs; plot(t,x) xlabel('Time (s)') title('State = ' + string(fileInfo.Label)) axis tight

Создание i-векторной системы с помощью DetectSpeech установить в значение false.
faultRecognizer = ivectorSystem("SampleRate",fs,"DetectSpeech",false)
faultRecognizer =
ivectorSystem with properties:
InputType: 'audio'
SampleRate: 16000
DetectSpeech: 0
EnrolledLabels: [0×2 table]
Обучайте i-векторный экстрактор и i-векторный классификатор с помощью обучающего хранилища данных.
trainExtractor(faultRecognizer,adsTrain)
Calculating standardization factors ....done. Training universal background model .....done. Training total variability space ...done. i-vector extractor training complete.
trainClassifier(faultRecognizer,adsTrain,adsTrain.Labels)
Extracting i-vectors ...done. Training projection matrix .....done. Training PLDA model ........done. i-vector classifier training complete.
Зарегистрируйте все этикетки из обучающего набора. Использовать свойство только для чтения EnrolledLabels для просмотра зарегистрированных меток и соответствующих шаблонов i-векторов.
enroll(faultRecognizer,adsTrain,adsTrain.Labels)
Extracting i-vectors ...done. Enrolling i-vectors ...........done. Enrollment complete.
faultRecognizer.EnrolledLabels
ans=8×2 table
ivector NumSamples
_____________ __________
Bearing {16×1 double} 180
Flywheel {16×1 double} 180
Healthy {16×1 double} 180
LIV {16×1 double} 180
LOV {16×1 double} 180
NRV {16×1 double} 180
Piston {16×1 double} 180
Riderbelt {16×1 double} 180
Используйте identify функция с PLDA-бомбардиром для прогнозирования состояния машин в тестовом наборе. identify функция возвращает таблицу возможных меток, отсортированных в порядке убывания достоверности. Доверительная метрика нормализуется по количеству возвращенных меток.
[audioIn,audioInfo] = read(adsTest); trueLabel = audioInfo.Label
trueLabel = categorical
Bearing
predictedLabels = identify(faultRecognizer,audioIn,"plda")predictedLabels=8×2 table
Label Score
_________ ________
Bearing 0.19328
Flywheel 0.16975
Piston 0.1468
LIV 0.13167
Riderbelt 0.1232
LOV 0.10861
NRV 0.10736
Healthy 0.019328
По умолчанию identify функция возвращает все возможные метки-кандидаты и их соответствующие оценки. Использовать NumCandidates для уменьшения числа возвращаемых кандидатов.
results = identify(faultRecognizer,audioIn,"plda",'NumCandidates',3)
results=3×2 table
Label Score
________ _______
Bearing 0.37912
Flywheel 0.33295
Piston 0.28794
Ссылки
[1] Верма, Nishal K., et al. «Интеллектуальный мониторинг состояния с использованием акустических сигналов для воздушных компрессоров». Сделки IEEE по надежности, том 65, № 1, март 2016 г., стр. 291-309. DOI.org (Crossref), doi:10.1109/TR.2015.2459684.
Загрузите Берлинскую базу данных эмоциональной речи [1]. База данных содержит 535 высказываний, произнесенных 10 актерами, предназначенных для передачи одной из следующих эмоций: гнев, скука, отвращение, беспокойство/страх, счастье, печаль или нейтралитет. Эмоции не зависят от текста.
url = "http://emodb.bilderbar.info/download/download.zip"; downloadFolder = tempdir; datasetFolder = fullfile(downloadFolder,"Emo-DB"); if ~exist(datasetFolder,'dir') disp('Downloading Emo-DB (40.5 MB) ...') unzip(url,datasetFolder) end
Создание audioDatastore указывает на аудиофайлы.
ads = audioDatastore(fullfile(datasetFolder,"wav"));Имена файлов представляют собой коды, обозначающие идентификатор говорящего, текст, слова, эмоции и версию. Веб-сайт содержит ключ для интерпретации кода и дополнительную информацию о ораторах, такую как пол и возраст. Создание таблицы с переменными Speaker и Emotion. Декодируйте имена файлов в таблицу.
filepaths = ads.Files; emotionCodes = cellfun(@(x)x(end-5),filepaths,'UniformOutput',false); emotions = replace(emotionCodes,{'W','L','E','A','F','T','N'}, ... {'Anger','Boredom','Disgust','Anxiety','Happiness','Sadness','Neutral'}); speakerCodes = cellfun(@(x)x(end-10:end-9),filepaths,'UniformOutput',false); labelTable = table(categorical(speakerCodes),categorical(emotions),'VariableNames',{'Speaker','Emotion'}); summary(labelTable)
Variables:
Speaker: 535×1 categorical
Values:
03 49
08 58
09 43
10 38
11 55
12 35
13 61
14 69
15 56
16 71
Emotion: 535×1 categorical
Values:
Anger 127
Anxiety 69
Boredom 81
Disgust 46
Happiness 71
Neutral 79
Sadness 62
labelTable находится в том же порядке, что и файлы в audioDatastore. Установите Labels имущества audioDatastore кому labelTable.
ads.Labels = labelTable;
Считывайте сигнал из хранилища данных и прослушивайте его. Отображение идентификатора громкоговорителя и эмоций звукового сигнала.
[audioIn,audioInfo] = read(ads); fs = audioInfo.SampleRate; sound(audioIn,fs) audioInfo.Label
ans=1×2 table
Speaker Emotion
_______ _________
03 Happiness
Разбейте хранилище данных на обучающий набор и тестовый набор. Назначьте два динамика для тестового аппарата, а оставшиеся - для обучающего аппарата.
testSpeakerIdx = ads.Labels.Speaker=="12" | ads.Labels.Speaker=="13"; adsTrain = subset(ads,~testSpeakerIdx); adsTest = subset(ads,testSpeakerIdx);
Считывайте все обучающие и тестовые аудиоданные в массивы ячеек. Если ваши данные могут поместиться в память, обучение обычно происходит быстрее для ввода массивов ячеек в систему i-vector, а не в хранилища данных.
trainSet = readall(adsTrain); trainLabels = adsTrain.Labels.Emotion; testSet = readall(adsTest); testLabels = adsTest.Labels.Emotion;
Создайте i-векторную систему, которая не применяет обнаружение речи. Когда DetectSpeech имеет значение true (по умолчанию), для обучения i-векторной системы используются только области обнаруженной речи. Когда DetectSpeech имеет значение falseвесь входной звук используется для обучения i-векторной системы. Полезность применения обнаружения речи зависит от ввода данных в систему.
emotionRecognizer = ivectorSystem('SampleRate',fs,'DetectSpeech',false)
emotionRecognizer =
ivectorSystem with properties:
InputType: 'audio'
SampleRate: 16000
DetectSpeech: 0
EnrolledLabels: [0×2 table]
Звонить trainExtractor с использованием обучающего комплекта.
trainExtractor(emotionRecognizer,trainSet, ... 'UBMNumComponents',256, ... 'UBMNumIterations',
5, ... ... 'TVSRank',
128, ... 'TVSNumIterations',
2);
Calculating standardization factors .....done. Training universal background model ........done. Training total variability space .....done. i-vector extractor training complete.
Звонить trainClassifier с использованием обучающего комплекта.
trainClassifier(emotionRecognizer,trainSet,trainLabels, ... 'NumEigenvectors',64, ... ... 'PLDANumDimensions',
64, ... 'PLDANumIterations',
10);
Extracting i-vectors ...done. Training projection matrix .....done. Training PLDA model .............done. i-vector classifier training complete.
Зарегистрируйте обучающие метки в системе i-vector.
enroll(emotionRecognizer,trainSet,trainLabels)
Extracting i-vectors ...done. Enrolling i-vectors ..........done. Enrollment complete.
Вы можете использовать detectionErrorTradeoff как быстрая проверка работоспособности многозначной замкнутой системы классификации. Однако detectionErrorTradeoff предоставляет информацию, более подходящую для проблем с двоичной классификацией открытого набора, например, задачи верификации говорящих.
detectionErrorTradeoff(emotionRecognizer,testSet,testLabels)
Extracting i-vectors ...done. Scoring i-vector pairs ...done. Detection error tradeoff evaluation complete.

Для получения более подробного представления о производительности системы i-vector в приложении multilabel closed set можно использовать identify и создать матрицу путаницы. Матрица путаницы позволяет определить, какие эмоции неправильно идентифицированы, а какие неправильно. Использовать вспомогательную функцию plotConfusion для отображения результатов.
trueLabels = testLabels; predictedLabels = trueLabels; scorer ="css"; for ii = 1:numel(testSet) tableOut = identify(emotionRecognizer,testSet{ii},scorer); predictedLabels(ii) = tableOut.Label(1); end plotConfusion(trueLabels,predictedLabels)

Звонить info чтобы проверить, как emotionRecognizer был обучен и оценен.
info(emotionRecognizer)
i-vector system input Input feature vector length: 60 Input data type: double trainExtractor Train signals: 439 UBMNumComponents: 256 UBMNumIterations: 5 TVSRank: 128 TVSNumIterations: 2 trainClassifier Train signals: 439 Train labels: Anger (103), Anxiety (56) ... and 5 more NumEigenvectors: 64 PLDANumDimensions: 64 PLDANumIterations: 10 detectionErrorTradeoff Evaluation signals: 96 Evaluation labels: Anger (24), Anxiety (13) ... and 5 more
Затем измените систему i-векторов, чтобы распознать эмоции как положительные, нейтральные или отрицательные. Обновите метки, чтобы включить только категории отрицательные, положительные и категориальные.
trainLabelsSentiment = trainLabels; trainLabelsSentiment(ismember(trainLabels,categorical(["Anger","Anxiety","Boredom","Sadness","Disgust"]))) = categorical("Negative"); trainLabelsSentiment(ismember(trainLabels,categorical("Happiness"))) = categorical("Postive"); trainLabelsSentiment = removecats(trainLabelsSentiment); testLabelsSentiment = testLabels; testLabelsSentiment(ismember(testLabels,categorical(["Anger","Anxiety","Boredom","Sadness","Disgust"]))) = categorical("Negative"); testLabelsSentiment(ismember(testLabels,categorical("Happiness"))) = categorical("Postive"); testLabelsSentiment = removecats(testLabelsSentiment);
Переподготовьте классификатор системы i-vector с помощью обновленных меток. Переучивать экстрактор не нужно.
trainClassifier(emotionRecognizer,trainSet,trainLabelsSentiment, ... 'NumEigenvectors',64, ... ... 'PLDANumDimensions',
64, ... 'PLDANumIterations',
10);
Extracting i-vectors ...done. Training projection matrix .....done. Training PLDA model .............done. i-vector classifier training complete.
Зарегистрируйте обучающие этикетки в системе, а затем постройте таблицу путаницы для тестового набора.
enroll(emotionRecognizer,trainSet,trainLabelsSentiment)
Extracting i-vectors ...done. Enrolling i-vectors ......done. Enrollment complete.
trueLabels = testLabelsSentiment; predictedLabels = trueLabels; scorer ="css"; for ii = 1:numel(testSet) tableOut = identify(emotionRecognizer,testSet{ii},scorer); predictedLabels(ii) = tableOut.Label(1); end plotConfusion(trueLabels,predictedLabels)

Система i-векторов не требует, чтобы метки, используемые для обучения классификатора, были равны зарегистрированным меткам.
Отмените регистрацию меток настроения в системе, а затем зарегистрируйте исходные категории эмоций в системе. Проанализируйте эффективность классификации системы.
unenroll(emotionRecognizer) enroll(emotionRecognizer,trainSet,trainLabels)
Extracting i-vectors ...done. Enrolling i-vectors ..........done. Enrollment complete.
trueLabels = testLabels; predictedLabels = trueLabels; scorer ="css"; for ii = 1:numel(testSet) tableOut = identify(emotionRecognizer,testSet{ii},scorer); predictedLabels(ii) = tableOut.Label(1); end plotConfusion(trueLabels,predictedLabels)

Вспомогательные функции
function plotConfusion(trueLabels,predictedLabels) uniqueLabels = unique(trueLabels); cm = zeros(numel(uniqueLabels)); for ii = 1:numel(uniqueLabels) for jj = 1:numel(uniqueLabels) cm(ii,jj) = sum((trueLabels==uniqueLabels(ii)) & (predictedLabels==uniqueLabels(jj))); end end heatmap(uniqueLabels,uniqueLabels,cm) colorbar off ylabel('True Labels') xlabel('Predicted Labels') accuracy = mean(trueLabels==predictedLabels); title(sprintf("Accuracy = %0.2f %%",accuracy*100)) end
Ссылки
[1] Буркхардт, Ф., А. Паешке, М. Рольфес, В. Ф. Сендлмайер и Б. Вайс, «База данных немецкой эмоциональной речи». В Proceedings Interspeech 2005. Лиссабон, Португалия: Международная ассоциация речевой коммуникации, 2005 год.
i-векторная система состоит из обучаемого переднего конца, который учится извлекать i-векторы на основе немаркированных данных, и обучаемого заднего конца, который учится классифицировать i-векторы на основе маркированных данных. В этом примере к задаче распознавания слов применяется i-векторная система. Во-первых, оценить точность i-векторной системы с помощью классификаторов, входящих в традиционную i-векторную систему: вероятностного линейного дискриминантного анализа (PLDA) и косинусной оценки подобия (CSS). Затем оцените точность системы, если вы замените классификатор на двунаправленную сеть долговременной памяти (BiLSTM) или классификатор К-ближайших соседей.
Создание наборов обучения и проверки
Загрузите набор данных свободной речевой цифры (FSDD) [1]. FSDD состоит из коротких аудиофайлов с произносимыми цифрами (0-9).
url = "https://ssd.mathworks.com/supportfiles/audio/FSDD.zip"; downloadFolder = tempdir; datasetFolder = fullfile(downloadFolder,'FSDD'); if ~exist(datasetFolder,'dir') fprintf('Downloading Free Spoken Digit Dataset ...\n') unzip(url,datasetFolder) end
Создание audioDatastore для указания на записи. Получение частоты дискретизации набора данных.
ads = audioDatastore(datasetFolder,'IncludeSubfolders',true);
[~,adsInfo] = read(ads);
fs = adsInfo.SampleRate;Первым элементом имен файлов является цифра, произносимая в файле. Получить первый элемент имен файлов, преобразовать их в категориальные, а затем установить Labels имущества audioDatastore.
[~,filenames] = cellfun(@(x)fileparts(x),ads.Files,'UniformOutput',false);
ads.Labels = categorical(string(cellfun(@(x)x(1),filenames)));Чтобы разделить хранилище данных на набор разработок и набор проверки, используйте splitEachLabel. Распределите 80% данных для разработки и оставшиеся 20% для проверки.
[adsTrain,adsValidation] = splitEachLabel(ads,0.8);
Оценка традиционной производительности внутреннего сервера i-vector
Создайте i-векторную систему, которая ожидает ввод звука с частотой дискретизации 8 кГц и не выполняет обнаружение речи.
wordRecognizer = ivectorSystem('DetectSpeech',false,"SampleRate",fs)
wordRecognizer =
ivectorSystem with properties:
InputType: 'audio'
SampleRate: 8000
DetectSpeech: 0
EnrolledLabels: [0×2 table]
Обучите экстрактор i-вектора, используя данные из обучающего набора.
trainExtractor(wordRecognizer,adsTrain, ... "UBMNumComponents",512, ... "UBMNumIterations",5, ... ... "TVSRank",128, ... "TVSNumIterations",3);
Calculating standardization factors ....done. Training universal background model ........done. Training total variability space ...done. i-vector extractor training complete.
Обучение i-векторного классификатора с использованием данных из набора обучающих данных и соответствующих меток.
trainClassifier(wordRecognizer,adsTrain,adsTrain.Labels, ... "NumEigenvectors",16, ... ... "PLDANumDimensions",16, ... "PLDANumIterations",3);
Extracting i-vectors ...done. Training projection matrix .....done. Training PLDA model ......done. i-vector classifier training complete.
Зарегистрируйте этикетки в системе, используя весь набор обучения.
enroll(wordRecognizer,adsTrain,adsTrain.Labels)
Extracting i-vectors ...done. Enrolling i-vectors .............done. Enrollment complete.
В цикле считывайте аудио из хранилища данных проверки, идентифицируйте наиболее вероятное слово, присутствующее в соответствии с указанным бомбардиром, и сохраните прогноз для анализа.
trueLabels = adsValidation.Labels; predictedLabels = trueLabels; reset(adsValidation) scorer ="plda"; for ii = 1:numel(trueLabels) audioIn = read(adsValidation); to = identify(wordRecognizer,audioIn,scorer); predictedLabels(ii) = to.Label(1); end
Отображение таблицы путаницы производительности i-векторной системы в наборе проверки.
figure('Units','normalized','Position',[0.2 0.2 0.5 0.5]) confusionchart(trueLabels,predictedLabels, ... 'ColumnSummary','column-normalized', ... 'RowSummary','row-normalized', ... 'Title',sprintf('Accuracy = %0.2f (%%)',100*mean(predictedLabels==trueLabels)))

Оцените производительность бэкэнда глубокого обучения
Затем выполните обучение полностью подключенной сети с использованием i-векторов в качестве входных данных.
ivectorsTrain = (ivector(wordRecognizer,adsTrain))'; ivectorsValidation = (ivector(wordRecognizer,adsValidation))';
Определите полностью подключенную сеть.
layers = [ ... featureInputLayer(size(ivectorsTrain,2),'Normalization',"none") fullyConnectedLayer(128) dropoutLayer(0.4) fullyConnectedLayer(256) dropoutLayer(0.4) fullyConnectedLayer(256) dropoutLayer(0.4) fullyConnectedLayer(128) dropoutLayer(0.4) fullyConnectedLayer(numel(unique(adsTrain.Labels))) softmaxLayer classificationLayer];
Определение параметров обучения.
miniBatchSize = 256; validationFrequency = floor(numel(adsTrain.Labels)/miniBatchSize); options = trainingOptions("adam", ... "MaxEpochs",10, ... "MiniBatchSize",miniBatchSize, ... "Plots","training-progress", ... "Verbose",false, ... "Shuffle","every-epoch", ... "ValidationData",{ivectorsValidation,adsValidation.Labels}, ... "ValidationFrequency",validationFrequency);
Обучение сети.
net = trainNetwork(ivectorsTrain,adsTrain.Labels,layers,options);

Оцените производительность бэкэнда глубокого обучения с помощью таблицы путаницы.
predictedLabels = classify(net,ivectorsValidation); trueLabels = adsValidation.Labels; figure('Units','normalized','Position',[0.2 0.2 0.5 0.5]) confusionchart(trueLabels,predictedLabels, ... 'ColumnSummary','column-normalized', ... 'RowSummary','row-normalized', ... 'Title',sprintf('Accuracy = %0.2f (%%)',100*mean(predictedLabels==trueLabels)))

Оценка производительности внутреннего сервера KNN
Обучение и оценка i-векторов с помощью бэкэнда k-ближайшего соседа (KNN).
Использовать fitcknn для обучения модели KNN.
classificationKNN = fitcknn(... ivectorsTrain, ... adsTrain.Labels, ... 'Distance','Euclidean', ... 'Exponent',[], ... 'NumNeighbors',10, ... 'DistanceWeight','SquaredInverse', ... 'Standardize',true, ... 'ClassNames',unique(adsTrain.Labels));
Проанализируйте бэкэнд KNN.
predictedLabels = predict(classificationKNN,ivectorsValidation); trueLabels = adsValidation.Labels; figure('Units','normalized','Position',[0.2 0.2 0.5 0.5]) confusionchart(trueLabels,predictedLabels, ... 'ColumnSummary','column-normalized', ... 'RowSummary','row-normalized', ... 'Title',sprintf('Accuracy = %0.2f (%%)',100*mean(predictedLabels==trueLabels)))

Ссылки
[1] Якобовски. «Jakobovski/Free-Spoken-Digit-Dataset». GitHub, 30 мая 2019 года. https://github.com/Jakobovski/free-spoken-digit-dataset.
[1] Рейнольдс, Дуглас А., и др. «Проверка говорящего с использованием адаптированных моделей гауссовых смесей». Цифровая обработка сигналов, том 10, № 1-3, январь 2000, стр. 19-41. DOI.org (Crossref), doi: 10.1006/dspr.199.0361.
[2] Кенни, Патрик и др. «Совместный факторный анализ в сравнении с собственными каналами при распознавании говорящих». IEEE Transactions on Audio, Speech and Language Processing, vol. 15, no. 4, May 2007, pp. 1435-47. DOI.org (Crossref), doi:10.1109/TASL.2006.881693.
[3] Кенни, П., и др. «Исследование межговорящей изменчивости в проверке говорящих». Транзакции IEEE по обработке звука, речи и языка, том 16, № 5, июль 2008, стр. 980-88. DOI.org (Crossref), doi:10.1109/TASL.2008.925147.
[4] Dehak, Najim, et al. «Внешний факторный анализ для проверки динамика». Транзакции IEEE по обработке аудио, речи и языка, том 19, № 4, май 2011, стр. 788-98. DOI.org (Crossref), doi:10.1109/TASL.2010.2064307.
[5] Матейка, Павел, Ондрей Глембек, Фабио Кастальдо, М.Дж. Алам, Олдрич Плчот, Патрик Кенни, Лукас Бургет и Ян Черноки. 2011 Международная конференция IEEE по акустике, речи и обработке сигналов (ICASSSP), 2011. https://doi.org/10.1109/icassp.2011.5947436.
[6] Снайдер, Дэвид, и др. Международная конференция IEEE 2018 по акустике, обработке речи и сигналов (ICASSP), IEEE, 2018, стр. 5329-33. DOI.org (Crossref), doi:10.1109/ICASSP.2018.8461375.
[7] Лаборатория обработки сигналов и речевой связи. Доступ состоялся 12 декабря 2019 года. https://www.spsc.tugraz.at/databases-and-tools/ptdb-tug-pitch-tracking-database-from-graz-university-of-technology.html.
[8] Variani, Эхсан, и др. Международная конференция IEEE 2014 по акустике, речи и обработке сигналов (ICASSP), IEEE, 2014, стр. 4052-56. DOI.org (Crossref), doi:10.1109/ICASSP.2014.6854363.
[9] Дехак, Наджим, Реда Дехак, Джеймс Р. Гласс, Дуглас А. Рейнольдс и Патрик Кенни. «Оценка косинусного подобия без методов нормализации баллов». Одиссея (2010).
[10] Верма, Пулкит и Прадип К. Дас. «I-векторы в приложениях обработки речи: опрос». Международный журнал речевых технологий, том 18, № 4, декабрь 2015 года, стр. 529-46. DOI.org (Crossref), doi: 10.1007/s10772-015-9295-3.
[11] Д. Гарсия-Ромеро и К. Эспи-Уилсон, «Анализ нормализации длины I-вектора в системах распознавания говорящих». Interspeech, 2011, стр. 249-252.
[12] Кенни, Патрик. «Байесовская проверка спикера с тяжелохвостыми приорами». Одиссея 2010 - Семинар по распознаванию спикеров и языков, Брно, Чехия, 2010.
[13] Сизов, Александр, Конг Айк Ли и Томи Киннунен. «Унификация вероятностных вариантов линейного дискриминантного анализа при биометрической проверке подлинности». Лекции по компьютерной науке Структурное, синтаксическое и статистическое распознавание образов, 2014, 464-75. https://doi.org/10.1007/978-3-662-44415-3_47.
[14] Раджан, Падманабхан, Антон Афанасьев, Вилле Хаутамяки, Томи Киннунен. 2014. «От одного к нескольким I-векторам регистрации: практические варианты оценки PLDA для проверки говорящего». Цифровая обработка сигналов 31 (август): 93-101. https://doi.org/10.1016/j.dsp.2014.05.001.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.