ivectorSystem

Создайте i-векторную систему

    Описание

    i-векторы являются компактными статистическими представлениями тождеств, извлеченных из аудиосигналов. ivectorSystem создает обучаемую i-векторную систему для извлечения i-векторов и выполнения задач классификации, таких как распознавание динамика, диаризация динамика и классификация звука. Можно также определить пороги для задач открытого набора и зарегистрировать метки в системе для классификации открытых и закрытых наборов.

    Создание

    Описание

    пример

    ivs = ivectorSystem создает систему i-векторов по умолчанию. Можно обучить i-векторную систему извлекать i-векторы и выполнять задачи классификации.

    пример

    ivs = ivectorSystem(Name,Value) задает свойства nondefault для ivs использование одного или нескольких аргументов имя-значение.

    Свойства

    расширить все

    Входной тип, заданный как '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

    Частота дискретизации аудио входа в Гц, заданная как положительная скалярная величина.

    Примечание

    The 'SampleRate' свойство применяется только тогда, когда 'InputType' установлено в 'audio'.

    Пример: ivs = ivectorSystem('InputType','audio','SampleRate',48000)

    Типы данных: single | double

    Применить обнаружение речи, заданное как true или false. С 'DetectSpeech' установлено на truei-векторная система извлекает признаки только из областей, где обнаружена речь.

    Примечание

    The DetectSpeech свойство применяется только тогда, когда InputType установлено в 'audio'.

    ivectorSystem использует detectSpeech функция для обнаружения областей речи.

    Пример: ivs = ivectorSystem('InputType','audio','DetectSpeech',true)

    Типы данных: logical | single | double

    Это свойство доступно только для чтения.

    Таблица, содержащая зарегистрированные метки, заданные как таблица. Имена строк таблицы соответствуют меткам, а имена столбцов соответствуют i-вектору шаблона, и количеству отдельных i-векторов, используемых для генерации i-вектора шаблона. Количество i-векторов, используемых для генерации i-вектора шаблона, может быть рассмотрено как мера доверия в шаблоне.

    • Использовать enroll для регистрации новых меток или обновления существующих.

    • Использовать unenroll для удаления меток из системы.

    Типы данных: 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.

    Введенный в R2021a