writeall

Запись datastore в файлы

Описание

пример

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

пример

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

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

Примеры

свернуть все

Создайте audioDatastore объект, который точками к аудио выборок WAV, включенным в Audio Toolbox™. The 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"

Создайте пользовательскую функцию записи, которая извлекает mel frequency cepstral коэффициенты (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).

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

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"

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

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"

Прочтите выборку из datastore и прослушайте его.

[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

Создайте объект transform datastore, который применяет операции очистки.

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

Функции writeall на объекте transform datastore, чтобы создать чистый набор данных. Задайте формат следующим FLAC. Запишите набор данных в текущую папку.

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

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

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

Входные параметры

свернуть все

Audio datastore, заданный как 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' - Реплицируйте структуру папки данных, на которые указывает audio datastore. Задайте 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 функция запишет выходные файлы параллельно.

Примечание

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

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

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

Сигнатура функции

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

function myWriter(audioIn,info,suggestedOutputType,varargin)

  • audioIn содержит данные, считанные из входного datastore 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 function, использовать следующие команды:
ads = audioDatastore(location);
outputLocation = 'C:/tmp/MyData';
writeall(ads,outputLocation,'WriteFcn',@myWriter)

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

См. также

Введенный в R2020a