Мозг и когнитивные функции

пятница, 11 января 2013 г.

Распознавание речи и получение индивидуальных особенностей голоса говорящего в Sphinx 4

Речь каждого человека неповторима и имеет целый ряд индивидуальных особенностей. Голос столь же уникален, как отпечатки пальцев или строение сетчатки глаза. По голосу судят о характере человека. Известно, что общее впечатление о человеке на 55% зависит от мимики, на 38% - от голоса и только на 7% - от того, что этот человек говорит.

Индивидуальные особенности голоса можно использовать в не только в задачах идентификации, но и для определения настроения говорящего, борьбы с телефонными мошенниками, ... Круг прикладных задач этим не ограничивается. Например, существует зависимость между частотами среднего тона и гендерной принадлежностью - мужчины говорят на частоте 85-200Hz, а женщины — 160-340Hz. Включите фантазию, уважаемые читатели, и вы придумаете множество прикладных сценариев, где выделение индивидуальных особенностей говорящего будет необходимо.

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


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


Индивидуальные особенности голоса


Звук как акустическая единица включает в себя признаки высоты, силы, тембра и длительности. Звуки и интонация состоят из одних и тех же акустических компонентов. Это объясняется тем, что образование звуков и интонации — единый артикуляционно-акустический процесс. Более подробно, о физиологии голоса можно прочесть в специализированной литературе (ссылки в конце статьи).

Высота звука

Высота звука — количество колебаний голосовых связок. Оно измеряется в герцах в секунду: чем больше герц в секунду, тем выше звук.

Сила звука

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

Тембр

Тембр — совокупность основного тона и обертонов. Обертоны (разно-частотные колебания частиц воздуха) образуются в ротовой полости. Их различие зависит от формы я объема рта, меняющихся во время артикуляции звуков.

Тон


Используется этот термин в разных науках. В физике — звук, порождаемый периодическим колебанием воздуха; в музыке — музыкальный звук определенной высоты; в живописи — оттенок цвета или светотени; в медицине — звук работающего сердца, его клапанов.
Когда говорят о тоне звуков речи, то имеют в виду высоту гласных, сонорных и звонких шумных согласных. Тон формируется при прохождении воздуха через глотку, голосовые связки, полости рта и носа. В результате колебания голосовых связок возникает основной тон звука, важнейший компонент речевой интонаций.


Длительность звука

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


Алгоритм распознавания речи

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

1. Предварительная обработка  

Преобразовываем аудио поток, усиливая уровень сигнала. Снижаем битрейт и делаем звук одноканальным (моно). Эти преобразования необходимы для снижения вычислительной сложности задачи.

2. Высокочастотная фильтрация

Пропускаем голос через фильтр высоких частот, который компенсирует затухание в аудио-данных. Речевые сигналы имеют затухание (снижение интенсивности сигнала) 20dB/dec.
В результате, увеличивается относительная величина более высоких частотах по отношению к низким частотам.

Y[i] = X[i] - (X[i-1] * preemphasisFactor)
где:
i - время;
preemphasisFactor - фактор предискажений, равен значению близкому к 0.97;

3. Фрагментирование 

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


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

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

Оконная функция W (N) , длиной N (размер окна), определяется по следующей формуле:

W(n) = (1-a) - (a * cos((2 * Math.PI * n)/(N - 1)))

Это широко известное "альфа" значение. Некоторые значения альфа имеют специальные названия, поскольку они используются очень часто. Например: значение 0,46 для альфа именуется окном Хэмминга.



Размер окна 25,625ms для частоты дискретизации 16kHz, 410 отсчетов в каждом окне (кадре). Обратите внимание, что для 8kHz размер окна будет отличаться.

4. Разложение сигнала на частотные составляющие и вычисление спектра мощности 

К каждому полученному окну, применяем дискретное преобразование Фурье (FFT). Преобразование Фурье позволяет разложить сигнал на его частотные компоненты.

Пример оригинального сигнала:


его спектрограмма: 



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

5. Переход к Мел шкале 

Вычисляем мел-кепстральные коэффициенты каждого окна данных, полученных на предыдущем шаге. Фильтруем спектр мощности.

Общая модель для отношений между частотами в Мел и линейной шкалой выражается как:

melFrequency = 2595 * log(1 + linearFrequency/700)

Минимальная и максимальная частоты определяют диапазон частот, "натянутых" на фильтры.


Эти частоты зависят от параметров аудио сигнала (частоты дискретизации). На начальном этапе, мы преобразовали голос к качеству "телефонного канала". Телефонному каналу соответствует полосовой фильтр с частотами среза около 300Hz .. 3700Hz. Для чистой речи, минимальная частота должна быть выше 100Hz. Используя минимальную частоту выше 50/60Hz, мы избавляемся от шумов (гула) наведенных питанием переменного тока.

Максимальная частота должна быть ниже, чем частота Найквиста (равна половине частоты дискретизации). Кроме того, не так много полезной информации находится в диапазоне частот выше 6800Hz. Для очень шумных каналов, ограничившись максимальной частотой около 5000Hz можно отрезать большую часть шума.

Для 8000Hz аудио данных используются: 31, 200Hz и 3500Hz значения для количества фильтров, минимальной и максимальной частоты соответственно.

6. "Спектр спектра" 

На предыдущем шаге, мы получили Мел-частотные спектральные коэффициенты для каждого окна данных. Возводим их в квадрат и логарифмируем. Теперь получаем из них кепстральные, или «спектр спектра». Для этого используется дискретное косинусное преобразование.

7. Вычисление кепстрального среднего

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

8. Добавление дельта-характеристик 

Наполняем вектор признаков временными изменениями. Для этого, помимо самих кепстральных коэффициентов добавляются их первые и вторые производные (дельта-характеристики).

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

9. Поиск по словарю 

Финальный этап распознавания. Полученные вектора признаков для фонем, дифтонгов сравниваем с паттернами, заданными в акустической модели языка и получаем слоги. Из полученных слогов, на основе словаря (лингвистической модели), составляем слова.

Извлечение индивидуальных особенностей голоса

В описанном выше алгоритме распознавания, на шаге 5 был получен вектор признаков для каждого фрагмента (окна). Индивидуальные особенности речи говорящего, состоят из этих самых мел-кепстральных коэффициентов, только обработанных соответствующим образом.


На шаге 6. мы получили тот самый вектор признаков, кодирующий индивидуальные особенности речи говорящего. При правильном "приготовлении" (конфигурации) CMU Sphinx 4 всё сделает сам, нам останется только "добраться" до этих векторов признаков. Для этого напишем свое расширение BaseDataProcessor и добавим его в стек фронтенда. 

Java код накопителя векторов признаков:

public class SpeakerVoiceFeaturesCollector extends BaseDataProcessor {

    public SpeakerVoiceFeaturesCollector() {}

    @Override
    public void newProperties(PropertySheet ps) throws PropertyException {
        super.newProperties(ps);
    }

    @Override
    public void initialize() {
        super.initialize();
    }

    private DoubleData process(DoubleData input) 
                                  throws IllegalArgumentException {
        double[] in = input.getValues();
        sampleRate = input.getSampleRate();
        
        double timeSec = ((double)input.getFirstSampleNumber())/sampleRate;
        long timeMSec = Math.round(timeSec*1000);
        
        // !!!!!!!
        // Вектор индивидуальных особенностей говорящего 
        // !!!!!!!
        double[] dat = new double[in.length-1];
        System.arraycopy(in,1,dat,0,dat.length);
        // !!!!!!!
        // [TODO] Используем эти знания в наших целях...
        // !!!!!!!

        DoubleData outputResult = new DoubleData(in, sampleRate,
                          input.getCollectTime(), input.getFirstSampleNumber());
        return outputResult;
    }


    @Override
    public Data getData() throws DataProcessingException {
        Data input = getPredecessor().getData();
        getTimer().start();
        if (input != null) {
            if (input instanceof DoubleData) {
                input = process((DoubleData) input);
            }
        }
        getTimer().stop();
        return input;
    }
}

Изменения в конфигурации:

...
    <component name="mfcFrontEnd" type="edu.cmu.sphinx.frontend.FrontEnd">
        <propertylist name="pipeline">
            <item>streamDataSource</item>
            <item>premphasizer</item>
            <item>windower</item>
            <item>fft</item>
            <item>melFilterBank</item>
            <item>dct</item>

            <item>svfc</item>

            <item>batchCMN</item>
            <item>featureExtraction</item>
            <item>featureTransform</item>         
        </propertylist>
    </component>

...

    <component name="svfc" type="SpeakerVoiceFeaturesCollector"/>
...


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

Мы не только распознали речь средствами CMU Sphinx 4, т.е. получили ответ на вопрос - что сказано. Накапливая в нашем классе вектора признаков индивидуальных особенностей говорящего мы можем ответить на вопрос - кто говорил. Очевидно, что сравнение векторов признаков с сохраненными паттернами или выделение основного тона есть отдельная задача. Как это лучше сделать, где хранить и как использовать полученные данные - решать вам!

Ссылки и литература

  1. CMU Sphinx 4
  2. Л.А. Введенская, Л.Г. Павлова. Культура и искусство речи. Современная риторика..Ростов-на-Дону. Издательство «Феникс». 1998 г.— 576 с.
  3. Анатомия тембра
  4. Голосовой аппарат
  5. Google вам в помощь :)

Комментариев нет: