Создайте i-векторную систему
i-векторы являются компактными статистическими представлениями тождеств, извлеченных из аудиосигналов. ivectorSystem
создает обучаемую i-векторную систему для извлечения i-векторов и выполнения задач классификации, таких как распознавание динамика, диаризация динамика и классификация звука. Можно также определить пороги для задач открытого набора и зарегистрировать метки в системе для классификации открытых и закрытых наборов.
InputType
- Тип входа'audio'
(по умолчанию) | 'features'
Входной тип, заданный как 'audio'
или 'features'
.
'audio'
- i-векторная система принимает моно аудиосигналы как входные. Аудио данных обрабатывают, чтобы извлечь 20 мел частотных кепстральных коэффициентов (MFCCs), дельта-MFCCs и дельта-дельта MFCCs для 60 коэффициентов в систему координат.
Если InputType установлен в 'audio'
при создании i-векторной системы обучающие данные могут быть:
Массив ячеек из одноканальных аудиосигналов, каждый из которых задан как вектор-столбец с базовым типом single
или double
.
Система координат audioDatastore
объект или signalDatastore
объект, который указывает на набор данных моно аудиосигналов.
A TransformedDatastore
с базовым audioDatastore
или signalDatastore
который указывает на набор данных моно аудиосигналов. Значение выхода из вызовов в read
от преобразования datastore должны быть моно-аудиосигналы с базовым типом данных 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
(по умолчанию) | положительная скалярная величинаЧастота дискретизации аудио входа в Гц, заданная как положительная скалярная величина.
Примечание
The 'SampleRate'
свойство применяется только тогда, когда 'InputType'
установлено в 'audio'
.
Пример: ivs = ivectorSystem('InputType','audio','SampleRate',48000)
Типы данных: single
| double
DetectSpeech
- Применить обнаружение речиtrue
(по умолчанию) | false
Применить обнаружение речи, заданное как true
или false
. С 'DetectSpeech'
установлено на true
i-векторная система извлекает признаки только из областей, где обнаружена речь.
Примечание
The DetectSpeech
свойство применяется только тогда, когда InputType
установлено в 'audio'
.
ivectorSystem
использует detectSpeech
функция для обнаружения областей речи.
Пример: ivs = ivectorSystem('InputType','audio','DetectSpeech',true)
Типы данных: logical
| single
| double
EnrolledLabels
- Таблица, содержащая зарегистрированные метки0
-by- 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
. Задайте количество компонентов универсальной фоновой модели (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
со звуковым сигналом и указанием идентификатора динамика, бомбардира и порога для бомбардира. The 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 Database) из группы распознавания робастной речи CMU [1]. Набор данных содержит записи мужских и женских субъектов, говорящих слова и цифры. Функция helper в этом примере загружает набор данных для вас и преобразует необработанные файлы в 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 и тангаж с 50 мс периодические окна Hann с 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 - Audio Databases». 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: число (labelsTest) функции = read (tdsTest); tableOut = identify (soundClassfier, функции, бомбардир,'NumCandidates',1); inferrededLabels (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 для прогнозирования условия машин в тестовом наборе. The 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, Nishchal 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;
Считайте сигнал от datastore и слушайте его. Отобразите идентификатор динамика и эмоции аудиосигнала.
[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 (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-векторной системы с помощью обновленных меток. Вам не нужно переобучать экстрактор.
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] Burkhardt, F., A. Paeschke, M. Rolfes, W.F. Sendlmeier, and B. Weiss, «A Database of Немецкая эмоциональная речь». В Proceedings Interspeech 2005. Лиссабон, Португалия: Международная ассоциация речевых коммуникаций, 2005 год.
Этот пример использует:
Система i-векторов состоит из обучаемого переднего плана, который учится извлекать i-векторы на основе немеченых данных, и обучаемого бэкенда, который учится классифицировать i-векторы на основе маркированных данных. В этом примере вы применяете i-векторную систему к задаче распознавания слов. Сначала оцените точность i-векторной системы с помощью классификаторов, входящих в традиционную i-векторную систему: вероятностного линейного дискриминантного анализа (PLDA) и оценки косинусоидальности (CSS). Затем оцените точность системы, если вы заменяете классификатор на двунаправленную сеть долгой краткосрочной памяти (BiLSTM) или классификатор ближайших К соседей.
Создайте наборы обучения и валидации
Загрузите Free Spoken Digit Dataset (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 = read (adsValidation); to = identification (wordRecognizer, audioIn, scorer); predictedLabels (ii) = to. Метка (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 Backend
Обучите и оцените 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] Reynolds, Douglas A., et al. «Динамик Верификации использования адаптированных Смешанных гауссовских моделей». Цифровая обработка сигналов, том 10, № 1-3, январь 2000, стр. 19-41. DOI.org (Crossref), doi: 10.1006/dspr.1999.0361.
[2] Kenny, Patrick, et al. Joint Factor Analysis Verson Eigenchannels in Speaker Recognition (неопр.) (недоступная ссылка). Транзакции IEEE по обработке звука, речи и языка, том 15, № 4, май 2007, стр. 1435-47. DOI.org (Crossref), doi:10.1109/TASL.2006.881693.
[3] Kenny, P., et al. «Исследование изменчивости интерспикера при верификации динамика». Транзакции 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] Матейка, Павел, Ондрей Глембек, Фабио Кастальдо, M.j. Алам, Олдрич Плхот, Патрик Кенни, Лукас Бургет и Ян Серноки. «Full-Covariation UBM and Heavy-Tailed PLDA in i-Vector Speaker Верификации». 2011 Международная конференция IEEE по акустике, речи и обработке сигналов (ICASSP), 2011. https://doi.org/10.1109/icassp.2011.5947436.
[6] Snyder, David, et al. «X-Vectors: Robust DNN Embeddings for Speaker Recognition». 2018 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), IEEE, 2018, pp. 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, Ehsan, et al. Глубокие нейронные сети для Text-Dependent Speaker Верификации. 2014 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), IEEE, 2014, pp. 4052-56. DOI.org (Crossref), doi:10.1109/ICASSP.2014.6854363.
[9] Дехак, Наджим, Реда Дехак, Джеймс Р. Гласс, Дуглас А. Рейнольдс и Патрик Кенни. Оценка косинусоидальности без методов нормализации счета. Одиссея (2010).
[10] Verma, Pulkit и Pradip K. Das. «I-векторы в приложениях обработки речи: опрос». International Journal of Speech Technology, vol. 18, № 4, Dec. 2015, pp. 529-46. DOI.org (Crossref), doi: 10.1007/s10772-015-9295-3.
[11] D. Garcia-Romero and C. Espy-Wilson, «Analysis of I-vector Length Normalization in Speaker Recognition Systems». Interspeech, 2011, pp. 249-252.
[12] Кенни, Патрик. Bayesian Speaker Verification with Heavy-Tailed Priors (неопр.) (недоступная ссылка). Odyssey 2010 - Семинар по распознаванию и распознаванию языков, Брно, Чешская Республика, 2010.
[13] Sizov, Aleksandr, Kong Aik Lee, and Tomi Kinnunen. «Унификация вероятностных вариантов линейного дискриминантного анализа в биометрической аутентификации». Lecture Notes in Computer Science Structural, Syntactic, and Statistical Pattern Recognition, 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.