exponenta event banner

writeall

Запись хранилища данных в файлы

Описание

пример

writeall(ADS,outputLocation) записывает данные из хранилища аудиоданных ADS в файлы, расположенные по адресу outputLocation.

пример

writeall(ADS,outputLocation,Name,Value) записывает данные с дополнительными параметрами, заданными одним или несколькими аргументами пары имя-значение.

Пример: writeall(ADS,outputLocation,'OutputFormat','flac') записывает данные в файлы FLAC.

Примеры

свернуть все

Создание audioDatastore объект, указывающий на аудио образцы WAV, включенные в Audio Toolbox™. audioDatastore объект содержит доступные только для чтения свойства, указывающие поддерживаемые форматы файлов, и формат вывода по умолчанию (WAV).

folder = fullfile(matlabroot,'toolbox','audio','samples');
ads = audioDatastore(folder,'FileExtensions','.wav')
ads = 
  audioDatastore with properties:

                       Files: {
                              ' .../build/matlab/toolbox/audio/samples/Ambiance-16-44p1-mono-12secs.wav';
                              ' .../matlab/toolbox/audio/samples/AudioArray-16-16-4channels-20secs.wav';
                              ' .../toolbox/audio/samples/ChurchImpulseResponse-16-44p1-mono-5secs.wav'
                               ... and 17 more
                              }
                     Folders: {
                              '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/audio/samples'
                              }
    AlternateFileSystemRoots: {}
              OutputDataType: 'double'
                      Labels: {}
      SupportedOutputFormats: ["wav"    "flac"    "ogg"    "mp4"    "m4a"]
         DefaultOutputFormat: "wav"

Запишите набор аудиоданных в текущую папку. Сохраните все файлы в формате по умолчанию (WAV).

outputLocation = pwd;
writeall(ads,outputLocation)

Папка, samplesи аудиофайлы, содержащиеся в папке, записаны в текущую папку.

dir samples
.                                             
..                                            
Ambiance-16-44p1-mono-12secs.wav              
AudioArray-16-16-4channels-20secs.wav         
ChurchImpulseResponse-16-44p1-mono-5secs.wav  
Click-16-44p1-mono-0.2secs.wav                
Counting-16-44p1-mono-15secs.wav              
Engine-16-44p1-stereo-20sec.wav               
FemaleSpeech-16-8-mono-3secs.wav              
Heli_16ch_ACN_SN3D.wav                        
JetAirplane-16-11p025-mono-16secs.wav         
Laughter-16-8-mono-4secs.wav                  
MainStreetOne-16-16-mono-12secs.wav           
NoisySpeech-16-22p5-mono-5secs.wav            
Rainbow-16-8-mono-114secs.wav                 
RainbowNoisy-16-8-mono-114secs.wav            
RockGuitar-16-44p1-stereo-72secs.wav          
SpeechDFT-16-8-mono-5secs.wav                 
TrainWhistle-16-44p1-mono-9secs.wav           
Turbine-16-44p1-mono-22secs.wav               
WashingMachine-16-44p1-stereo-10secs.wav      
multipleSounds-16-16-mono-18secs.wav          

Предварительно извлеченные элементы можно использовать для сокращения времени итерации при разработке системы машинного обучения или глубокого обучения. Также обычной практикой является использование предварительно извлеченных признаков для неконтролируемых задач обучения, таких как кластеризация подобий, и для задач индексирования на основе контента, таких как поиск музыкальной информации (MIR).

Создание audioDatastore объект, указывающий на аудиоотборники, включенные в Audio Toolbox™.

folder = fullfile(matlabroot,"toolbox","audio","samples");
ads = audioDatastore(folder)
ads = 
  audioDatastore with properties:

                       Files: {
                              ' .../build/matlab/toolbox/audio/samples/Ambiance-16-44p1-mono-12secs.wav';
                              ' .../matlab/toolbox/audio/samples/AudioArray-16-16-4channels-20secs.wav';
                              ' .../toolbox/audio/samples/ChurchImpulseResponse-16-44p1-mono-5secs.wav'
                               ... and 31 more
                              }
                     Folders: {
                              '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/audio/samples'
                              }
    AlternateFileSystemRoots: {}
              OutputDataType: 'double'
                      Labels: {}
      SupportedOutputFormats: ["wav"    "flac"    "ogg"    "mp4"    "m4a"]
         DefaultOutputFormat: "wav"

Создайте пользовательскую функцию записи, которая извлекает кепстральные коэффициенты частоты (mfcc) из звука и записывает их в MAT-файл. Определение функции находится в конце этого примера.

function myWriter(audioIn,info,~)
    fs = info.ReadInfo.SampleRate;

    % Extract MFCC
    [coeffs,delta,deltaDelta] = mfcc(audioIn,fs);

    % 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,"coeffs","delta","deltaDelta")
end

Определите расположение вывода для извлеченных элементов.

outputLocation = pwd;

Позвоните в writeall функции с помощью audioDatastore объект, расположение вывода и пользовательская функция записи. Также укажите суффикс _MFCC к именам файлов.

tic
writeall(ads,outputLocation,"WriteFcn",@myWriter,"FilenameSuffix","_MFCC")
fprintf("Data set creation completed (%0.0f seconds)\n",toc)
Data set creation completed (172 seconds)

Теперь создан набор данных, состоящий из MFCC для каждого аудиофайла.

fds = fileDatastore(pwd,"ReadFcn",@load,"FileExtensions",".mat","IncludeSubfolders",true)
fds = 
  FileDatastore with properties:

                       Files: {
                              ' .../audio-ex80013303/samples/Ambiance-16-44p1-mono-12secs_MFCC.mat';
                              ' .../audio-ex80013303/samples/AudioArray-16-16-4channels-20secs_MFCC.mat';
                              ' .../samples/ChurchImpulseResponse-16-44p1-mono-5secs_MFCC.mat'
                               ... and 31 more
                              }
                     Folders: {
                              ' .../BR2021ad_1655202_165362/mlx_to_docbook10/tp9d750e5a/audio-ex80013303'
                              }
                 UniformRead: 0
                    ReadMode: 'file'
                   BlockSize: Inf
                  PreviewFcn: @load
      SupportedOutputFormats: [1x16 string]
                     ReadFcn: @load
    AlternateFileSystemRoots: {}

Вспомогательная функция

function myWriter(audioIn,info,~)
    fs = info.ReadInfo.SampleRate;
    [coeffs,delta,deltaDelta] = mfcc(audioIn,fs);
    filename = strrep(info.SuggestedOutputName,".wav",".mat");
    save(filename,"coeffs","delta","deltaDelta")
end

Создание audioDatastore объект, указывающий на аудиоотборники, включенные в Audio Toolbox™.

folder = fullfile(matlabroot,"toolbox","audio","samples");
ads = audioDatastore(folder);

Создание audioDataAugmenter объект, который выдает два увеличения для каждого входного сигнала.

augmenter = audioDataAugmenter("NumAugmentations",2);

Определите пользовательскую функцию записи, которая применяет audioDataAugmenter объект в аудиофайл и записывает полученные новые сигналы в отдельные файлы. Определение функции находится в конце этого примера.

function myWriter(audioIn,info,fileExtension,varargin)
    % create convenient variables for the augmenter and sample rate
    augmenter = varargin{1};
    fs = info.ReadInfo.SampleRate;

    % perform augmentation
    augmentations = augment(augmenter,audioIn,fs);
    
    for ii = 1:augmenter.NumAugmentations
        x = augmentations.Audio{ii};

        % protect against clipping
        if any(x<-1|x>1)
            [S,L] = bounds(x);
            x = x/max(abs([S,L]));
        end

        % update the audio file name to include the augmentation number
        filename = insertBefore(info.SuggestedOutputName,("."+fileExtension),string(ii));

        % write the audio file
        audiowrite(filename,x,fs)
    end
end

Позвоните в writeall для создания нового набора дополненных данных. Для ускорения обработки установите UseParallel кому true.

outputLocation = pwd;
writeall(ads,outputLocation,"FilenameSuffix","_Aug","UseParallel",true,"WriteFcn",@(x,y,z,a)myWriter(x,y,z,augmenter))
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).

Создайте новое хранилище данных, указывающее на набор дополненных аудиоданных.

adsAug = audioDatastore(outputLocation,"IncludeSubfolders",true)
adsAug = 
  audioDatastore with properties:

                       Files: {
                              ' ...\audio-ex06587246\samples\Ambiance-16-44p1-mono-12secs_Aug1.wav';
                              ' ...\audio-ex06587246\samples\Ambiance-16-44p1-mono-12secs_Aug2.wav';
                              ' ...\audio-ex06587246\samples\AudioArray-16-16-4channels-20secs_Aug1.wav'
                               ... and 55 more
                              }
                     Folders: {
                              ' ...\vmgr$\home07\bhemmat\Documents\MATLAB\Examples\audio-ex06587246'
                              }
    AlternateFileSystemRoots: {}
              OutputDataType: 'double'
                      Labels: {}
      SupportedOutputFormats: ["wav"    "flac"    "ogg"    "mp4"    "m4a"]
         DefaultOutputFormat: "wav"

Вспомогательная функция

function myWriter(audioIn,info,fileExtension,varargin)
    augmenter = varargin{1};
    fs = info.ReadInfo.SampleRate;
    augmentations = augment(augmenter,audioIn,fs);
    for ii = 1:augmenter.NumAugmentations
        x = augmentations.Audio{ii};
        if any(x<-1|x>1)
            x = x./max(abs(x));
        end
        filename = insertBefore(info.SuggestedOutputName,("."+fileExtension),string(ii));
        audiowrite(filename,x,fs)
    end
end

Используйте detectSpeech и writeall создание нового набора аудиоданных, содержащего изолированные речевые сегменты.

Создание audioDatastore объект, указывающий на аудиоотборники, включенные в этот пример.

ads = audioDatastore(pwd)
ads = 
  audioDatastore with properties:

                       Files: {
                              ' .../tp32cd8b50/audio-ex78151030/KeywordSpeech-16-16-mono-34secs.flac';
                              ' .../mlx_to_docbook9/tp32cd8b50/audio-ex78151030/Plosives.wav';
                              ' .../mlx_to_docbook9/tp32cd8b50/audio-ex78151030/Sibilance.wav'
                              }
                     Folders: {
                              '/tmp/BR2021ad_1657350_5204/mlx_to_docbook9/tp32cd8b50/audio-ex78151030'
                              }
    AlternateFileSystemRoots: {}
              OutputDataType: 'double'
                      Labels: {}
      SupportedOutputFormats: ["wav"    "flac"    "ogg"    "mp4"    "m4a"]
         DefaultOutputFormat: "wav"

Определите пользовательскую функцию записи, которая сначала определяет области речи в звуковых сигналах, считанных из хранилища данных, а затем записывает отдельные области речи в отдельные файлы. Добавьте номер области к именам файлов. Определение функции находится в конце этого примера.

function myWriter(audioIn,info,fileExtension)
    fs = info.ReadInfo.SampleRate;

    % Get indices corresponding to regions of speech
    idx = detectSpeech(audioIn,fs);

    % For each region of speech
    for ii = 1:size(idx,1)
        x = audioIn(idx(ii,1):idx(ii,2),:);
         
        % Create a unique file name
        filename = insertBefore(info.SuggestedOutputName,("."+fileExtension),string(ii));

        % Write the detected region of speech
        audiowrite(filename,x,fs)
    end
end

Позвоните в writeall функция, использующая пользовательскую функцию записи для создания нового набора данных, который состоит из изолированных речевых сегментов. Создание папки с именем segmented во временном каталоге, а затем запишите данные в эту папку.

outputLocation = fullfile(tempdir,"segmented");
writeall(ads,outputLocation,'WriteFcn',@myWriter)

Создание нового audioDatastore объект, указывающий на сегментированный набор данных.

adsSegmented = audioDatastore(outputLocation,"IncludeSubfolders",true)
adsSegmented = 
  audioDatastore with properties:

                       Files: {
                              ' .../segmented/audio-ex78151030/KeywordSpeech-16-16-mono-34secs1.wav';
                              ' .../segmented/audio-ex78151030/KeywordSpeech-16-16-mono-34secs10.wav';
                              ' .../segmented/audio-ex78151030/KeywordSpeech-16-16-mono-34secs11.wav'
                               ... and 24 more
                              }
                     Folders: {
                              '/tmp/BR2021ad_1657350_5204/mlx_to_docbook9/segmented'
                              }
    AlternateFileSystemRoots: {}
              OutputDataType: 'double'
                      Labels: {}
      SupportedOutputFormats: ["wav"    "flac"    "ogg"    "mp4"    "m4a"]
         DefaultOutputFormat: "wav"

Прочитайте образец из хранилища данных и прослушайте его.

[audioIn,adsInfo] = read(adsSegmented);
sound(audioIn,adsInfo.SampleRate)

Вспомогательная функция

function myWriter(audioIn,info,fileExtension)
    fs = info.ReadInfo.SampleRate;
    idx = detectSpeech(audioIn,fs);
    for ii = 1:size(idx,1)
        x = audioIn(idx(ii,1):idx(ii,2),:);
        filename = insertBefore(info.SuggestedOutputName,("."+fileExtension),string(ii));
        audiowrite(filename,x,fs)
    end
end

Наборы аудиоданных, особенно наборы аудиоданных с открытым исходным кодом, могут иметь противоречивые частоты дискретизации, количество каналов или длительность. Они также могут содержать мусорные данные, например клипы, помеченные как содержащие речь, но содержащие молчание.

Это часто является первым шагом в машинном обучении и глубоких процессах обучения для очистки набора аудиоданных. Это особенно важно для наборов данных проверки и тестирования. Обычные типы очистки включают в себя повторную выборку, преобразование в моно или стерео, обрезку или увеличение длительности клипов до согласованной длины, удаление периодов молчания, удаление фонового шума или нормализацию усиления.

В этом примере вы очищаете набор аудиоданных так, чтобы все файлы имели частоту дискретизации 16 кГц, были моно, находились в формате FLAC и нормализовались так, чтобы максимальная абсолютная величина сигнала была равна 1.

Создание audioDatastore объект, указывающий на аудиоотборники, включенные в Audio Toolbox™.

folder = fullfile(matlabroot,"toolbox","audio","samples");
ads = audioDatastore(folder);

Определите функцию для применения последовательности операций к аудиоданным. Определение функции находится в конце этого примера.

function [audioOut,adsInfo] = myTransform(audioIn,adsInfo)
    fs = adsInfo.SampleRate;
    desiredFs = 16e3;
    
    % Convert to mono
    x = mean(audioIn,2);
    
    % Resample to 16 kHz
    y = resample(x,desiredFs,fs);
    adsInfo.SampleRate = desiredFs;
    
    % Normalize so that the max absolute value of a signal is 1 
    audioOut = y/max(abs(y));
end

Создайте объект хранилища данных преобразования, применяющий операции очистки.

adsTransform = transform(ads,@myTransform,"IncludeInfo",true);

Звонить writeall на объекте хранилища данных преобразования для создания чистого набора данных. Укажите формат как FLAC. Запишите набор данных в текущую папку.

outputLocation = pwd;
writeall(adsTransform,outputLocation,"OutputFormat","flac")

Создайте новый объект хранилища данных, который указывает на чистый набор данных.

adsClean = audioDatastore(outputLocation,"IncludeSubfolders",true)
adsClean = 
  audioDatastore with properties:

                       Files: {
                              ' ...\Examples\audio-ex59507606\samples\Ambiance-16-44p1-mono-12secs.flac';
                              ' ...\audio-ex59507606\samples\AudioArray-16-16-4channels-20secs.flac';
                              ' ...\samples\ChurchImpulseResponse-16-44p1-mono-5secs.flac'
                               ... and 26 more
                              }
                     Folders: {
                              ' ...\vmgr$\home07\bhemmat\Documents\MATLAB\Examples\audio-ex59507606'
                              }
    AlternateFileSystemRoots: {}
              OutputDataType: 'double'
                      Labels: {}
      SupportedOutputFormats: ["wav"    "flac"    "ogg"    "mp4"    "m4a"]
         DefaultOutputFormat: "wav"

Вспомогательная функция

function [audioOut,adsInfo] = myTransform(audioIn,adsInfo)
    fs = adsInfo.SampleRate;
    desiredFs = 16e3;
    x = mean(audioIn,2);
    y = resample(x,desiredFs,fs);
    adsInfo.SampleRate = desiredFs;
    audioOut = y/max(abs(y));
end

Входные аргументы

свернуть все

Хранилище аудиоданных, указанное как audioDatastore объект.

Расположение папки для записи данных, указанное как символьный вектор или строка. Можно указать полный или относительный путь в outputLocation.

Пример: outputLocation = '../../dir/data'

Пример: outputLocation = 'C:\Users\MyName\Desktop'

Типы данных: char | string

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: 'FolderLayout','flatten'

Компоновка файлов в папке вывода, указанная как разделенная запятыми пара, состоящая из 'FolderLayout' и 'duplicate' или 'flatten'.

  • 'duplicate' - Реплицируйте структуру папок данных, на которые указывает хранилище аудиоданных. Укажите FolderLayout как 'duplicate' для поддержания соответствия между наборами входных и выходных данных.

  • 'flatten' -- Запишите все файлы из входных данных в указанную папку вывода без промежуточных папок.

Типы данных: char | string

Формат выходного файла, указанный как разделенная запятыми пара, состоящая из 'OutputFormat' и 'wav', 'flac', 'ogg', 'mp4', или 'm4a'.

Типы данных: char | string

Количество выходных битов на выборку, указанное как разделенная запятыми пара, состоящая из 'BitsPerSample' и целое число.

Зависимости

Чтобы включить этот аргумент пары имя-значение, установите OutputFormat кому 'wav' или 'flac'.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Количество килобит в секунду (кбит/с), используемых для сжатия аудиофайлов, указанное как пара, разделенная запятыми, состоящая из 'BitRate' и целое число. В Windows ® 7 или более поздней версии допустимыми являются только следующие значения:96, 128, 160, и 192.

В общем, больше BitRate значение приводит к повышению качества сжатия.

Зависимости

Чтобы включить этот аргумент пары имя-значение, установите OutputFormat кому 'm4a' или 'mp4'.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Префикс, добавленный к имени файла, указанный как разделенная запятыми пара, состоящая из 'FilenamePrefix' и символьный вектор или строку.

writeall добавляет указанный префикс к именам выходных файлов. Например, следующий код добавляет текущую дату в качестве префикса ко всем именам выходных файлов:

prefixText = string(datetime('today'));
writeall(ADS,'C:\myFolder','FilenamePrefix',prefixText);

Типы данных: char | string

Суффикс, добавленный к имени файла, указанный как разделенная запятыми пара, состоящая из 'FilenameSuffix' и символьный вектор или строку. Суффикс имени файла применяется перед расширением файла.

writeall функция добавляет указанный суффикс к именам выходных файлов. Например, следующий код добавляет описательный текст 'clean' в качестве суффикса ко всем именам выходных файлов:

writeall(ADS,'C:\myFolder','FilenameSuffix','clean');

Типы данных: char | string

Индикатор для параллельной записи, определяемый как разделенная запятыми пара, состоящая из 'UseParallel' и false или true.

По умолчанию writeall функция записывает в последовательном формате. Если установить UseParallel кому true, то writeall функция параллельно записывает выходные файлы.

Примечание

Для параллельной записи требуется Toolbox™ Parallel Computing.

Типы данных: logical

Пользовательская функция записи, заданная как разделенная запятыми пара, состоящая из 'WriteFcn' и дескриптор функции. Указанная функция отвечает за создание выходных файлов. Вы можете использовать WriteFcn для записи данных в различных форматах, даже если writeall не поддерживает формат вывода напрямую.

Подпись функции

Для пользовательской функции записи требуется три входных аргумента: audioIn, info, и suggestedOutputType. Функция также может принимать дополнительные входные данные, такие как пары имя-значение, после первых трех требуемых входных данных.

function myWriter(audioIn,info,suggestedOutputType,varargin)

  • audioIn содержит данные, считанные из хранилища входных данных ADS.

  • info является объектом типа matlab.io.datastore.WriteInfo с полями, перечисленными в таблице.

    ОбластьОписаниеНапечатать
    ReadInfoВторой выход read способ.struct
    SuggestedOutputNameПолное, глобально уникальное имя файла, отвечающее требованиям к расположению и именованию.string
    LocationУказанное outputLocation передано в writeall.string

  • suggestedOutputType - Рекомендуемый тип выходного файла.

Пример функции

Простая функция записи, которая выполняет повторную выборку звука до 44,1 кГц перед записью.

function myWriter(data,info,~)
  fs = info.ReadInfo.SampleRate;
  desiredFs = 44.1e3;
  data = resample(data,desiredFs,fs);
  audiowrite(writeInfo.SuggestedOutputName,data,desiredFs);
end
Использовать myWriter как в writeall используйте следующие команды:
ads = audioDatastore(location);
outputLocation = 'C:/tmp/MyData';
writeall(ads,outputLocation,'WriteFcn',@myWriter)

Типы данных: function_handle

См. также

Представлен в R2020a