Оглавление.
Введение. Общие вопросы компьютерного распознавания и порождения речи.
1. Программирование звука в Windows.
2. Основы цифровой обработки звуковых сигналов.
3. Определение параметров речевого сигнала.
4. Алгоритмы распознавания.
5. Использование Microsoft Speech API 5.1 для синтеза
и распознавания речи.
6. Использование Microsoft Speech API 4.0 для синтеза
речи.
Ссылки.
Об авторе.
|
|
Компьютерное распознавание и порождение речи
Глава 1. Программирование звука в Windows.
1.2.3.Описание функций
UINT waveInGetNumDevs ()
Возвращает количество устройств, способных записывать звуковые данные с использованием
Импульсно-кодовой модуляции.
UINT waveOutGetNumDevs ()
Возвращает количество устройств, способных воспроизводить звуковые данные, записанные с
Использованием импульсно-кодовой модуляции.
UINT waveInGetDevCaps(UINT iNumDev, WAVEINCAPS* pWaveInCaps, UINT iCapsSize)
Определяет возможности указанного устройства ввода.
Параметры:
iNumDev - номер устройства ввода от 0 до значения, возвращаемого функцией
waveInGetNumDevs.
pWaveInCaps – указатель на структуру WAVEINCAPS следующего вида :
typedef struct waveincaps_tag {
UINT wMid; // Код изготовителя драйвера для устройства
UINT wPid; // Код устройства, назначенный изготовителем
VERSION vDriverVersion; // старший байт – наибольший номер версии
// драйвера устройства, младший байт – наименьший
// номер версии драйвера устройства
сhar szPname[MAXPNAMELEN] // Описание устройства
DWORD dwFormats; // Флаги, соответствующие стандартным форматам
// звуковых данных, с которыми может работать
// устройство
UINT wChanels; // количество каналов (1 – моно, 2 – стерео)
} WAVEINCAPS;
Примеры значений поля dwFormats:
WAVE_FORMAT_1M08 – частота дискретизации 11.025 КГц, моно, 8 бит для представления одного отсчета;
WAVE_FORMAT_2S16 – частота дискретизации 22.05 КГц, стерео, 16 бит для представления одного отсчета;
WAVE_FORMAT_4M16 – частота дискретизации 44.1 КГц, моно, 16 бит для представления одного отсчета;
Эти и подобные константы могут объединяться в поле dwFormats с помощью логической операции ИЛИ.
Третий параметр функции waveInGetDevCaps – iCapsSize должен содержать размер структуры
WAVEINCAPS.
UINT waveOutGetDevCaps(UINT iNumDev, WAVEOUTCAPS* pWaveOutCaps, UINT iCapsSize)
Определяет возможности указанного устройства ввода.
Параметры:
iNumDev - номер устройства вывода от 0 до значения, возвращаемого функцией
waveOutGetNumDevs.
pWaveOutCaps – указатель на структуру WAVEINCAPS следующего вида :
typedef struct waveoutcaps_tag {
UINT wMid; // Код изготовителя драйвера для устройства
UINT wPid; // Код устройства, назначенный изготовителем
VERSION vDriverVersion; // старший байт – наибольший номер версии
// драйвера устройства, младший байт – наименьший
// номер версии драйвера устройства
сhar szPname[MAXPNAMELEN] // Описание устройства
DWORD dwFormats; // Флаги, соответствующие стандартным форматам
// звуковых данных, с которыми может работать
// устройство
UINT wChanels; // количество каналов (1 – моно, 2 – стерео)
DWORD dwSupport; // флаги возможностей устройства вывода
} WAVEOUTCAPS;
Значения поля dwFormats формируются так же, как в структуре WAVEINCAPS.
dwSupport может содержать следующие флаги, соединенные логической операцией ИЛИ:
WAVECAPS_PITCH – изменение высоты тона;
WAVECAPS_PLAYBACKRATE – изменение скорости проигрывания;
WAVECAPS_SYNC – драйвер устройства работает в синхронном режиме ( во время работы
Устройства работа программы приостанавливается);
WAVECAPS_VOLUME – управление громкостью;
WAVECAPS_LRVOLUME – раздельное управление громкостью для левого и правого каналов.
Третий параметр функции waveOutGetDevCaps – iCapsSize должен содержать размер структуры
WAVEOUTCAPS.
UINT waveInOpen(
LPHWAVEIN lphWaveIn, // указатель на идентификатор устройства
UINT wDeviceID, // номер открываемого устройства
LPWAVEFORMAT lpFormat, // указатель на структуру WAVEFORMAT
DWORD dwCallback; // адрес функции обратного вызова
// или идентификатор окна
DWORD dwCallbackInstance, // данные для функции обратного вызова
DWORD dwFlags); // режим открытия устройства
Открывает устройство записи (ввода).
В параметр lphWaveIn в результате работы возвращается указатель на переменную типа
HWAVEIN, который необходим для выполнения всех операций с данным устройством ввода.
Через параметр wDeviceID приложение передает функции waveInOpen номер устройства ввода,которое оно собирается открыть или константу WAVE_MAPPER, если нужно чтобы
Было выбрано устройство ввода по умолчанию, определенное в операционной системе.
Через параметр lpFormat приложение должно передать функции указатель на предварительно заполненную структуру WAVEFORMAT, которая имеет следующую
структуру:
typedef struct waveformat_tag {
WORD wFormatTag; // тип формата, всегда – WAVE_FORMAT_PCM
WORD nChanels; // количество каналов (1 – моно, 2 – стерео)
DWORD nSamplesPerSec; // частота дискретизации
DWORD nAvgBytesPerSec; // скорость потока данных
WORD nBlockAlign; // выравнивание блока данных
} WAVEFORMAT;
nAvgBytesPerSec вычисляется как произведение числа каналов, частоты дискретизации и количества байт в одном отсчете. Количество байт в отсчете, естественно, равно размерности
отсчета в битах, разделенному на 8 (именно столько бит находится в одном байте).
nBlockAlign вычисляется как произведение количества каналов на количество байт в одном отсчете.
Четвертый параметр функции waveInOpen – dwCallback, - объект, которому будут передаваться уведомления о выполнении запрошенных операций, его смысл зависит от значения реквизита dwFlags.
Если dwFlags содержит CALLBACK_NULL, реквизит dwCallback игнорируется и сообщения от драйвера не обрабатываются, если dwFlags содержит CALLBACK_WINDOW – dwCallback
должен содержать дескриптор (типа HWND) окна, оконная процедура котрого должна обработать сообщения от драйвера (главным образом нас интересует MM_WIM_DATA – сообщение, посылаемое в момент заполнения переданного драйверу буфера данными из входного потока). Если dwFlags содержит CALLBACK_EVENT, реквизит dwCallback является дескриптором события, если dwFlags содержит CALLBACK_THREAD, реквизит dwCallback является дескриптором потока, если dwFlags содержит CALLBACK_FUNCTION, реквизит dwCallback является указателем функции обратного вызова.
Для открытия синхронного устройства (такого, которое останавливает работу приложения до завершения записи или воспроизведения) dwFlags должно содержать также
(через логическую операцию ИЛИ) флаг WAVE_ALLOWSYNC.
Функция waveInOpen возвращает значения:
MMSYSERR_NOERROR - успешное выполнение, MMSYSERR_BADDEVICED - неправильный номер устройства, MMSYSERR_ALLOCATED - устройство уже открыто,
MMSYSERR_NOMEM - недостаточно памяти, WAVERR_BADFORMAT - указанный формат не поддерживается драйвером устройства вывода, WAVERR_SYNC -
была выполнена попытка открыть синхронное устройство
UINT waveOutOpen(
LPHWAVEOUT lphWaveOut, // указатель на идентификатор устройства
UINT wDeviceID, // номер открываемого устройства
LPWAVEFORMAT lpFormat, // указатель на структуру WAVEFORMAT
DWORD dwCallback; // адрес функции обратного вызова
// или идентификатор окна
DWORD dwCallbackInstance, // данные для функции обратного вызова
DWORD dwFlags); // режим открытия устройства
Открывает устройство записи (вывода).
В параметр lphWaveOut в результате работы возвращается указатель на переменную типа
HWAVEOUT, который необходим для выполнения всех операций с данным устройством вывода.
Остальные параметры и возвращаемое значение аналогичны функции waveInOpen.
UINT waveInPrepareHeader(
HWAVEIN hWaveIn, // идентификатор устройства
LPWAVEHDR lpWaveInHdr, // указатель на структуру WAVEHDR
UINT wSize); // размер структуры WAVEHDR
Подготавливает буфер к передаче устройству ввода.
Параметры:
hWaveIn - идентификатор устройства, полученный функцией waveInOpen;
В параметре lpWaveInHdr программа передает в функцию указатель на структуру типа WAVEHDR, содержащую описание буфера и ссылку на массив передаваемых
данных. Структура WAVEHDR выглядит так:
typedef struct wavehdr_tag {
LPSTR lpData; // адрес буфера данных - ссылка на символьный массив
DWORD dwBufferLength; // размер буфера данных
DWORD dwBytesRecorded; // количество записанных байт (только при записи)
DWORD dwUser; // пользовательские данные
DWORD dwFlags; // флаги состояния буфера данных
DWORD dwLoops; // количество повторений (только при воспроизведении)
struct wavehdr_tag far * lpNext; // зарезервировано
DWORD reserved; // зарезервировано
} WAVEHDR;
typedef WAVEHDR FAR * LPWAVEHDR;
Реквизит функции wSize содержит размер структуры WAVEHDR.
UINT waveOutPrepareHeader(
HWAVEIN hWaveOut, // идентификатор устройства
LPWAVEHDR lpWaveOutHdr, // указатель на структуру WAVEHDR
UINT wSize); // размер структуры WAVEHDR
Подготавливает буфер к передаче устройству вывода.
Параметры:
hWaveOut - идентификатор устройства, полученный функцией waveOutOpen;
Остальные параметры - аналогично функции waveInPrepareHeader.
UINT waveInAddBuffer(
HWAVEIN hWaveIn, // идентификатор устройства
LPWAVEHDR lpWaveInHdr, // указатель на структуру WAVEHDR
UINT wSize); // размер структуры WAVEHDR
Передает подготовленный буфер памяти драйверу устройства ввода. Параметры аналогичны функции waveInPrepareHeader.
UINT waveInStart (HWAVEIN hWaveIn) // идентификатор устройства, полученный waveInOpen.
Запускает процесс ввода данных.
UINT waveOutWrite(
HWAVEIN hWaveOut, // идентификатор устройства
LPWAVEHDR lpWaveOutHdr, // указатель на структуру WAVEHDR
UINT wSize); // размер структуры WAVEHDR
Воспроизведение буфера данных. Параметры аналогичны функции waveOutPrepareHeader.
UINT waveInStop(HWAVEIN hWaveIn); // идентификатор устройства ввода
Останавливает устройство ввода.
UINT waveOutPause(HWAVEOUT hWaveOut); // идентификатор устройства
// вывода
Приостанавливает устройство вывода.
UINT waveOutRestart(HWAVEOUT hWaveOut); // идентификатор устройства
// вывода
Возобновляет работу приостановленного устройства вывода.
UINT waveInUnprepareHeader(
HWAVEIN hWaveIn, // идентификатор устройства ввода
LPWAVEHDR lpWaveInHdr, // указатель на структуру WAVEHDR
UINT wSize); // размер структуры WAVEHDR
Освобождает буфер ввода.
UINT waveOutUnprepareHeader(
HWAVEIN hWaveOut, // идентификатор устройства вывода
LPWAVEHDR lpWaveOutHdr, // указатель на структуру WAVEHDR
UINT wSize); // размер структуры WAVEHDR
Освобождает буфер вывода.
UINT waveInClose(HWAVEIN hWaveIn); // идентификатор устройства ввода
Закрывает устройство ввода.
UINT waveOutClose(HWAVEOUT hWaveOut); // идентификатор устройства
// вывода
Закрывает устройство вывода.
UINT waveOutGetVolume(
UINT wDeviceID, // номер устройства вывода
DWORD dwVolume) // текущая громкость
Получает текущую громкость устройства вывода с номером wDeviceID.
Внимание! Здесь фигурирует именно системный номер, а не идентификатор устройства, устанавливаемый функцией waveOutOpen. Если номер открытого устройства неизвестен, его можно получитьпри помощи функции waveOutGetID (см.ниже пункт 20). Громкость dwVolume принимает значения от минимальной 0x0000 до максимальной 0xFFFF, при этом в случае стереофонического воспроизведения младшее слово задает значение для левого канала, а старшее – для правого канала. В случае монофонического воспроизведения значениепередается в младшем слове.
UINT waveOutSetVolume(
UINT wDeviceID, // номер устройства вывода
DWORD dwVolume) // текущая громкость
Устанавливает громкость устройства с номером wDeviceID.
Параметры функции аналогичны waveOutGetVolume.
UINT waveInGetID(
HWAVEOUT hWaveIn, // идентификатор устройства ввода
UINT FAR * lpwDeviceID); // адрес переменной для записи номера
// устройства
Получает номер устройства ввода по его идентификатору.
UINT waveOutGetID(
HWAVEOUT hWaveOut, // идентификатор устройства вывода
UINT FAR * lpwDeviceID); // адрес переменной для записи номера
// устройства
Получает номер устройства вывода по его идентификатору
|
|