РУБРИКИ

Разработка программного обеспечения для голосового управления трехмерными моделями функционирования промышленных роботов

   РЕКЛАМА

Главная

Бухгалтерский учет и аудит

Военное дело

География

Геология гидрология и геодезия

Государство и право

Ботаника и сельское хоз-во

Биржевое дело

Биология

Безопасность жизнедеятельности

Банковское дело

Журналистика издательское дело

Иностранные языки и языкознание

История и исторические личности

Связь, приборы, радиоэлектроника

Краеведение и этнография

Кулинария и продукты питания

Культура и искусство

ПОДПИСАТЬСЯ

Рассылка E-mail

ПОИСК

Разработка программного обеспечения для голосового управления трехмерными моделями функционирования промышленных роботов

p align="left">проверки окончаний слов или фразы на слух. Записи можно легко повторять, пока не будут достигнуты требуемые длительность и окончание вводимой фразы.

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

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

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

С другой стороны, представление, основанное на преобразовании типа «анализ-синтез», обладает большой гибкостью по отношению к изменяющимся свойствам элементов словаря, например временным соотношениям, окончаниям и т. д. Это свойство является даже более важным, чем малая скорость передачи (объем описания), которую можно достигнуть при использовании описания на основе преобразования «анализ-синтез».

Поскольку элементы словаря представлены в виде набора основных параметров речевого сигнала, можно, например, изменять период основного тона и длительность слов таким образом, чтобы привести их в соответствие с контекстом. Более интересной представляется возможность такого изменения параметров на границах слов, чтобы добиться как можно большего сходства между синтезированными и реальными речевыми сигналами. Достигнуть такого эффекта даже в простейших случаях можно лишь на основе использования правил для определения требуемого периода основного тона и протяжённости во времени, а также алгоритмов изменения параметров в соответствии с изменяющейся протяженностью слов и поглощением их границ в слитной речи [1,2].

2.3.3 Системы распознавания дикторов

При распознавании дикторов цифровая обработка речи является тем первым шагом, с которого начинается решение задачи распознавания образов. Речевой сигнал представляется с использованием таких методов цифровой обработки, которые сохраняют индивидуальные особенности диктора. Полученный образ сравнивается с предварительно подготовленными эталонными образами, а затем применяется соответствующая логика принятия решений для определения голоса заданного диктора среди возможного множества. Системы распознавания, дикторов подразделяются на два вида: идентификация и верификация. При верификации диктора требуется установить его идентичность данному эталону. Устройство верификации принимает одно из двух возможных решений: диктор является тем, за кого он себя выдает, или не является. Для вынесения такого решения используется совокупность параметров, содержащих необходимую информацию об индивидуальности диктора и измеряемых по одной или нескольким фразам. Измеренные значения сравниваются (часто с использованием некоторых существенно нелинейных метрик близости) с аналогичными параметрами эталонных образов подлежащего опознанию диктора.

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

Верифицировать диктора i, если рi(х)>ci раv (х);

Отклонить диктора i, если рi(х)<ci раv (х); (2.43)

где ci - константа для i-го диктора, определяющая вероятности ошибок i-го диктора, а раv (х)-среднее (по всему ансамблю дикторов) распределение вероятности измеренных значений вектора х. Изменяя порог ci можно изменять вероятность ошибки, определяемую вероятностями ошибок обоих типов. Задача идентификации диктора существенно отличается от задачи верификации. В этом случае система должна точно указать одного из дикторов среди N дикторов данного множества. Таким образом, вместо однократного сравнения измеряемых параметров с хранимым в системе эталоном необходимо провести N сравнений, Решающее правило в этом случае сводится к выбору такого диктора I, для которого

(2.44)

т.е. выбирается диктор с минимальной абсолютной вероятностью ошибки. С увеличением количества дикторов в ансамбле возрастает и вероятность ошибки. поскольку большое число вероятностных распределений в ограниченном пространстве параметров не может не пересекаться. Все более вероятным становится то, что два или более дикторов в общем ансамбле будут иметь распределения вероятностей, которые близки друг к другу. При таких условиях приемлемая идентификация дикторов становится практически невозможной. Приведенный выше анализ позволяет сделать вывод, что между задачами идентификации и верификации имеется много общего и много различий. В каждом случае диктор должен произнести одну или несколько тестовых фраз. По этим фразам проводятся некоторые измерения, и затем вычисляются одна или несколько мер различимости («расстояния») между предъявленным и эталонным векторами. Таким образом, с позиции методов цифровой обработки обе эти задачи сходны. Основное различие возникает на этапе вынесения решений [1,2].

2.3.4 Системы распознавания речи

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

В отличие от областей машинного речевого ответа и распознавания диктора, где задача в общем случае достаточно определена, область распознавания слов является одной из тех, где, прежде чем поставить задачу, требуется ввести большое число предположений например:

тип речевого сигнала (изолированные слова, непрерывная речь и т.д.);

число дикторов (система для одного диктора, нескольких дикторов, неограниченного числа дикторов);

тип диктора (определенный, случайный, мужчина, женщина, ребенок);

условия произнесения фраз (звукоизолированное помещение, машинный зал, общественное место);

- система передачи (высококачественный микрофон, узконаправленный микрофон, телефон);

тип и число циклов обучения (без обучения, с ограниченным числом циклов обучения, с неограниченным числом циклов обучения);

размер словаря (малый объем 80--20 слов, средний объем 20-100 слов и большой объем - более 100 слов);

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

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

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

2.3.5 Обзор существующих систем распознавания речи

В настоящее время отсутствуют дикторонезависимые системы распознавания слитной речи как с неограниченным словарем, так и ограниченным, а имеющиеся системы (такие как Dragon Dictate - программа для печати текста с голоса) требуют очень много времени и терпения для того, чтобы обучить их удовлетворительно распознавать раздельно произносимые слова одного диктора. Среди других распознающих систем можно назвать Lotus Word Pro, MedSpeak, Voice Type Simplify Speaking, ViaVoice, Kurzweil Voice. He требующие обучения системы распознают обычно от нескольких десятков до сотен слов и используются для подачи команд голосом. Однако они также являются дикторозависимыми. В этой же области остается реализация амбициозных планов, наподобии принятого в 1986 в Японском национальном проекте АТК (Advanced Telecommunication Research), который состоял в том, чтобы получать речь на одном языке и одновременно синтезировать ее на другом или утверждения о реализации идеи человеко-машинного общения. Поэтому исследования в этой области являются весьма актуальными.

3. Разработка программного обеспечения для распознавания команд управления промышленным роботом

3.1 Реализация интерфейса записи и воспроизведения звукового сигнала в операционной системе Microsoft Windows

3.1.1 Основные сведения

Звуковые данные хранятся в компьютере с помощью метода импульсно-кодовой модуляции - РСМ. Расшифровывается РСМ как Pulse-Code Modulation. При этом методе аналоговый звук квантуется по времени и амплитуде. При выводе звука на колонки происходит обратное преобразование.

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

В Windows есть хорошо продуманная и хорошо документированная библиотека для работы со звуком - mmsystem.

Для работы со звуковой картой используется следующий алгоритм работы:

инициализировать звуковой драйвер;

установить параметры;

воспроизвести или записать звуковые данные;

закрыть драйвер.

Для вывода звука данные о звуке в цифровом виде просто отправляются звуковой карте. Она преобразует их в аналоговый сигнал [14].

3.1.2 Основные функции, необходимые для записи звука

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

Прежде всего необходимо заполнить структуру WAVEHDR. Она содержит следующие поля:

typedef struct wavehdr_tag {LPSTR lpData;

DWORD dwBufferLength;

DWORD dwBytesRecorded;

DWORD dwUser;

DWORD dwFlags;

DWORD dwLoops;

struct wavehdr_tag далеко * lpNext;

reserved DWORD;} WAVEHDR;

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

Составляющие структуры:

lpData - указатель на звуковые данные;

dwBufferLength - размер звуковых данных;

dwBytesRecorded - количество записанных байт (при воспроизведении этот параметр не используется);

dwUser - сюда можно записать все, что угодно;

dwFlags - здесь происходит описание заголовка. Конкретизирует флаги, предоставляющие информацию о буфере данных. Может принимать значения, приведенные в табл. 3.1

dwLoops - указывает количество циклов. Этот параметр используется только с буферами выходных данных.

lpNext - зарезервирован для использования драйвером устройства, чтобы указать на следующую структуру WAVEHDR в очереди.

reserved - зарезервирован для использования драйвером устройства.

Это поле может использоваться, чтобы запомнить указатель на структуру, содержащую информацию о клиенте.

Таблица 3.1- Флаги и их значения

Флаг

Значение

WHDR_DONE

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

WHDR_BEGINLOOP

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

WHDR_ENDLOOP

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

WHDR_PREPARED

устанавливается драйвером устройства, чтобы указать, что буфер данных был подготовлен с помощью waveInPrepareHeader или waveOutPrepareHeader

WHDR_JNQUEUE

устанавливается драйвером устройства, чтобы указать, что буфер данных находится в очереди для воспроизведения

Используйте WHDR_BEGINLOOP и флаг WHDR_ENDLOOP в поле dwFlags, чтобы указать начала и концы блоков данных для использования их в цикле. Чтобы прокручивать в цикле один блок, необходимо установить оба флага для этого блока. Необходимо использовать поле dwLoops в структуре WAVEHDR для первого блока в цикле, чтобы установить количество циклов.

Первая функция используемая для записи звука - wavelnOpen. Эта функция устройство ввода для звукового потока. В модуле она объявлена следующим образом:

MMRESULT waveInOpen(

LPHWAVEIN phwi,

UINT_PTR uDevicero,

LPWAVEFORMATEX pwfx,

DWORD_PTR dwCallback,

DWORD_PTR dwCallbacklnstance,

DWORD fdwOpen);

В функции определен ряд параметров. Рассмотрим их основное назначение

phwi - адрес, по которому будет записан указатель на устройство воспроизведения. Этот параметр может быть NULL, если WAVE_FORMAT_QUERY указан для fdwOpen.

UDevicelD - идентификатор устройства, которое необходимо открыть, если поставить сюда константу WAVE_MAPPER, то откроется устройство по умолчанию.

IpFormat - указатель на структуру типа WAVEFORMATEX, в которой описан формат записываемых звуковых данных.

dwCallback - указатель на функцию «семафор». Эта функция вызывается для сообщения о текущих событиях.

fdwOpen - параметры открываемого устройства. Может принимать значения, приведенные в табл. 3.2

Необходимо использовать функцию wavelnGetNumDevs, чтобы определить число устройств ввода, присутствующих в системе. Идентификатор устройства, указанный uDeviceID, изменяется в пределах от ноля до на один меньше, чем количество присутствующих устройств. Константа WAVE_MAPPER может также использоваться в качестве идентификатора устройства.

Если выбирать, чтобы окно или поток получал информацию отзыва, следующие сообщения отправляются процедуре окна или потока, чтобы указать изменения в процессе ввода звуковой информации: MM_WIM_OPEN, MM_WIM_CLOSE, и MM_WIM_DATA.

Если вы выбираете, чтобы функция получала информацию отзыва, функции отправляются следующие сообщения, чтобы указать изменения в процессе ввода звуковой информации: WIM_OPEN, WIM_CLOSE, и WIM_DATA.

Таблица 3.2 - Параметры открываемого устройства

CALLBACK_EVENT

в параметре dwCallback находится событие THandle, через которое происходит информирование о ходе воспроизведения;

CALLBACK_FUNCTION

в dwCallback находится указатель на функцию;

CALLBACK_THREAD

в dwCallback находится идентификатор потока

CALLBACK_WINDOW

в dwCallback находится указатель на окно, которому посылается сообщение

CALLBACK_NULL

в dwCallback ничего нет

WAVE_ALLOWSYNC

можно открыть устройство в синхронном режиме

WAVE_FORMAT_DIRECT

запрещается преобразование данных с помощью АСМ-драйвера (ACM - Audio Compression Manager)

WAVE_FORMAT_QUERY

если установить этот параметр, то реального открытия звуковой карты не происходит, функция проверяет возможность открытия с заданными параметрами, и если всё нормально, то возвращает MMSYSERRNOERROR (если параметры недопустимы, то возвращается код ошибки)

MMS YSERR_ALLOCATED

указанный ресурс уже занят

MMSYSERR_BADDEVICEID

указанный идентификатор устройства не существует

MMSYSERR_NODRIVER

нет драйвера для устройства

MMSYSERR_NOMEM

невозможно использовать память

WAVERR_BADFORMAT

попытка открытия в неподдерживаемом звуковом формате

Необходимо заполнить структуру WAVEFORMATEX. Она имеет следующий вид:

typedef struct WAVEFORMATEX { WORD wFormatTag;

WORD nChannels;

DWORD nSamplesPerSec;

DWORD nAvgBytesPerSec;

WORD nBlockAlign;

WORD wBitsPerSample;

WORD cbSize;} WAVEFORMATEX;

В этой структуре:

wFormatTag - формат звуковых данных (чаще всего используется WAVE_FORMAT_PCM);

nChannels - количество каналов (1 - монО, 2 - стерео);

nSamplesPerSec - частота дискретизации (возможны значения 8000, 11025, 22050 и 44100);

nAvgBytesPerSec - количество байт в секунду для WAVEFORMATPCM это является результатом nSamplesPerSec* nBlockAlign;

nBlockAlign - выравнивание блока (для WAVEFORMATPCM равен wBitsPerSample /8* nChannels);

wBitsPerSample - количество бит в одной выборке (для WAVE_FORMAT_PCM может быть 8 или 16);

cbSize - размер дополнительной информации, которая располагается после структуры (если ничего нет, то должен быть 0).

Теперь следует подготовить заголовки, которые будут отправляться драйверу. Для этого существует функция waveInPrepareHeader

MMRESULT waveInPrepareHeader(

HWAVEOUT hwo,

LPWAVEHDR pwh,

U1NT cbwh);

Внутренняя структура:

hwo - идентификатор устройства записи (полученный после вызова функции wavelnOpen).

pwh - указатель на структуру wavehdr_tag;

cbwh - размер структуры wavehdr_tag.

Функция возвращает значения, приведенные в табл. 3.3.

При этом lpData, dwBufferLength, и dwFlags - члены структуры

WAVEHDR - должны быть установлены перед запросом этой функции (dwFlags должен быть нулевым).

Таблица 3.3 - Возвращаемые значения

MMSYSERR_NOERROR

успех

MMSYSERR_INVALHANDLE

указанный дескриптор устройства недействителен

MMSYSERR_INVALPARAM

базовый адрес буфера не выровнен с объемом выборки

MMSYSERR_NODRIVER

нет драйвера для устройства

MMSYSERR_NOMEM

невозможно использовать память

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

MMRESULT waveInUnprepareHeader(

HWAVEIN hwi,

LPWAVEHDR pwh,

U1NT cbwh);

Параметры:

hwi - указатель на записывающее устройство;

pwh - указатель на структуру WAVEHDR, идентифицирующую буфер, который необходимо очистить.

cbwh - размер, в байтах, структуры WAVEHDR.

Функция возвращает MMSYSERR_NOERROR, если всё проходит успешно, если есть ошибки, возвращается одно из значений, приведенных в табл. 3.4.

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

Таблица 3.4 - Значения, выдаваемые при ошибках

Ошибка

Значение

MMSYSERR_INVALHANDLE

указанный дескриптор устройства недействителен

MMSYSERR_NODRIVER

нет драйвера для устройства

MMSYSERR_NOMEM

невозможно использовать память

MMSYSERR_STILLPLAYING

буфер, указанный pwh, занят

Для передачи буфера приёма данных предоставленному звуковому устройству используется функция waveInAddBuffer. Когда буфер заполнен, приложение получает соответствующее сообщение. Функция имеет следующий вид:

MMRESULT waveInAddBuffer(HWAVEIN hwi,

LPWAVEHDR pwh,

UINT cbwh);

Описание параметров:

hwi- указатель на входное устройство;

pwh - указатель на структуру WAVEHDR, которая идентифицирует буфер.

cbwh - размер, в байтах, структуры WAVEHDR.

Функция возвращает MMSYSERR_NOERROR, если всё проходит успешно, если есть ошибки, возвращает одно из значений, приведенных в табл. 3.5.

Таблица 3.5 - Возвращаемые значения

Ошибка

Значение

MMSYSERR_INVALHANDLE

указанный дескриптор устройства недействителен

MMSYSERR_NODRIVER

нет драйвера для устройства

MMSYSERR_NOMEM

невозможно использовать память

WAVERR_UNPREPARED

буфер, указанный pwh, не был готов

Когда буфер заполнен, бит WHDR_DONE установлен в dwFlags -члене структуры WAVEHDR.

Буфер должен быть подготовлен функцией waveInPrepareHeader перед тем, как это будет передаваться функции waveInAddBuffer.

Далее вызывается функция waveInStart. Она начинает ввод данных через предоставленное устройство. Эта функция выглядит следующим образом:

MMRESULT waveInStart(HWAVEIN hwi);

Параметр hwi указывает на устройство, принимающее информацию.

Функция возвращает MMSYSERR_NOERROR, если всё проходит успешно, если есть ошибки, возвращается одно значений, приведенных в табл. 3.6

Таблица 3.6 - Возвращаемые значения

Ошибка

Значение

MMSYSERR_INVALHANDLE

указанный дескриптор устройства недействителен

MMSYSERR_NODRIVER

нет драйвера для устройства

MMSYSERR_NOMEM

невозможно использовать память

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

Вызов этой функции, когда она уже была вызвана, не имеет эффекта, и функция возвращает ноль [15].

3.1.3 Основные функции, необходимые для воспроизведения звука.

Для воспроизведения звуковой информации первая функция waveOutOpen. Она открывает устройство вывода для звукового потока. В модуле она объявлена следующим образом:

MMRESULT waveOutOpen (LPHWAVEIN phwi,

UINT_PTR uDeviceID, LPWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwCallbacklnstance, DWORD fdwOpen);

В функции определен ряд параметров. Рассмотрим их основное назначение

phwi - адрес, по которому будет записан указатель на устройство воспроизведения;

UDeviceID - идентификатор устройства, которое необходимо открыть, если поставить сюда константу WAVE_MAPPER, то откроется устройство по умолчанию.

lpFormat - указатель на структуру типа WAVEFORMATEX, в которой описан формат воспроизводимых звуковых данных.

dwCallback - указатель на функцию «семафор». Эта функция вызывается для сообщения о текущих событиях.

dwFlags - параметры открываемого устройства. Может принимать следующие значения, совпадающие со значениями fdwOpen для функции wavelnOpen

Структура WAVEFORMATEX для воспроизведения звуковой информации имеет такой же вид, как и для записи. Однако при воспроизведении звука, она заполняется автоматически при выборе воспроизводимого файла.

Теперь предстоит подготовить заголовки, которые будут отправляться драйверу. Для этого есть функция waveOutPrepareHeader

MMRESULT waveOutPrepareHeader(HWAVEOUT hwo,

LPWAVEHDR pwh,

UINT cbwh);

Возвращаемые параметры те же. Внутренняя структура:

hwo - идентификатор устройства воспроизведения (полученный

после вызова функции waveOutOpen).

pwh - указатель на структуру wavehdr_tag; cbwh - размер структуры wavehdr_tag.

Теперь структура wavehdr_tag. Она выглядит так же, как и в случае записи.

После окончания работы с этим заголовком нужно освободить его с помощью функции waveOutUnprepareHeader.

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

MMRESULT waveOutWrite (HWAVEOUT hwo,

LPWAVEHDR pwh,

UINT cbwh);

В ней:

hwo - идентификатор устройства воспроизведения;

pwh - это указатель на структуру, сформированную с помощью waveOutPrepareHeader;

cbwh - размер структуры wavehdr. Возвращаемые значения те же, что и при открытии звуковой карты.

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

MMRESULT waveOutClose (HWAVEOUT hwo);

Параметр hwo указывает на устройство вывода. Если функция завершается успешно, дескриптор не больше действителен после этого вызова. Функция возвращает MMSYSERR_NOERROR, если всё проходит успешно, если есть ошибки, возвращается одно из значений, приведенных в табл. 3.7.

Если устройство ещё воспроизводит звуковой файл, функция его не закрывает. Необходимо использовать функцию waveOutReset, чтобы закончить воспроизведение перед запросом waveOutClose.

Таблица 3.7 - Возвращаемые значения

Ошибка

Значение

MMSYSERR_INVALHANDLE

указанный дескриптор устройства недействителен

MMSYSERR_NODRIVER

нет драйвера для устройства

MMSYSERR_NOMEM

невозможно использовать память

WAVERR_STILLPLAYING

буфер, указанный pwh, занят

waveOutReset останавливает воспроизведение на указанном вывода и сбрасывает текущую координату в нолю. Воспроизведение из буферов отмечается как выполнено и управление передаётся приложению. Функция имеет следующий вид:

MMRESULT waveOutReset (HWAVEOUT hwo);

Параметр hwo указывает на устройство вывода.

Функция возвращает MMSYSERR_NOERROR, если всё проходит успешно, если есть ошибки, возвращается одно из значений, приведенных в табл. 3.8 [14,15].

Таблица 3.8 - Возвращаемые значения

Ошибка

Значение

MMSYSERR_INVALHANDLE

указанный дескриптор устройства недействителен

MMSYSERR_NODRIVER

нет драйвера для устройства

MMSYSERR_NOMEM

невозможно использовать память

MMSYSERR_NOTSUPPORTED

указанное устройство является синхронным и не поддерживает приостановку

3.2 Реализация программного обеспечения для записи, воспроизведения и анализа звукового сигнала

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

В главном окне обеспечивается просмотр и редактирование существующих словарей, а также их сохранение. Это окно содержит главное меню, панель управления и рабочую область приложения. Главное меню состоит из следующих пунктов: File, Edit, View, Help. Нажатие на пункт File позволяет создать новый файл, открыть существующий файл с расширением *.spl, открыть недавно использованный файл, сохранить новый файл и сохранить существующий файл под другим именем, выйти из программы. При нажатии на пункт Edit можно выбрать одно из предлагаемых действий: добавить слово, удалить слово, воспроизводить звук выделенного слова в рабочей области приложения. Пункт View отвечает за вид главного окна: наличие или отсутствие панели управления и строки состояния.

В панели управления присутствуют следующие кнопки: создание нового файла, открытие существующего файла, сохранение файла, удаление и добавление слова, воспроизведение слова,

Для воспроизведения выбранного слова требуется лишь нажать на соответствующую кнопку в панели управления либо выбрать Edit->Play Sound.

Для записи нового слова требуется нажать на соответствующую кнопку в панели управления либо выбрать Edit->Add Word. При этом появляется новое окно, основанное на диалоговой форме, в котором есть поле для ввода буквенного обозначения нового слова. После ввода слова в поле Word, необходимо нажать кнопку Record. После этого появляется новое окно, также основанное на диалоговом окне. Это окно обеспечивает запись и анализ нового слова. Для записи нового слова, прежде всего, необходимо выбрать в поле Source присутствующую в данном компьютере звуковую карту. Далее в поле Format необходимо выбрать формат записываемых данных. Предлагаются форматы данных, приведенные в табл. 3.9.

Выбор формата записываемых данных необходимо осуществлять исходя из следуюпщх предпосылок: с одной стороны, чем выше частота дискретизации (количество элементов в секунду), чем выше количество каналов и чем выше количество бит в элементе, тем выше качество записи, а потом и воспроизведения звука; с другой стороны, чем выше эти параметры, тем сложнее проводить анализ звука, тем дольше обрабатываются данные. Поэтому для решения поставленной задачи выбирается частота дискретизации 11025 Гц, выбирается моно-режим, т.е. количество каналов=1, и количество бит в элементе=8.

После этого всё уже готово для записи. Для непосредственного осуществления записи звукового аналога слова необходимо нажать на кнопку Record.

Таблица 3.9 - Форматы данных

Название

Количество

Частота

Количество

каналов

дискретизации

бит

WAVE_FORMAT_1M08

1

11025

8

WAVE_FORMAT_1M16

1

11025

16

WAVE_FORMAT_J S08

2

11025

8

WAVE_FORMAT_lS16

2

11025

16

WAVE_FORMAT_2M08

1

22050

8

WAVE_FORMAT_2M16

1

22050

16

WAVE_FORMAT_2S08

2

22050

8

W AVE_FORMAT_2 S16

2

22050

16

WAVE_FORMAT_4M08

1

44100

8

WA VE_FORMAT_4Ml 6

1

44100

16

WAVE_FORMAT_4S08

2

44100

8

WAVE_FORMAT_4S16

2

44100

16

После нажатия на кнопку Record, в программе устанавливается режим работы программы - запись. При этом вызываются функции, которые

останавливают воспроизведение, если оно было включено. Кнопка Record становится неактивной, а кнопка Stop - активной. Далее определяются параметры выбранной звуковой карты и формат записываемого звука, Очищаются буферы, в которые будет производиться запись.

Ниже приведена функция, обеспечивающая запись звуковой информации.

BOOL CWaveIriDevice::Record(CWave* pWave, int iBlockSize) {if (IsOpenQ) {if (! CanDoFormat(pWave->GetFormat())) {TRACE("Imput device is already open and doesn't support format"); return FALSE;}

} else {if (!Open(WAVE_MAPPER, pWave->GetFormat())) { TRACE("No input device supports format"); return FALSE;}} miBlockSize = iBlockSize;

WAVEHDR* phdr = (WAVEHDR*)malloc(sizeof(WAVEHDR)); ASSERT(phdr);

memset(phdr, 0, sizeof(WAVEHDR));

phdr->lpData = (char*)malloc(iBlockSize);

ASSERT(phdr->lpData);

phdr->dwBufferLength = iBlockSize;

phdr->dwUser = (D WORD)(void*)p Wave;

MMRESULT mmr = waveInPrepareHeader(m_hInDev, phdr,

sizeof(WAVEHDR)); if (mmr) (MMERR(mmr); return FALSE;}

mmr = waveInAdabuffer(m_hInDev, phdr, sizeof(WAVEHDR)); if (mmr) {MMERR(rnmr);

return FALSE;} (3.1)

phdr = (WAVEHDR*)malloc(sizeof(WAVEHDR));

ASSERT(phdr);

memset(phdr, 0, sizeof(WAVEHDR)); phdr->lpData = (char*)malloc(iBlockSize); ASSERT(phdr->lpData); phdr->dwBufferLength = iBlockSize; phdr->dwUser = (DWORD)(void*)pWave;

mmr = waveInPrepareHeader(m_hInDev, phdr, sizeof(WAVEHDR)); if (mmr) {MMERR(mmr); return FALSE;}

mmr = waveInAddBufTer(m_hInDev, phdr, sizeof(WAVEHDR)); if (mmr) (MMERR(mmr); return FALSE;}

mmr = wavelnS tart(m_h InDe v); if (mmr) {MMERR(mmr); return FALSE;} return TRUE;}

Прежде всего, проверяется, открыто ли устройство. Если открыто, то проверяется, поддерживает ли оно выбранный формат. Если не поддерживает, то выводится сообщение, что устройство уже открыто, но такой формат оно не поддерживает. Если устройство закрыто, то предпринимается попытка открыть какое-либо устройство, поддерживающее данный формат. Если не удалось открыть устройство, поддерживающее данный формат, то выводится сообщение, что никакое устройство не поддерживает данный формат. Устанавливаем два буфера и отправляем их в драйвер устройства. Устанавливаем заголовок. Опустошаем заголовок. Подготавливаем заголовок. Начинаем запись

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

можно переписать, повторно нажав на кнопку Record. Все ранее записанные данные при этом теряются

Для обработки полученных данных необходимо нажать на кнопку OpenData, которая вызывает функцию обработки данных. После нажатия на кнопку OpenData, в программе устанавливается режим работы программы -обработка данных, находящихся в буфере.

Ни же приведена функция, обеспечивающая обработку данных, находящихся в буфере.

BOOL CWaveOutDevice::OpenData(CWave *pWave,CClientDC *curDC) (int count=0;

CWaveBlockList* pBL = pWave->GetBlockList(); if(!pBL) return FALSE; POSITION pos = pBL->GetHeadPositionO; if(!pos) return FALSE;

if (pWave->m_bAutoDestruct) pWave->AddRef(); while (pos)

{CWaveBlock* pBlock = pBL->GetNext(pos); ASSERT(pBlock);

WAVEHDR* phdr = (WAVEHDR*)malloc(sizeof(WAVEHDR)); ASSERT(phdr);

memset(phdr, 0, sizeof(WAVEHDR)); phdr->lpData = (char*) pBlock->GetSamples(); phdr->dwBufferLength = pBlock->GetSize(); phdr->dwUser = (DWORD)(void*)pWave; CString ss("");

ss.Format(_T("%s"),pBlock->m_pSamples); int iw = ss.GetLengthO;

intnum=0; (3.2)

for(long h=0;h<4096;h++)

{num=count*4096+h; bunker[num]=(int)ss. GetAt(O); CString s("");

s.Format(_T("%f "),bunker[num]);

ss.Delete(0,l);}

count-H-;

len=4096*count;}

Noise(bunker,len,0);

Filter(bun,l);

Hamming(fнl,l);

Furje(ham,l);

СИр(пЦ);

AfxMessageBox("Data are..."); return TRUE;}

Прежде всего, обнуляем номер буфера. Далее берём список блоков данных из функции GetBlockList(). Если это невозможно, выходим из функции. Определяем позицию первого элемента в блоке данных. При невозможности выполнения действия, выходим из функции. Наращиваем счётчик ref, если мы его используем. До тех пор, пока существует pos, выполняем следующий цикл. Определяем позицию следующего элемента. Устанавливаем заголовок. Очищаем заголовок. Передаём в параметр IpData значения элементов. Определяем длину буфера. Объявляем строку. В эту строку записываем данные о звуке из pBlock. Определяем длину строки. Объявляем и обнуляем счётчик для массива, в который будем записывать данные о звуке. Т.к. буфер ограничен числом 4096, в цикле от 0 до 4096 записываем данные из строки в массив. Номер элемента массива определяется как номер буфера умноженный на его длину плюс номер элемента в буфере. Непосредственно сама запись из строки в массив. Переопределяем тип данных массива. Увеличиваем номер массива.

Рассчитываем длину массива. Вызываем функцию избавления от шумов. Вызываем функцию обработки с помощью фильтра. Вызываем функцию обработки в окне Хэмминга. Вызываем функцию выполнения преобразования Фурье. Вызываем функцию проведения клиппирования. Выводим на экран сообщение, что данные успешно обработаны. Выходим из функции.

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

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

3.3 Реализация функции распознавания голосовых команд голосового управления промышленным роботом

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

После этого проводится обработка в окне Хэмминга. График полученный в результате этого преобразования приведен на рис 3.3.

Рисунок 3.3 - График функции, после обработки в окне Хэмминга

Далее выполняется преобразование Фурье для коэффициентов, взвешенных окном Хэмминга После этого производится фильтрация. Затем проводится обратное преобразование Фурье. Далее следует операция клигширования, на основании графика которой делается вывод о том, какое слово было произнесено. На рис. 3.4 приведены графики сигнала для слова «вперёд».

Рисунок 3.5 - Графики сигнала для слова «назад» (а - график вокализованной части сигнала; б - график сигнала после обработки в окне Хэмминга; в -график сигнала после клиппирования)

На рис. 3.6 приведены графики сигнала для слова «стоп».

Рисунок 3.6 - Графики сигнала для слова «стоп» (а - график вокализованной части сигнала; б - график сигнала после обработки в окне Хэмминга; в -график сигнала после клиппирования)

На рис. 3.11 приведены графики сигнала для слова «пять».

Рисунок 3.11 - Графики сигнала для слова «пять» (а - график вокализованной части сигнала; б - график сигнала после обработки в окне Хэмминга; в - график сигнала после клиппирования)

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

3.4 Реализация голосового управления трёхмерными моделями промышленного робота

Библиотека OpenGL представляет собой интерфейс программирования трехмерной графики - это её основное предназначение. Библиотека представляет собой программный интерфейс для аппаратного обеспечения машинной графики. Этот интерфейс состоит приблизительно из 250 отдельных команд (почти 200 команд в ядре OpenGL и еще 50 команд в библиотеке утилит OpenGL), которые используются для того, чтобы определить объекты и операции, необходимые для создания интерактивных трехмерных прикладных программ.

Страницы: 1, 2, 3, 4


© 2007
Полное или частичном использовании материалов
запрещено.