Оглавление.Введение. Общие вопросы компьютерного распознавания и порождения речи.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”, содержащие
видеоинформацию.
То есть кусок состоит из заголовка, содержащего тип куска –четырехсимвольный код FOURCC ,-и его размер, и из области данных. Область данных в свою очередь состоит из подразделов следующего формата
Здесь “WAVE” – идентификатор типа информации (здесь – звуковые данные), далее следует фрагмент формата звуковых данных: три символа – f, m, t и после них пробел, далее – общий размер подраздела, формат данных и – непосредственно фрагмент звуковых (или видео) данных (на схеме – “фрагмент “data”). Формат данных описывает данные. Структура этой области для формата PCM (импульсно-кодовой модуляции) имеет следующий вид: typedef struct pcmwaveformat_tag { WAVEFORMAT wf; WORD wBitsPerSample; } PCMWAVEFORMAT; Структура WAVEFORMAT была описана ранее, когда мы рассматривали процедуру Открытия звукового устройства waveInOpen. Поле wBitsPerSample содержит частоту дискретизации. Фрагмент звуковых данных имеет следующий формат тоже имеет составную структуру следующего формата:
Для работы с 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. Которую мы здесь рассматривать не будем. |