Оцените бинарную систему классификации
detectionErrorTradeoff(___)
без выходных аргументов строит равный коэффициент ошибок и ошибочный компромисс обнаружения.
Используйте Базу данных Отслеживания Тангажа из Технологического университета Граца (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.
ivs
— система i-вектораivectorSystem
объектсистема i-вектора в виде объекта типа ivectorSystem
.
data
— Помеченные данные об оценкеaudioDatastore
| signalDatastore
| TransformedDatastore
Помеченные данные об оценке в виде массива ячеек или как audioDatastore
, signalDatastore
, или TransformedDatastore
объект.
Если InputType установлен в 'audio'
когда система i-вектора будет создана, задайте data
как один из них:
Массив ячеек одноканальных звуковых сигналов, каждый заданный как вектор-столбец с базовым типом single
или double
.
audioDatastore
возразите или signalDatastore
возразите что точки против набора данных моно звуковых сигналов.
TransformedDatastore
с базовым audioDatastore
или signalDatastore
это указывает на набор данных моно звуковых сигналов. Выход от вызовов до read
от преобразования datastore должен быть моно звуковыми сигналами с базовым типом данных single
или double
.
Если InputType установлен в 'features'
когда система i-вектора будет создана, задайте data
как один из них:
Массив ячеек матриц с базовым типом single
или double
. Матрицы должны состоять из функций аудио, где количество функций (столбцы) заблокировано в первый раз trainExtractor
называется и количество транзитных участков (строки) переменного размера. Количество входа функций в любых последующих вызовах любой из объектных функций должно быть равно количеству функций, использованных при вызове trainExtractor
.
TransformedDatastore
объект с базовым audioDatastore
или signalDatastore
чей read
функция вывела как описано в предыдущем маркере.
signalDatastore
объект, чей read
функция вывела как описано в первом маркере.
Типы данных: cell
| audioDatastore
| signalDatastore
labels
— Метки классификацииМетки классификации, используемые системой i-вектора в виде одного из следующего:
Категориальный массив
Массив ячеек из символьных векторов
Массив строк
Примечание
Количество звуковых сигналов в data
должен совпадать с количеством labels
.
Типы данных: categorical
| cell
| string
Задайте дополнительные разделенные запятой пары Name,Value
аргументы. Name
имя аргумента и Value
соответствующее значение. Name
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN
.
detectionErrorTradeoff(ivs,'Scorer','css')
'Scorer'
— Результаты маркера'all'
(значение по умолчанию) | 'plda'
| 'css'
Результаты маркера, возвращенные от системы i-вектора в виде 'plda'
, который соответствует вероятностному линейному дискриминантному анализу (PLDA), 'css'
, который соответствует счету подобия косинуса (CSS) или 'all'
.
Типы данных: char |
string
'minDCF'
— Параметры функции стоимости обнаруженияПараметры функции стоимости обнаружения в виде трехэлементного вектора, состоящего из стоимости ложного отклонения, стоимости ложного принятия и априорной вероятности зарегистрированной присутствующей метки, в том порядке.
Когда вы задаете параметры функции стоимости обнаружения, detectionErrorTradeoff
возвращает threshold
соответствие минимуму функции стоимости [1] обнаружения. Функция стоимости обнаружения задана как
Det C (P FR, FA P) = C FR × P FR × P представляют + FA C × FA P × (1 – существующий P),
где
Det C — функция стоимости Обнаружения
FR C — Стоимость ложного отклонения
FA C — Стоимость ложного принятия
Существующий P — Априорная вероятность зарегистрированной присутствующей метки
FR P — Наблюдаемая вероятность ложного отклонения, учитывая data
введите к detectionErrorTradeoff
FA P — Наблюдаемая вероятность ложного принятия дает data
введите к detectionErrorTradeoff
Типы данных: single
| double
results
— FAR и FRR на порог протестированыFAR и FRR на протестированный порог, возвратились как структура или таблица.
Если 'Scorer'
задан как 'all'
, затем results
возвращен как структура с полями PLDA
и CSS
и значения, содержащие таблицы. Каждая таблица имеет три переменные, Threshold
, FAR
, и FRR
.
Если 'Scorer'
задан как 'plda'
или 'css'
, затем results
возвращен как таблица, соответствующая заданному маркеру.
Типы данных: struct |
table
threshold
— Порог, соответствующий, чтобы равняться коэффициенту ошибокПорог, соответствующий равному коэффициенту ошибок (EER) или минимуму функции стоимости обнаружения (minDCF), возвратился как скаляр или структура. Если minDCF
задан, затем threshold
соответствует minDCF
. В противном случае, threshold
соответствует EER.
Если 'Scorer'
задан как 'all'
, затем threshold
возвращен как структура с полями PLDA
и CSS
и значения равняются соответствующим порогам.
Если 'Scorer'
задан как 'plda'
или 'css'
, затем threshold
возвращен как скаляр, соответствующий заданному маркеру.
Типы данных: single
| double
| struct
[1] Leeuwen, фургон Дэвида А. и Нико Брюммер. “Введение в Не зависящую от приложения Оценку Систем Распознавания Динамика”. В Классификации I Динамиков, отредактированной Кристианом Мюллером, 4343:330–53. Берлин, Гейдельберг: Спрингер Берлин Гейдельберг, 2007. https://doi.org/10.1007/978-3-540-74200-5_19.
enroll
| identify
| info
| ivector
| ivectorSystem
| release
| trainClassifier
| trainExtractor
| unenroll
| verify
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.