Оглавление.

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

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

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

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

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

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

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

Ссылки.

Об авторе.

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

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

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

1.2.4. Работа с файлами в формате RIFF.

RIFF – аббревиатура от английского “Resource Interchange File Format” (формат Файла для обмена ресурсами). Этот формат имеют файлы с расширением “.wav”, хранящие звуковую информацию, и файлы в формате “.avi”, содержащие видеоинформацию.
В целом файл формата RIFF выглядит из кусков (chunk) типа “RIFF” или “LIST”, имеющих следующий формат

“RIFF” Размер Данные
DWORD DWORD

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

“WAVE” “fmt“ Размер Формат данных Фрагмент “data”


Здесь “WAVE” – идентификатор типа информации (здесь – звуковые данные), далее следует фрагмент формата звуковых данных: три символа – f, m, t и после них пробел, далее – общий размер подраздела, формат данных и – непосредственно фрагмент звуковых (или видео) данных (на схеме – “фрагмент “data”).
Формат данных описывает данные. Структура этой области для формата PCM (импульсно-кодовой модуляции) имеет следующий вид:

typedef struct pcmwaveformat_tag {
WAVEFORMAT wf;
WORD wBitsPerSample;

} PCMWAVEFORMAT;


Структура WAVEFORMAT была описана ранее, когда мы рассматривали процедуру Открытия звукового устройства waveInOpen. Поле wBitsPerSample содержит частоту дискретизации. Фрагмент звуковых данных имеет следующий формат тоже имеет составную структуру следующего формата:

“data” “fmt“ Размер Звуковые данные


Для работы с RIFF-файлами в winmm.dll содержится целый ряд функций. Рассмотрим основные.

HMMIO mmioOpen(
LPSTR szFileName, // путь к файлу
LPMMIOINFO lpmmioinfo, // указатель на структуру MMIOINFO
DWORD dwOpenFlags); // флаги для операции открытия


Открывает RIFF-файл. Параметры: szFileName – длинный указатель на строку, заканчивающуюся символом ‘\0’, содержащую путь к открываемому файлу. lpmmioinfo – указатель на структуру MMIOINFO с дополнительными параметрами операции открытия. В общем случае можно указать значение этого параметра как NULL и не использовать эту структуру вообще. dwOpenFlags содержит комбинацию флагов, соединенных логической операцией ИЛИ. Важнейшие флаги: MMIO_READ – чтение, MMIO_WRITE – запись, MMIO_READWRITE – чтение и запись, MMIO_DELETE – удаление файла, MMIO_ CREATE – создание нового файла, MMIO_EXCLUSIVE – файл будет открыт в монопольном режиме, MMIO_DENYWRITE – другим программам будет закрыт доступ на записьв файл, MMIO_DENYREAD – другим программам будет закрыт доступ на чтение файла, MMIO_DENYNONE – разрешение записи и чтения из/в файл(а) для других пограмм. Функция возвращает идентификатор открытого файла.

UINT mmioClose(
HMMIO hmmio, // идентификатор открытого файла
UINT wFlags); // флаги для операции закрытия файла


Закрывает RIFF-файл. Параметры: hmmio – идентификатор открытого файла, полученный с помощью функции mmioOpen. wFlags - в общем случае 0. Функция возвращает 0 в случае успеха, иначе – код ошибки.

LONG mmioWrite(
HMMIO hmmio, // идентификатор открытого файла
HPSTR hpBuff, // указатель на буфер с данными
LONG dwBytes); // размер буфера


Запись в файл буфера данных. Указатель текущей позиции в файле при этом перемещается вперед на количество записанных байтов. Параметры: hmmio – идентификатор открытого файла, полученный с помощью функции mmioOpen. hpBuff – указатель на буфер длиной более 64 Кбайт, dwBytes – размер буфера. Возвращает -1 в случае ошибки, иначе – число записанных байтов.

LONG mmioRead(
HMMIO hmmio, // идентификатор открытого файла
HPSTR hpBuff, // указатель на буфер с данными
LONG dwBytes); // размер буфера


Чтение из файла в буфер данных. Указатель текущей позиции в файле при этом перемещается вперед на количество порчитанных байтов. Параметры: hmmio – идентификатор открытого файла, полученный с помощью функции mmioOpen. hpBuff – указатель на буфер длиной более 64 Кбайт, dwBytes – размер буфера. Возвращает -1 в случае ошибки, иначе – число прочитанных байтов.

LONG mmioSeek (
HMMIO hmmio, // идентификатор открытого файла
LONG dwOffset, // смещение текущей позиции в байтах
int nOrigin); // размер буфера


Устанавливает текущий указатель в файле с указанным в байтах смещением dwOffset . Позиция, от которой отсчитывается смещение определяется реквизитом nOrigin. Если nOrigin равно SEEK_SET – смещение определяется от начала файла, если SEEK_END – смещение от конца (со знаком минус), SEEK_CUR – смещение от текущей позиции в файле.

FOURCC mmioFOURCC (
CHAR ch0, // первая буква кода
CHAR ch1, // вторая буква кода
CHAR ch2, // третья буква кода
CHAR ch3); //четвертая буква кода


Формирует код FOURCC из четырех символов ch0, ch1, ch2, ch3. Так FOURCC-код “WAVE” формируется оператором

FOURCC FourCCCode = mmioFOURCC(‘W’,’A’,’V’,’E’).



FOURCC mmioStringToFOURCC(
LPCSTR szString, // преобразуемая строка
UINT wFlags) // способ преобразования


Формирует код FOURCC из строки szString. wFlags в общем случае 0, если wFlags равен MMIO_TOUPPER, все буквы будут преобразованы в заглавные.

UINT mmioCreateChunk(
HMMIO hmmio, // идентификатор открытого файла
LPMMCKINFO lpck, // указатель на структуру MMCKINFO
UINT wFlags); // вид фрагмента


Создает новый кусок в RIFF-файле. Параметры: hmmio – идентификатор открытого файла, полученный с помощью функции mmioOpen. wFlags – MMIO_CREATERIFF, если создается кусок “RIFF”, MMIO_CREATELIST – если создается кусок “LIST”. lpck - указатель на структуру MMCKINFO, определяемую следующим образом:

typedef struct _MMCKINFO {
FOURCC ckid; // код-идентификатор куска
DWORD cksize; // размер куска в байтах
FOURCC fccType; // вид куска
DWORD dwDataOffset; // смещение области данных в байтах // от начала файла
DWORD dwFlags; // NULL или MMIO_DIRTY

} MMCKINFO;


ckid – например, MMIO_CREATERIFF. сksize вычисляется без учета идентификатора куска, поля длины куска и дополнительных файлов выравнивания, которые могут находится в конце куска, fccType – например mmioFOURCC(‘W’,’A’,’V’,’E’). Значение флага dwFlags MMIO_DIRTY означает, что длина куска может быть изменена функцией mmioAscend. Которую мы здесь рассматривать не будем.


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