voiceActivityDetector

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

Описание

Система voiceActivityDetector object™ обнаруживает присутствие речи в аудио сегменте. Можно также использовать Системный объект voiceActivityDetector, чтобы вывести оценку шумового отклонения на интервал частоты.

Обнаружить присутствие речи:

  1. Создайте объект voiceActivityDetector и установите его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.

Создание

Синтаксис

VAD = voiceActivityDetector
VAD = voiceActivityDetector(Name,Value)

Описание

VAD = voiceActivityDetector создает Системный объект, VAD, который обнаруживает присутствие речи независимо через каждый входной канал.

VAD = voiceActivityDetector(Name,Value) наборы каждое свойство Name к заданному Value. Незаданные свойства имеют значения по умолчанию.

Пример: VAD = voiceActivityDetector('InputDomain','Frequency') создает Системный объект, VAD, который принимает вход частотного диапазона.

Свойства

развернуть все

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

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты (MATLAB).

Область входного сигнала, заданного как 'Time' или 'Frequency'.

Настраиваемый: нет

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

Длина БПФ, заданная как положительная скалярная величина. Значением по умолчанию является [], что означает, что FFTLength равен количеству строк входа.

Настраиваемый: нет

Зависимости

Чтобы включить это свойство, установите InputDomain на 'Time'.

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

Функция окна временного интервала, примененная прежде, чем вычислить преобразование Фурье дискретного времени (DTFT), заданное как 'Hann', 'Rectangular', 'Flat Top', 'Hamming', 'Chebyshev' или 'Kaiser'.

Функция окна разработана с помощью алгоритмов следующих функций:

Настраиваемый: нет

Зависимости

Чтобы включить это свойство, установите InputDomain на 'Time'.

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

Затухание бокового лепестка окна в дБ, заданном как действительная положительная скалярная величина.

Настраиваемый: нет

Зависимости

Чтобы включить это свойство, установите InputDomain на 'Time' и Окно к 'Chebyshev' или 'Kaiser'.

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

Вероятность перехода от кадра тишины к кадру речи, заданной как скаляр в области значений [0,1].

Настраиваемый: да

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

Вероятность перехода от кадра речи в кадре тишины, заданной как скаляр в области значений [0,1].

Настраиваемый: да

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

Использование

Синтаксис

[probability,noiseEstimate] = VAD(audioIn)

Описание

пример

[probability,noiseEstimate] = VAD(audioIn) применяет речевой детектор действия на вход, audioIn, и возвращает вероятность, что речь присутствует. Это также возвращает предполагаемую шумовую дисперсию на интервал частоты.

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

развернуть все

Аудиовход к речевому детектору действия, заданному как скаляр, вектор или матрица. Если audioIn является матрицей, столбцы обработаны как независимые звуковые каналы.

Размер аудиовхода заблокирован после первого вызова объекта voiceActivityDetector. Чтобы изменить размер audioIn, вызовите release на объекте.

Если InputDomain установлен в 'Time', audioIn должен быть с действительным знаком. Если InputDomain установлен в 'Frequency', audioIn может быть с действительным знаком или с комплексным знаком.

Типы данных: single | double
Поддержка комплексного числа: Да

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

развернуть все

Вероятность, что речь присутствует, возвратилась как скалярный или вектор - строка с одинаковым числом столбцов как audioIn.

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

Оценка шумового отклонения на интервал частоты, возвращенный как вектор-столбец или матрица с одинаковым числом столбцов как audioIn.

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

Функции объекта

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

развернуть все

cloneСоздайте объект дублированной системы
isLockedОпределите, используется ли Системный объект
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта
stepЗапустите алгоритм Системного объекта

Примеры

развернуть все

Использовать Системный объект voiceActivityDetector по умолчанию? обнаружить присутствие речи в сигнале передачи потокового аудио.

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

fileReader = dsp.AudioFileReader('Counting-16-44p1-mono-15secs.wav');
fs = fileReader.SampleRate;
fileReader.SamplesPerFrame = ceil(10e-3*fs);

Создайте Системный объект voiceActivityDetector по умолчанию, чтобы обнаружить присутствие речи в звуковом файле.

VAD = voiceActivityDetector;

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

scope = dsp.TimeScope( ...
    'NumInputPorts',2, ...
    'SampleRate',fs, ...
    'TimeSpan',3, ...
    'BufferLength',3*fs, ...
    'YLimits',[-1.5 1.5], ...
    'TimeSpanOverrunAction','Scroll', ...
    'ShowLegend',true, ...
    'ChannelNames',{'Audio','Probability of speech presence'});
deviceWriter = audioDeviceWriter('SampleRate',fs);

В цикле аудиопотока:

  1. Читайте из звукового файла.

  2. Вычислите вероятность речевого присутствия.

  3. Визуализируйте звуковой сигнал и речевую вероятность присутствия.

  4. Проигрывайте звуковой сигнал через свою звуковую карту.

while ~isDone(fileReader)
    audioIn = fileReader();
    probability = VAD(audioIn);
    scope(audioIn,probability*ones(fileReader.SamplesPerFrame,1))
    deviceWriter(audioIn);
end

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

Создать Системный объект dsp.AudioFileReader? считать речевой файл.

afr = dsp.AudioFileReader('Counting-16-44p1-mono-15secs.wav');
fs = afr.SampleRate;

Разделите аудио на блоки в кадры на 20 мс с 75%-м перекрытием между последовательными кадрами. Преобразуйте время кадра в секундах к выборкам. Определите размер транзитного участка (шаг новых выборок). В читателе звукового файла, набор выборки на кадр к размеру транзитного участка. Создайте объект dsp.AsyncBuffer по умолчанию справиться с наложением между аудио кадрами.

frameSize = ceil(20e-3*fs);
overlapSize = ceil(0.75*frameSize);
hopSize = frameSize - overlapSize;
afr.SamplesPerFrame = hopSize;

inputBuffer = dsp.AsyncBuffer('Capacity',frameSize);

Создайте Системный объект voiceActivityDetector. Задайте длину БПФ 1 024.

VAD = voiceActivityDetector('FFTLength',1024);

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

scope = dsp.TimeScope('NumInputPorts',2, ...
    'SampleRate',fs, ...
    'TimeSpan',3, ...
    'BufferLength',3*fs, ...
    'YLimits',[-1.5,1.5], ...
    'TimeSpanOverrunAction','Scroll', ...
    'ShowLegend',true, ...
    'ChannelNames',{'Audio','Probability of speech presence'});

player = audioDeviceWriter('SampleRate',fs);

Инициализируйте вектор, чтобы содержать значения вероятности.

pHold = ones(hopSize,1);

В цикле аудиопотока:

  1. Считайте ценность транзитного участка выборок от звукового файла и сохраните выборки в буфер.

  2. Считайте кадр из буфера с заданным перекрытием от предыдущего кадра.

  3. Вызовите речевой детектор действия, чтобы получить вероятность речи для кадра при анализе.

  4. Установите последний элемент вектора вероятности к новому решению вероятности. Визуализируйте аудио и речевую вероятность присутствия с помощью осциллографа времени.

  5. Проигрывайте аудио через свою звуковую карту.

  6. Установите вектор вероятности на новый результат для графического вывода в следующем цикле.

while ~isDone(afr)
    x = afr();
    n = write(inputBuffer,x);

    overlappedInput = read(inputBuffer,frameSize,overlapSize);

    p = VAD(overlappedInput);

    pHold(end) = p;
    scope(x,pHold)

    player(x);

    pHold(:) = p;
end

Выпустите player, если аудио закончило вопроизводить.

release(player)

Много методов выделения признаков работают с частотным диапазоном. Преобразование звукового сигнала к частотному диапазону только однажды эффективно. В этом примере вы преобразовываете сигнал передачи потокового аудио в частотный диапазон и канал, которые сигнализируют в речевой детектор действия. Если речь присутствует, функции mel-частоты cepstral коэффициентов (MFCC) извлечены от сигнала частотного диапазона использование cepstralFeatureExtractor System object™.

Создайте Системный объект dsp.AudioFileReader, чтобы читать из звукового файла.

fileReader = dsp.AudioFileReader('Counting-16-44p1-mono-15secs.wav');
fs = fileReader.SampleRate;

Обработайте аудио в кадрах на 30 мс с транзитным участком на 10 мс. Создайте объект dsp.AsyncBuffer по умолчанию управлять перекрытием между аудио кадрами.

samplesPerFrame = ceil(0.03*fs);
samplesPerHop = ceil(0.01*fs);
samplesPerOverlap = samplesPerFrame - samplesPerHop;

fileReader.SamplesPerFrame = samplesPerHop;
buffer = dsp.AsyncBuffer;

Создайте Системный объект voiceActivityDetector и Системный объект cepstralFeatureExtractor. Укажите, что они действуют в частотном диапазоне. Создайте dsp.SignalSink, чтобы регистрировать извлеченные функции cepstral.

VAD = voiceActivityDetector('InputDomain','Frequency');
cepFeatures = cepstralFeatureExtractor('InputDomain','Frequency','SampleRate',fs,'LogEnergy','Replace');
sink = dsp.SignalSink;

В цикле аудиопотока:

  1. Считайте один транзитный участок выборок от звукового файла и сохраните выборки в буфер.

  2. Считайте кадр из buffer с заданным перекрытием от предыдущего кадра.

  3. Вызовите речевой детектор действия, чтобы получить вероятность речи для кадра при анализе.

  4. Если кадр при анализе имеет вероятность речи, больше, чем 0,75, извлечение cepstral функции, и регистрируйте функции с помощью приемника сигнала. Если кадр при анализе имеет вероятность речи меньше чем 0,75, запишите вектор NaNs к приемнику.

threshold = 0.75;
nanVector = nan(1,13);
while ~isDone(fileReader)
    audioIn = fileReader();
    write(buffer,audioIn);
    
    overlappedAudio = read(buffer,samplesPerFrame,samplesPerOverlap);
    X = fft(overlappedAudio,2048);
    
    probabilityOfSpeech = VAD(X);
    if probabilityOfSpeech > threshold
        xFeatures = cepFeatures(X);
        sink(xFeatures')
    else
        sink(nanVector)
    end
end

Визуализируйте cepstral коэффициенты в зависимости от времени.

timeVector = linspace(0,15,size(sink.Buffer,1));
plot(timeVector,sink.Buffer)
xlabel('Time (s)')
ylabel('MFCC Amplitude')
legend('Log-Energy','c1','c2','c3','c4','c5','c6','c7','c8','c9','c10','c11','c12')

Читайте в целом речевом файле и определите основную частоту аудио с помощью функции pitch. Затем используйте voiceActivityDetector, чтобы удалить несоответствующую информацию о подаче, которая не соответствует динамику.

Читайте в звуковом файле и сопоставленной частоте дискретизации.

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

Задайте обнаружение подачи с помощью длины окна на 50 мс и перекрытия на 40 мс (транзитный участок на 10 мс). Укажите, что функция pitch ищет основную частоту в области значений 50-150 Гц и постобрабатывает результаты со средним фильтром. Постройте график результатов.

windowLength = round(0.05*fs);
overlapLength = round(0.04*fs);
hopLength = windowLength - overlapLength;

[f0,loc] = pitch(audio,fs, ...
    'WindowLength',windowLength, ...
    'OverlapLength',overlapLength, ...
    'Range',[50 150], ...
    'MedianFilterLength',3);

plot(loc/fs,f0)
ylabel('Fundamental Frequency (Hz)')
xlabel('Time (s)')

Создайте Систему dsp.AsyncBuffer object™, чтобы разделить звуковой сигнал на блоки в перекрытые кадры. Также создайте Систему voiceActivityDetector object™, чтобы определить, содержат ли кадры речь.

buffer = dsp.AsyncBuffer(numel(audio));
write(buffer,audio);
VAD = voiceActivityDetector;

В то время как существует достаточно выборок, чтобы скачкообразно двинуться, читайте из буфера и определите вероятность, что кадр содержит речь. Чтобы подражать интервалу решения во время функции pitch, первый кадр, считанный из буфера, не имеет никакого перекрытия.

n = 1;
probabilityVector = zeros(numel(loc),1);
while buffer.NumUnreadSamples >= hopLength
    if n==1
        x = read(buffer,windowLength);
    else
        x = read(buffer,windowLength,overlapLength);
    end
    probabilityVector(n) = VAD(x);
    n = n+1;
end

Используйте вектор вероятности, полный решимости voiceActivityDetector построить контур подачи для речевого файла, который соответствует областям речи.

validIdx = probabilityVector>0.99;
loc(~validIdx) = nan;
f0(~validIdx) = nan;
plot(loc/fs,f0)
ylabel('Fundamental Frequency (Hz)')
xlabel('Time (s)')

Алгоритмы

voiceActivityDetector реализует алгоритм, описанный в [1].

Если InputDomain задан как 'Time', входной сигнал является оконным и затем конвертированным к частотному диапазону согласно Window, SidelobeAttenuation и свойствам FFTLength. Если InputDomain задан как частота, вход принят, чтобы быть оконным преобразованием Фурье дискретного времени (DTFT) звукового сигнала. Сигнал затем преобразован в домен питания. Шумовое отклонение оценивается согласно [2]. Следующий и предшествующий ОСШ оценивается согласно формуле Минимальной среднеквадратичной погрешности (MMSE), описанной в [3]. Логарифмический тест отношения правдоподобия и Скрытая модель Маркова (HMM) - базирующаяся схема похмелья определяет вероятность, что текущий кадр содержит речь, согласно [1].

Ссылки

[1] Зон, Jongseo., Нэм Су Ким и Вонюн Сун. "Статистическое основанное на модели речевое обнаружение действия". Обработка сигналов обозначает буквами IEEE. Издание 6, № 1, 1999.

[2] Мартин, R. "Шумовая Степень Спектральная Оценка Плотности На основе Оптимального Сглаживания и Минимальной Статистики". Транзакции IEEE о Речи и Обработке аудиоданных. Издание 9, № 5, 2001, стр 504–512.

[3] Эфраим, Y. и Д. Мала. "Речевое Улучшение Используя Минимальное Короткое время Среднеквадратичной погрешности Спектральное Амплитудное Средство оценки". Транзакции IEEE на Акустике, Речи и Обработке сигналов. Издание 32, № 6, 1984, стр 1109–1121.

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

Смотрите также

Системные объекты

Блоки

Функции

Введенный в R2018a