Обучите классификатор i-векторов
trainClassifier(
обучает ivs
,data
,labels
)ivectorSystem
ivs объекта
для классификации i-векторов как меток.
trainClassifier(
задает опции, используя один или несколько аргументов имя-значение. Для примера, ivs
,data
,labels
,Name,Value
)trainClassifier(ivs,data,labels,'NumEigenvectors',A)
задает количество собственных векторов, используемых для уменьшения размерности.
Используйте базу данных отслеживания тангажа из Технологического университета Граца (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.
ivs
- i-векторная системаivectorSystem
объектi-векторная система, заданная как объект типа ivectorSystem
.
data
- Обучающие данные для i-векторной системыaudioDatastore
| signalDatastore
| TransformedDatastore
Обучающие данные для i-векторной системы, заданные как массив ячеек или как audioDatastore
, signalDatastore
, или TransformedDatastore
объект.
Если InputType установлен в 'audio'
когда i-векторная система будет создана, задайте data
как одно из следующего:
Массив ячеек из одноканальных аудиосигналов, каждый из которых задан как вектор-столбец с базовым типом single
или double
.
Система координат audioDatastore
объект или signalDatastore
объект, который указывает на набор данных моно аудиосигналов.
A TransformedDatastore
с базовым audioDatastore
или signalDatastore
который указывает на набор данных моно аудиосигналов. Значение выхода из вызовов в read
от преобразования datastore должны быть моно-аудиосигналы с базовым типом данных single
или double
.
Если InputType установлен в 'features'
когда i-векторная система будет создана, задайте data
как одно из следующего:
Массив ячеек из матриц с базовым типом single
или double
. Матрицы должны состоять из аудио функций, где количество функций (столбцов) блокируется с первого раза trainExtractor
вызывается, и количество переходов (строк) изменяется. Количество признаков, вводимых в любые последующие вызовы любой из функций объекта, должно быть равно количеству функций, используемых при вызове trainExtractor
.
A TransformedDatastore
объект с базовым audioDatastore
или signalDatastore
чей read
функция имеет вывод, как описано в предыдущей пуле.
A signalDatastore
объект, чей read
функция имеет вывод, как описано в первой пуле.
Типы данных: cell
| audioDatastore
| signalDatastore
labels
- Классификационные меткиКлассификационные метки, используемые i-векторной системой, заданные как одно из следующего:
Категориальный массив
Массив ячеек из векторов символов
A строковых массивов
Примечание
Количество аудиосигналов в data
должно совпадать с количеством labels
.
Типы данных: categorical
| cell
| string
Задайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
trainClassifier(ivs,data,labels,'PLDANumIterations',D)
'NumEignevectors'
- Количество собственных векторов16
(по умолчанию) | положительное целое числоКоличество собственных векторов, используемых для выполнения уменьшения размерности, заданное как положительное целое число.
Пример: trainClassifier(ivs,data,labels,'NumEigenvectors',18)
Типы данных: single
| double
'PLDANumIterations'
- Количество итераций максимизации ожиданий5
(по умолчанию) | положительное целое числоКоличество итераций максимизации ожиданий, используемых для обучения вероятностной модели линейного дискриминантного анализа (PLDA), заданное в виде положительного целого числа.
Пример: trainClassifier(ivs,data,labels,'PLDANumIterations',3)
Типы данных: single
| double
'PLDANumDimensions'
- Максимальное количество размерностей PLDA16
(по умолчанию) | положительное целое числоМаксимальное количество размерностей для модели PLDA, заданное в виде положительного целого числа.
Пример: trainClassifier(ivs,data,labels,'PLDANumDimensions',10)
Примечание
'PLDANumDimensions'
должно быть меньше или равно рангу матрицы полной переменности.
Типы данных: single
| double
detectionErrorTradeoff
| enroll
| identify
| info
| ivector
| ivectorSystem
| release
| trainExtractor
| unenroll
| verify
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.