exponenta event banner

voiceActivityDetector

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

Описание

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

Для обнаружения наличия речи:

  1. Создать voiceActivityDetector и задайте его свойства.

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

Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.

Создание

Описание

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

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

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

Свойства

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

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

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

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в 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) применяет на входе детектор речевой активности, audioInи возвращает вероятность присутствия речи. Он также возвращает оцененную дисперсию шума на частотный блок.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

release(obj)

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

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

Примеры

свернуть все

Использовать значение по умолчанию voiceActivityDetector Система object™ для обнаружения присутствия речи в потоковом звуковом сигнале.

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

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

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

VAD = voiceActivityDetector;

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

scope = timescope( ...
    'NumInputPorts',2, ...
    'SampleRate',fs, ...
    'TimeSpanSource','Property','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 Системный object™ для чтения речевого файла.

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 Системный объект. Укажите длину БПФ 1024.

VAD = voiceActivityDetector('FFTLength',1024);

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

scope = timescope('NumInputPorts',2, ...
    'SampleRate',fs, ...
    'TimeSpanSource','Property','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)

Многие методы извлечения признаков работают в частотной области. Преобразование звукового сигнала в частотную область только один раз является эффективным. В этом примере выполняется преобразование потокового аудиосигнала в частотную область и подача этого сигнала в детектор речевой активности. При наличии речи функции кепстральных коэффициентов (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 для регистрации извлеченных кепстральных функций.

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

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

  1. Прочитайте один прыжок образцов из аудиофайла и сохраните образцы в буфере.

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

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

  4. Если анализируемый кадр имеет вероятность речи более 0,75, извлекайте кепстральные признаки и регистрируйте признаки с помощью приемника сигнала. Если анализируемый кадр имеет вероятность речи менее 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

Визуализация кепстральных коэффициентов во времени.

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')

Figure contains an axes. The axes contains 13 objects of type line. These objects represent Log-Energy, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12.

Создать dsp.AudioFileReader объект для чтения в аудио покадровом режиме.

fileReader = dsp.AudioFileReader('singing-a-major.ogg');

Создать voiceActivityDetector обеспечение возможности обнаружения наличия голоса в потоковом аудио.

VAD = voiceActivityDetector;

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

f0 = [];
while ~isDone(fileReader)
    x = fileReader();
    
    if VAD(x) > 0.99
        decision = pitch(x,fileReader.SampleRate, ...
            "WindowLength",size(x,1), ...
            "OverlapLength",0, ...
            "Range",[200,340]);
    else
        decision = NaN;
    end
    f0 = [f0;decision];
end

Постройте график обнаруженного контура основного тона во времени.

t = linspace(0,(length(f0)*fileReader.SamplesPerFrame)/fileReader.SampleRate,length(f0));
plot(t,f0)
ylabel('Fundamental Frequency (Hz)')
xlabel('Time (s)')
grid on

Figure contains an axes. The axes contains an object of type line.

Алгоритмы

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

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

Ссылки

[1] Сон, Джонгсео, Нам Су Ким и Вонён Сен. «Обнаружение голосовой активности на основе статистической модели». Обработка сигналов письма IEEE. Том 6, № 1, 1999.

[2] Мартин, Р. «Оценка спектральной плотности мощности шума на основе оптимального сглаживания и минимальной статистики». Транзакции IEEE по обработке речи и звука. Том 9, № 5, 2001, стр. 504-512.

[3] Ефрем, Я. и Д. Мала. «Улучшение речи с использованием устройства оценки минимальной среднеквадратической ошибки с короткими временными спектральными амплитудами». Транзакции IEEE для обработки акустики, речи и сигналов. т. 32, № 6, 1984, с. 1109-1121.

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

.
Представлен в R2018a