detectSpeech

Обнаружьте контуры речи в звуковом сигнале

Описание

пример

idx = detectSpeech(audioIn,fs) возвращает индексы audioIn это соответствует контурам речевых сигналов.

пример

idx = detectSpeech(audioIn,fs,Name,Value) задает опции с помощью одного или нескольких Name,Value парные аргументы.

Пример: detectSpeech(audioIn,fs,'Window',hann(512,'periodic'),'OverlapLength',256) обнаруживает речь с помощью периодического окна Hann с 512 точками с перекрытием с 256 точками.

пример

[idx,thresholds] = detectSpeech(___) также возвращается, пороги использовались для расчета контуров речи.

пример

detectSpeech(___) без выходных аргументов отображает график обнаруженных речевых областей во входном сигнале.

Примеры

свернуть все

Читайте в звуковом сигнале. Отсеките звуковой сигнал к 20 секундам.

[audioIn,fs] = audioread('Rainbow-16-8-mono-114secs.wav');
audioIn = audioIn(1:20*fs);

Вызовите detectSpeech. Не задайте выходные аргументы, чтобы отобразить график обнаруженных речевых областей.

detectSpeech(audioIn,fs);

detectSpeech функционируйте использует алгоритм пороговой обработки на основе энергии и спектрального распространения на аналитическую систему координат. Можно изменить Window, OverlapLength, и MergeDistance подстраивать алгоритм для ваших определенных потребностей.

windowDuration = 0.074; % seconds
numWindowSamples = вокруг (windowDuration*fs);
победите = hamming (numWindowSamples,'periodic');

percentOverlap = 35;
перекройтесь = раунд (numWindowSamples*percentOverlap/100);

mergeDuration = 0.44;
mergeDist = вокруг (mergeDuration*fs);

detectSpeech (audioIn, фс,"Window", победите,"OverlapLength", перекройтесь,"MergeDistance", mergeDist)

Читайте в звуковом файле, содержащем речь. Разделите звуковой сигнал в первую половину и вторую половину.

[audioIn,fs] = audioread('Counting-16-44p1-mono-15secs.wav');
firstHalf = audioIn(1:floor(numel(audioIn)/2));
secondHalf = audioIn(numel(firstHalf):end);

Вызовите detectSpeech на первой половине звукового сигнала. Задайте два выходных аргумента, чтобы возвратить индексы, соответствующие областям обнаруженной речи и порогам, используемым для решения.

[speechIndices,thresholds] = detectSpeech(firstHalf,fs);

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

detectSpeech(secondHalf,fs,'Thresholds',thresholds)

Работа с большими наборами данных

Многократное использование речевых порогов обнаружения обеспечивает значительный вычислительный КПД, когда вы работаете с большими наборами данных, или когда вы развертываете глубокое обучение или конвейер машинного обучения для вывода в реальном времени. Загрузите и извлеките набор данных [1].

url = 'https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gz';

downloadFolder = tempdir;
datasetFolder = fullfile(downloadFolder,'google_speech');

if ~exist(datasetFolder,'dir')
    disp('Downloading data set (1.9 GB) ...')
    untar(url,datasetFolder)
end

Создайте аудио datastore, чтобы указать на записи. Используйте имена папок в качестве меток.

ads = audioDatastore(datasetFolder,'IncludeSubfolders',true,'LabelSource','foldernames');

Уменьшайте набор данных на 95% в целях этого примера.

ads = splitEachLabel(ads,0.05,'Exclude','_background_noise');

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

[adsTrain,adsTest] = splitEachLabel(ads,0.8);

Вычислите средние пороги по обучающему набору данных.

thresholds = zeros(numel(adsTrain.Files),2);
for ii = 1:numel(adsTrain.Files)
    [audioIn,adsInfo] = read(adsTrain);
    [~,thresholds(ii,:)] = detectSpeech(audioIn,adsInfo.SampleRate);
end
thresholdAverage = mean(thresholds,1);

Используйте предварительно вычисленные пороги, чтобы обнаружить речевые области на файлах от набора тестовых данных. Постройте обнаруженную область для трех файлов.

[audioIn,adsInfo] = read(adsTest);
detectSpeech(audioIn,adsInfo.SampleRate,'Thresholds',thresholdAverage);

[audioIn,adsInfo] = read(adsTest);
detectSpeech(audioIn,adsInfo.SampleRate,'Thresholds',thresholdAverage);

[audioIn,adsInfo] = read(adsTest);
detectSpeech(audioIn,adsInfo.SampleRate,'Thresholds',thresholdAverage);

Ссылки

[1] Начальник, Пит. "Речевые команды: общедоступный набор данных для распознавания речи отдельного слова". Распределенный TensorFlow. Приписывание Creative Commons 4.0 лицензии.

Читайте в звуковом файле и слушайте его. Постройте spectrogram.

[audioIn,fs] = audioread('Counting-16-44p1-mono-15secs.wav');

sound(audioIn,fs)

spectrogram(audioIn,hann(1024,'periodic'),512,1024,fs,'yaxis')

Для приложений машинного обучения вы часто хотите извлечь функции из звукового сигнала. Вызовите spectralEntropy функция на звуковом сигнале, затем постройте histogram отобразить распределение спектральной энтропии.

entropy = spectralEntropy(audioIn,fs);

numBins = 40;
histogram(entropy,numBins,'Normalization','probability')
title('Spectral Entropy of Audio Signal')

В зависимости от вашего приложения вы можете хотеть извлечь спектральную энтропию только из областей речи. Получившиеся статистические данные являются более характеристическими для динамика и менее характеристическими для канала. Вызовите detectSpeech на звуковом сигнале и затем создают новый сигнал, который содержит только области обнаруженной речи.

speechIndices = detectSpeech(audioIn,fs);
speechSignal = [];
for ii = 1:size(speechIndices,1)
    speechSignal = [speechSignal;audioIn(speechIndices(ii,1):speechIndices(ii,2))];
end

Слушайте речь, сигнализируют и строят спектрограмму.

sound(speechSignal,fs)

spectrogram(speechSignal,hann(1024,'periodic'),512,1024,fs,'yaxis')

Вызовите spectralEntropy функция на речевом сигнале и затем строит histogram отобразить распределение спектральной энтропии.

entropy = spectralEntropy(speechSignal,fs);

histogram(entropy,numBins,'Normalization','probability')
title('Spectral Entropy of Speech Signal')

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

свернуть все

Аудиовход в виде вектор-столбца.

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

Частота дискретизации в Гц в виде скаляра.

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

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

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

Пример: detectSpeech(audioIn,fs,'MergeDistance',100)

Окно, примененное во временном интервале в виде разделенной запятой пары, состоящей из 'Window'и вектор действительных чисел. Число элементов в векторе должно быть в области значений [2, размер (audioIn,1)]. Число элементов в векторе должно также быть больше OverlapLength.

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

Количество выборок, перекрывающихся между смежными окнами в виде разделенной запятой пары, состоящей из 'OverlapLength'и целое число в области значений [0, размер (Window,1)).

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

Количество выборок, по которым можно объединить положительные речевые решения обнаружения в виде разделенной запятой пары, состоящей из 'MergeDistance'и неотрицательный скаляр.

Примечание

Разрешение для речевого обнаружения дано длиной транзитного участка, где длина транзитного участка равна numel (Window) − OverlapLength.

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

Пороги для решения в виде разделенной запятой пары, состоящей из 'Thresholds'и двухэлементный вектор.

  • Если вы не задаете Thresholds, detectSpeech функция выводит пороги при помощи гистограмм функций, вычисленных по текущему входному кадру.

  • Если вы задаете Thresholds, detectSpeech функционируйте пропускает деривацию новых порогов решения. Многократное использование речевых порогов решения обеспечивает значительный вычислительный КПД, когда вы работаете с большими наборами данных, или когда вы развертываете глубокое обучение или конвейер машинного обучения для вывода в реальном времени.

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

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

свернуть все

Индексы начала и конца речевых областей, возвращенных как N-by-2 матрица. N соответствует количеству отдельных речевых обнаруженных областей. Первый столбец соответствует, чтобы запустить индексы речевых областей, и второй столбец соответствует индексам конца речевых областей.

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

Пороги используются для решения, возвращенного как двухэлементный вектор. Пороги находятся в порядке [Energy Threshold, Spectral Spread Threshold].

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

Алгоритмы

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

Sequence of stages in algorithm.

  1. Звуковой сигнал преобразован в представление частоты времени с помощью заданного Window и OverlapLength.

  2. Краткосрочная энергия и спектральное распространение вычисляются для каждой системы координат. Спектральное распространение вычисляется согласно spectralSpread.

  3. Гистограммы создаются и для краткосрочной энергии и для спектральных распределений распространения.

  4. Для каждой гистограммы порог определяется согласно T=W×M1+M2W+1, где M 1 и M 2 является первыми и вторыми локальными максимумами, соответственно. W установлен в 5.

  5. И спектральное распространение и краткосрочная энергия сглаживаются через время путем прохождения через последовательные движущиеся средние фильтры с пятью элементами.

  6. Маски создаются путем сравнения краткосрочной энергии и спектрального распространения с их соответствующими порогами. Чтобы объявить систему координат как содержащий речь, функция должна быть выше ее порога.

  7. Маски объединены. Для системы координат, которая будет объявлена как речь, и краткосрочная энергия и спектральное распространение должны быть выше их соответствующих порогов.

  8. Области, объявленные как речь, объединены, если расстояние между ними меньше MergeDistance.

Ссылки

[1] Джиэннэкопулос, Теодорос. "Метод для удаления тишины и сегментации речевых сигналов, реализованных в MATLAB", (Университет Афин, Афин, 2009).

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Введенный в R2020a