Оглавление.

Введение. Общие вопросы компьютерного распознавания и порождения речи.

1. Программирование звука в Windows.

2. Основы цифровой обработки звуковых сигналов.

3. Определение параметров речевого сигнала.

4. Алгоритмы распознавания.

5. Использование Microsoft Speech API 5.1 для синтеза и распознавания речи.

6. Использование Microsoft Speech API 4.0 для синтеза речи.

Ссылки.

Об авторе.

Компьютерное распознавание и порождение речи

Глава 2. Основы цифровой обработки звуковых сигналов.

Назад В начало главы Дальше

2.2. Свертка.


Более подробно коснемся метода свертки (иначе называемом конволюцией).

Введем понятие дельта-функции (иначе называемой функцией единичного импульса). Обозначается она так: δ[n]. Дельта-функция определяется так: δ[n]=1 при n=0 и δ[n]=0 при любых n<>0. Под импульсом вообще понимают сигнал, не равный нулю только в одной точке. Дельта-функцию называют еще нормированным импульсом.

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

Любой импульс может быть представлен как смещенная и промасштабированная дельта-функция. Например, рассмотрим импульс {0,0,6,0,0,0}. Он может быть представлен так: y[n]=6δ[n-3] (единичный импульс выглядит как {1,0,0,0,0,0…}).

Если x[n] – исходный сигнал, h[n] – импульсная характеристика системы в которую поступает сигнал, то значение выходного сигнала будет равно y[n]=x[n]*h[n], где звездочка обозначает не умножение( как во многих языках программирования), а математическую операцию свертки. Для вычисления свертки используют два алгоритма. Первый, называемый алгоритмом входной стороны, был упомянут чуть выше: сначала производится декомпозиция исходного сигнала из N отсчетов в N импульсов, таких что для i-го импульса zi[n]=x[n] при n=i, zi[n]=0 при n<>i. Тогда zi[n]= zi[i]δ[n-i]. Реакция системы на i-й импульс будет равна смещенной и промасштабированной импульсной характеристике (ввиду линейности системы), то есть yi=zi[i]h[n-i]. Значение же выходного сигнала будет равно сумме y=∑yi.

Алгоритм входной стороны для свертки может быть реализован на языке C следующим образом:

// Свертка по алгоритму входной стороны
// Возвращает массив из N+M-1 чисел, где N - число элементов сигнала х,
// M - число элементов сигнала h, х и h - свертываемые сигналы

double* Convolution(double *x,int N,double *h, int M)
{
double* dRes=(double*)malloc((N+M-1)*sizeof(double));
for(int i=0;i{
dRes[i]=0;
}
for(i=0;i{
for(int j=0;j{
dRes[i+j]=dRes[i+j]+x[i]*h[j];
}
}
return(dRes);
}

Алгоритм выходной стороны дает тот же результат, что и алгоритм выходной стороны, но несколько другим способом – более удобным для вычисления, хотя и делающим неочевидным смысл вычислений. Оказалось, что результат свертки может быть получен с помощью формулы
M-1
y[i]=h[i]x[j-i]
j=0

где M – количество отсчетов в импульсной характеристике.

Алгоритм выходной стороны для свертки может быть реализован на языке C следующим образом:

// Свертка по алгоритму выходной стороны
// Возвращает массив из N+M-1 чисел, где N - число элементов сигнала х,
// M - число элементов сигнала h, х и h - свертываемые сигналы

double* Convolution(double *x,int N,double *h, int M)
{
double* dRes=(double*)malloc((N+M-1)*sizeof(double));
for(int i=0;i{
double iSum=0;
for(int j=0;j{
if((i-j>=0)&&(i-j{
iSum+=h[j]*x[i-j];
}
}
dRes[i]=iSum;
}
return(dRes);
}

Рассмотрим основные свойства свертки.

1) Сигнал, свернутый с дельта-функцией, остается неизменным:
x[n]*δ[n]=x[n]

2) Свертка с масштабированной дельта-функцией приводит к усилению или ослаблению сигнала:
x[n]*kδ[n]=kx[n]

3) Свертка со сдвинутой на величину k дельта-функцией приводит к сдвигу на ту же величину входного сигнала:
x[n]*δ[n+k]=x[n+k]

4) Принцип суперпозиции:
x[n]*(h1[n]+h2[n])= x[n]* h1[n]+ x[n]* h2[n]

С помощью операции свертки можно изменить входной сигнал так, что он примет подобие функции производной или интеграла от функции исходного сигнала, а именно дискретную форму первой производной, именуемую первой разницей, и дискретную форму интеграла, именуемую текущей суммой.
Для вычисления первой разницы (производной) необходимо свернуть исходный сигнал с сигналом, имеющим амплитуду 1 для отсчета с номером 0, амплитуду (-1) для отсчета с номером 1 и амплитуду 0 для всех остальных отсчетов.
Для вычисления текущей суммы (интеграла) исходный сигнал необходимо свернуть с сигналом, имеющим амплитуду 1 для всех отсчетов с номерами большими либо равными 0, и амплитуду 0 для всех отсчетов с номерами меньшими нуля.
Но на практике для вычисления первой разницы (производной) чаще обходятся без свертки, пользуясь для нее формулой вычисления :
y[n]=x[n]-x[n-1]

Для вычисления же текущей суммы (интеграла) полагают y[0]=x[0], а для номеров с первого и больше применяют рекурсивную формулу
y[n]= y[n-1]+x[n]


Распознавание речи. Обработка текстов на естественном языке.
Hosted by uCoz