Создайте систему i-вектора
i-векторы являются компактными статистическими представлениями идентичности, извлеченной из звуковых сигналов. ivectorSystem
создает обучаемую систему i-вектора, чтобы извлечь i-векторы и выполнить задачи классификации, такие как распознавание динамика, динамик diarization и звуковая классификация. Можно также определить пороги для открытых поставивших задач и зарегистрировать метки в систему и для классификации открытых и для замкнутых множеств.
InputType
— Тип входа'audio'
(значение по умолчанию) | 'features'
Введите тип в виде 'audio'
или 'features'
.
'audio'
– Система i-вектора принимает моно звуковые сигналы как вход. Аудиоданные обрабатываются, чтобы извлечь 20 mel частот cepstral коэффициенты (MFCCs), дельта MFCCs и дельта дельты MFCCs для 60 коэффициентов на систему координат.
Если InputType установлен в 'audio'
когда система i-вектора создается, обучающие данные могут быть:
Массив ячеек одноканальных звуковых сигналов, каждый заданный как вектор-столбец с базовым типом single
или double
.
audioDatastore
возразите или signalDatastore
возразите что точки против набора данных моно звуковых сигналов.
TransformedDatastore
с базовым audioDatastore
или signalDatastore
это указывает на набор данных моно звуковых сигналов. Выход от вызовов до read
от преобразования datastore должен быть моно звуковыми сигналами с базовым типом данных single
или double
.
'features'
– I-вектор принимает предварительно извлеченные функции аудио, как введено.
Если InputType установлен в 'features'
когда система i-вектора создается, обучающие данные могут быть:
Массив ячеек матриц с базовым типом single
или double
. Матрицы должны состоять из функций аудио, где количество функций (столбцы) заблокировано в первый раз trainExtractor
называется и количество транзитных участков (строки) переменного размера. Количество входа функций в любых последующих вызовах любой из объектных функций должно быть равно количеству функций, использованных при вызове trainExtractor
.
TransformedDatastore
объект с базовым audioDatastore
или signalDatastore
чей read
функция вывела как описано в предыдущем маркере.
signalDatastore
объект, чей read
функция вывела как описано в первом маркере.
Пример: ivs = ivectorSystem('InputType','audio')
Типы данных: char |
string
SampleRate
— Частота дискретизации аудиовхода в Гц
(значение по умолчанию) | положительная скалярная величинаЧастота дискретизации аудиовхода в Гц в виде положительной скалярной величины.
Примечание
'SampleRate'
свойство только применяется когда 'InputType'
установлен в 'audio'
.
Пример: ivs = ivectorSystem('InputType','audio','SampleRate',48000)
Типы данных: single
| double
DetectSpeech
— Примените речевое обнаружениеtrue
(значение по умолчанию) | false
Примените речевое обнаружение в виде true
или false
. С 'DetectSpeech'
установите на true
, системные извлечения i-вектора показывают только из областей, где речь обнаруживается.
Примечание
DetectSpeech
свойство только применяется когда InputType
установлен в 'audio'
.
ivectorSystem
использует detectSpeech
функция, чтобы обнаружить области речи.
Пример: ivs = ivectorSystem('InputType','audio','DetectSpeech',true)
Типы данных: логический |
single
| double
EnrolledLabels
— Таблица, содержащая зарегистрированные метки
- 2
таблица (значение по умолчанию)Это свойство доступно только для чтения.
Таблица, содержащая зарегистрированные метки в виде таблицы. Имена строки таблицы соответствуют меткам, и имена столбцов соответствуют i-вектору шаблона, и количество отдельных i-векторов раньше генерировало i-вектор шаблона. Количество i-векторов, используемых, чтобы сгенерировать i-вектор шаблона, может быть просмотрено как мера доверия к шаблону.
Типы данных: table
trainExtractor | Обучите экстрактор i-вектора |
trainClassifier | Обучите классификатор i-вектора |
enroll | Зарегистрируйте метки |
unenroll | Не зарегистрируйте метки |
detectionErrorTradeoff | Оцените бинарную систему классификации |
verify | Метка Verify |
identify | Метка Identify |
ivector | Извлеките i-вектор |
info | Возвратите учебную настройку и информацию о данных |
release | Позвольте значения свойств и введите характеристики, чтобы измениться |
Используйте Базу данных Отслеживания Тангажа из Технологического университета Граца (PTDB-TUG) [1]. Набор данных состоит из 20 английских носителей языка, читающих 2 342 фонетически богатых предложения из корпуса 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
. Задайте количество компонентов универсальной фоновой модели (UBM) как 128 и количество итераций максимизации ожидания как 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-вектора, вызовите 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
со звуковым сигналом и задают ID динамика, маркер и порог для маркера. 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
Вызовите верификацию динамика снова. На этот раз задайте неправильный ID динамика.
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 Robust Speech Recognition Group [1]. Набор данных содержит записи участников эксперимента и участниц эксперимента, произносящих слова и числа. Функция помощника в этом примере загружает набор данных для вас и преобразует необработанные файлы в FLAC и возвращает два audioDatastore
объекты, содержащие набор обучающих данных и набор тестов. По умолчанию набор данных уменьшается так, чтобы пример запустился быстро. Можно использовать полный набор данных установкой ReduceDataset
ко лжи.
[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
возразите, чтобы извлечь gammatone cepstral коэффициенты (GTCC), дельта GTCC, дельта дельты GTCC и тангаж из периодических окон Hann на 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
Разделите datastore в наборы обучающих данных и наборы тестов.
[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.
Создайте две директории в своей текущей папке: обучите и протестируйте. Извлеките функции из и обучение и наборы тестовых данных и запишите функции как файлы 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\','\'));
Создайте datastore преобразования из хранилищ данных сигнала, чтобы изолировать и использовать только желаемые функции. Можно использовать выход от 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) функции = читают (tdsTest); tableOut = идентифицируют (soundClassifier, функции, маркер,'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);
Считайте звуковой файл из datastore и сохраните частоту дискретизации. Слушайте звуковой сигнал и постройте сигнал во временном интервале.
[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-вектора с помощью учебного datastore.
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] Verma, Нищел К., и др. “Интеллектуальный основанный на условии Контроль Используя Акустические Сигналы для Воздушных Компрессоров”. Транзакции 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"));
Имена файлов являются кодами, указывающими на ID динамика, текст, на котором говорят, эмоция и версия. Веб-сайт содержит ключ для интерпретации кода и дополнительной информации о динамиках, таких как пол и возраст. Составьте таблицу с переменными 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;
Считайте сигнал из datastore и слушайте его. Отобразите ID динамика и эмоцию звукового сигнала.
[audioIn,audioInfo] = read(ads); fs = audioInfo.SampleRate; sound(audioIn,fs) audioInfo.Label
ans=1×2 table
Speaker Emotion
_______ _________
03 Happiness
Разделите datastore в набор обучающих данных и набор тестов. Присвойте два динамика набору тестов и остающееся к набору обучающих данных.
testSpeakerIdx = ads.Labels.Speaker=="12" | ads.Labels.Speaker=="13"; adsTrain = subset(ads,~testSpeakerIdx); adsTest = subset(ads,testSpeakerIdx);
Считайте все обучение и тестирующий аудиоданные в массивы ячеек. Если ваши данные могут уместиться в памяти, обучение обычно быстрее, чтобы ввести массивы ячеек к системе i-вектора, а не хранилищам данных.
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-вектора.
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-вектора в приложении замкнутого множества мультиметки можно использовать identify
функционируйте и создайте матрицу беспорядка. Матрица беспорядка позволяет вам идентифицировать, какие эмоции не распознаны и что они не распознаны как. Используйте функцию поддержки plotConfusion
отобразить результаты.
trueLabels = testLabels; predictedLabels = trueLabels; scorer = "css"; for ii = 1:numel (набор тестов) tableOut = идентифицируют (emotionRecognizer, набор тестов {ii}, маркер); 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-вектора с помощью обновленных меток. Вы не должны переобучать экстрактор.
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 (набор тестов) tableOut = идентифицируют (emotionRecognizer, набор тестов {ii}, маркер); 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 (набор тестов) tableOut = идентифицируют (emotionRecognizer, набор тестов {ii}, маркер); 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] Burkhardt, F., А. Пэешк, М. Рольфес, В.Ф. Сендлмайер и Б. Вайс, "База данных немецкой эмоциональной речи". В межречи 2005 продолжений. Лиссабон, Португалия: международная речевая коммуникационная ассоциация, 2005.
Система i-вектора состоит из обучаемого фронтэнда, который изучает, как извлечь i-векторы на основе непомеченных данных и обучаемый бэкэнд, который изучает, как классифицировать i-векторы на основе маркированных данных. В этом примере вы применяете систему i-вектора к задаче распознавания слов. Во-первых, оцените точность системы i-вектора с помощью классификаторов, включенных в традиционную систему i-вектора: вероятностный линейный дискриминантный анализ (PLDA) и выигрыш подобия косинуса (CSS). Затем оцените точность системы, если вы заменяете классификатор на двунаправленную длинную краткосрочную сеть (BiLSTM) памяти или классификатор K - ближайших соседей.
Создайте наборы обучения и валидации
Загрузите Свободный разговорный набор данных цифры (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)));
Чтобы разделить datastore в набор разработки и набор валидации, используйте splitEachLabel
. Выделите 80% данных для разработки и остающиеся 20% для валидации.
[adsTrain,adsValidation] = splitEachLabel(ads,0.8);
Оцените Традиционную Эффективность Бэкэнда i-вектора
Создайте систему 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.
В цикле считайте аудио из datastore валидации, идентифицируйте наиболее вероятный подарок слова согласно заданному маркеру и сохраните предсказание для анализа.
trueLabels = adsValidation.Labels; predictedLabels = trueLabels; reset(adsValidation) scorer = "plda"; for ii = 1:numel (trueLabels) audioIn = читают (adsValidation); к = идентифицируют (wordRecognizer, audioIn, маркер); 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.1999.0361.
[2] Кенни, Патрик, и др. “Объединенный Факторный анализ По сравнению с Eigenchannels в Распознавании Динамика”. Транзакции IEEE на Аудио, Речи и Обработке Языка, издании 15, № 4, май 2007, стр 1435–47. DOI.org (Crossref), doi:10.1109/TASL.2006.881693.
[3] Кенни, P., и др. “Исследование Изменчивости Междинамика в Верификации Динамика”. Транзакции IEEE на Аудио, Речи, и Обработке Языка, издании 16, № 5, июль 2008, стр 980–88. DOI.org (Crossref), doi:10.1109/TASL.2008.925147.
[4] Dehak, Najim, и др. “Выйдите напрямую Факторный анализ для Верификации Динамика”. Транзакции IEEE на Аудио, Речи, и Обработке Языка, издании 19, № 4, май 2011, стр 788–98. DOI.org (Crossref), doi:10.1109/TASL.2010.2064307.
[5] Matejka, Павел, Ondrej Glembek, Фабио Кастальдо, M.j. Алам, Oldrich Plchot, Патрик Кенни, Лукаш Бургет и Ян Серноки. “Full-Covariance UBM и PLDA с тяжелым хвостом в Верификации Динамика i-вектора”. 2 011 Международных конференций IEEE по вопросам Акустики, Речи и Обработки сигналов (ICASSP), 2011. https://doi.org/10.1109/icassp.2011.5947436.
[6] Снайдер, Дэвид, и др. “X-векторы: Устойчивые Вложения DNN для Распознавания Динамика”. 2 018 Международных конференций IEEE по вопросам Акустики, Речи и Обработки сигналов (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, Эхсан, и др. “Глубокие нейронные сети для Маленькой Верификации Динамика Текстового Зависимого Места”. 2 014 Международных конференций IEEE по вопросам Акустики, Речи и Обработки сигналов (ICASSP), IEEE, 2014, стр 4052–56. DOI.org (Crossref), doi:10.1109/ICASSP.2014.6854363.
[9] Dehak, Najim, Réda Dehak, Джеймс Р. Стекло, Дуглас А. Рейнольдс и Патрик Кенни. “Подобие косинуса, выигрывающее без методов нормализации счета”. Одиссея (2010).
[10] Verma, Pulkit и Прэдип К. Дас. “I-векторы в Речевых Приложениях обработки: Обзор”. Международный журнал Речевой Технологии, издания 18, № 4, декабрь 2015, стр 529–46. DOI.org (Crossref), doi:10.1007/s10772-015-9295-3.
[11] Д. Гарсия-Ромеро и К. замечать-Вильсон, “Анализ Нормализации I-длины-вектора в Системах Распознавания Динамика”. Межречь, 2011, стр 249–252.
[12] Кенни, Патрик. "Байесова верификация динамика с уголовным прошлым с тяжелым хвостом". Одиссея 2010 - семинар распознавания динамика и языка, Брно, Чешская Республика, 2010.
[13] Сизов, Александр, Кун Айк Ли и Томи Киннунен. “Объединяя Вероятностные Варианты Линейного дискриминантного анализа в Биометрической Аутентификации”. Читайте лекции Примечаниям в Информатике Структурное, Синтаксическое, и Статистическое Распознавание образов, 2014, 464–75. https://doi.org/10.1007/978-3-662-44415-3_47.
[14] Раджан, Padmanabhan, Антон Афанасьев, Ville Hautamäki и Tomi Kinnunen. 2014. “От Одного до Нескольких I-векторов Приема: Практический PLDA Выигрыш Вариантов для Верификации Динамика”. Цифровая обработка сигналов 31 (август): 93–101. https://doi.org/10.1016/j.dsp.2014.05.001.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.