Оглавление.

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

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

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

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

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

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

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

Ссылки.

Об авторе.

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

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

Теперь рассмотрим версию SAPI 4.0, поскольку существующая на момент написания этих строк версия 5.1 не имеет русскоязычного движка (в том числе и сторонних производителей) или, по крайней мере, автору о таковом неизвестно.

Для работы нужно будет скачать и установить Speech SDK 4.0 по адресу(http://www.microsoft.com/speech/download/old/sdk40a.asp). Условно-бесплатный движок (Lernout & Hauspie TTS3000 TTS Engine) для синтеза русской речи можно взять со страницы Microsoft Agent download page for end-users (http://www.microsoft.com/msagent/downloads/user.asp) .

SAPI представляет собой набор компонентов, относящихся к различным логическим уровням. Группы объектов «Голосовые команды», «Голосовая диктовка» и «Голосовой текст» занимают верхний уровень. Разделяемые объекты, которые позволяют совместно использовать движки, занимают следующий уровень. «Прямое распознавание речи» и «Прямое преобразование текста в речь» занимают следующий уровень. Аудио-объекты занимают нижний уровень.

Объекты DirectSpeechRecognition и DirectTextToSpeech обеспечивают полный доступ к речевому движку. Их интерфейс можно считать самым низким уровнем, дающим как хорошую скорость, так и максимальный контроль. Они загружают движок в процесс и передают управление на микрофон и громкоговорители.
Объекты Voice Command, Voice Dictation и Voice Text обеспечивают более высокий уровень доступа к речевому движку. Их программный интерфейс более ограничен и несколько медленнее, чем у прямых API. Однако они предлагают автоматическое создание ресурсов и совместное использование памяти между приложениями. Объекты
Voice Dictation к тому же позволяют облегчить диктовку, автоматически заполняя недостающие фрагменты текста и производя его корректировку.
Объекты «Голосовая телефония» (Voice Telephony) позволяют синтезировать и распознавать речь, а также преобразовать сигнал в тоновую или импульсную форму для передачи сигнала по одиночным или многоканальным телефонным линиям.

Голосовой текст.

Голосовой текст- это средство, обеспечивающее простые возможности синтеза речи.
Вы можете осуществить перевод текста из представления в виде последовательности символов в речевой сигнал, воспроизводимый в динамике или передаваемый по телефонной линии. Объект Voice Text управляет взаимодействием между синтезирующим речь движком и динамиком или телефонной линией. До того как приложение сможет использовать объект, должен быть создан и зарегистрирован экземпляр этого самого объекта

3.1. Пример кода.

Приложение, использующее Voice Text API должно сначала инициализировать COM:

#include "windows.h"
#include "mmsystem.h"
#include "initguid.h"
#include "spchwrap.h"

int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpszCmdLine, int nCmdShow)
{

CoInitialize(NULL);

Далее приложение создает новый объект Voice Text и инициализирует его:

PCVoiceText pCVTxt;
pCVTxt = new CVoiceText;
if (!pCVTxt)
return -1;

HRESULT hRes;
hRes = pCVTxt->Init(L"My Application");
if (hRes)
return -1;

Посредством вызова Init() с именем приложения, приложение автоматически регистрируется.

Чтобы заговорить, приложение вызывает CVoiceText::Speak():

hRes = pCVTxt->Speak(L"Hello world.");
if (hRes)
return -1;

MessageBox(NULL, "Hello, World.", "Voice Text Example", MB_OK);

После всего приложение освобождает объект и COM:

if (pCVTxt)
delete pCVTxt;

CoUninitialize();

return 0;

Теперь поговорим подробнее о классе CVoiceText. Этот класс является оберткой для объекта Голосовой текст (ГТ). Объект ГТ представляет некоторое расположение на компьютере. Это расположение состоит из аудио-устройства, такого как компьютерный громкоговоритель или телефонная линия, и режима Text-to-speech (“Речь в текст”, TTS), обеспечиваемого движком. Внутри себя ГТ-расположение содержит два DirectToSpeech- объекта: объект TTS-движка и аудиовыход.

Конструктор

CVoiceText(void)

Деструктор

~CVoiceText(void)

Способы инициализации

Приложению необходимо инициализировать оболочку объекта «Голосовой текст». Вот несколько вариантов функции Init:

HRESULT Init (void)

Создает новый COM-объект. Приложению необходимо вызвать Register.

HRESULT Init (LPUNKNOWN pIUnkVTxt)

Создает объект из существующего объекта «Голосовой текст». Обертка вызовет AddRef для pIUnkVTxt и освободит его, когда обертка будет разрушена. Приложение может пожедать вызвать pIUnkVTxt->Release после вызова Init.

HRESULT Init (
PCWSTR pszSite,
PCWSTR pszApplication,
PVOID pNotifyInterface,
IID IIDNotifyInterface,
DWORD dwFlags,
PVTSITEINFO pSiteInfo)

Инициализирует обертку и вызывает Register с указанными параметрами.

HRESULT Init (
PCWSTR pszApplication,
PIVTXTNOTIFYSINKW pNotifyInterface = NULL,
PCWSTR pszSite = NULL,
DWORD dwFlags = 0,
PVTSITEINFO pSiteInfo = NULL)

Инициализирует обертку и вызывает Register c указанными параметрами.

3.2. Методы атрибутов.

DeviceGet

HRESULT DeviceGet (DWORD *pdwDeviceID);
DWORD DeviceGet (void)

Получает идентификатор аудио-устройства вывода, используемого ГТ-расположением.

Возвращает NOERROR в случае успеха, или один из следующих кодов ошибки:
· VTXTERR_INVALIDMODE
· VTXTERR_INVALIDPARAM
· VTXTERR_OUTOFMEM

Параметр Описание
pdwDeviceID [out] Адрес переменной, которая принимает идентификатор устройства аудио-вывода, используемое ГТ-расположением

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


DeviceSet

HRESULT DeviceSet (DWORD dwDeviceID)

Устанавливает устройство аудио-вывода для использования ГТ-расположением.

Возвращает NOERROR в случае успеха или одно из следующих значений:
· VTXTERR_INVALIDMODE
· VTXTERR_INVALIDPARAM
· VTXTERR_OUTOFMEM

Параметр Описание
dwDeviceID [in] Идентификатор нового устройства аудио-вывода для использования ГТ-расположением

Приложение может получить список устройств посредством вызова функций мультимедиа waveOutGetNumDevs и waveOutGetDevCaps. Идентификатор устройства для расположения сохраняется между использованиями расположения.


EnabledGet

HRESULT EnabledGet (DWORD *dwEnabled);
DWORD EnabledGet (void)

Определяет, доступен или нет голосовой текст для ГТ-расположения. Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:
· VTXTERR_INVALIDMODE
· VTXTERR_INVALIDPARAM
· VTXTERR_OUTOFMEM

Параметр Описание
dwEnabled [out] TRUE если голосовой текст доступен для расположения или FALSE в противном случае.

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


EnabledSet

HRESULT EnabledSet (DWORD dwEnabled)

Дает или ограничивает доступ к голосовому тексту ГТ-расположению.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:
· VTXTERR_INVALIDMODE
· VTXTERR_INVALIDPARAM
· VTXTERR_OUTOFMEM

Параметр Описание
dwEnabled [in] TRUE чтобы дать доступ или FALSE чтобы забрать его.


IsSpeaking

HRESULT IsSpeaking (BOOL *pfSpeaking);
BOOL IsSpeaking (void)

Определяет, проговаривается ли текст в настоящий момент.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:
· VTXTERR_INVALIDMODE
· VTXTERR_INVALIDPARAM
· VTXTERR_OUTOFMEM

Параметр Описание
pfSpeaking [out] Адрес переменной, получающей текущий статус. Переменная получит TRUE, если TTS-движок произносит текст или FALE в противном случае

IsSpeaking связан с извещениями ITTSNotifySink::AudioStart and AudioStop.

IsSpeaking возвращает FALSE на короткое время между концом одного буфера в очереди и началом следующего из-за того, что аудио-вывод временно завис. Причиной этого может быть то, что объект голосового текста не получает результирующие данные от многих вызовов функции Speak прямо в TTS-движок. Вместо этого, объект сохраняет данные от каждого вызова в отдельном бфере, так чтобы строки приоритета VTXTSP_HIGH и VTXTSP_VERYHIGH могли быть вставлены в очередь в правильном месте. Например, приоритет VTXTSP_VERYHIGH может прервать строку с нормальным или высоким приоритетом. Прерванная строка обрабатывается после того, как будет обработана строка с очень высоким приоритетом.


SpeedGet

HRESULT SpeedGet (DWORD *pdwSpeed);
DWORD SpeedGet (void)

Получает текущую среднюю скорость речи для ГТ-расположения в словах в минуту. Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:
· VTXTERR_INVALIDMODE
· VTXTERR_INVALIDPARAM
· VTXTERR_OUTOFMEM

Параметр Описание
pdwSpeed [out] Адрес переменной, получающей скорость речи для ГТ-расположения

Скорость речи для расположения сохраняется между использованиями расположения.


SpeedSet

HRESULT SpeedSet (DWORD dwSpeed)

Устанавливает среднюю скорость речи для ГТ-расположения в словах в минуту.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:
· VTXTERR_INVALIDMODE
· VTXTERR_INVALIDPARAM
· VTXTERR_OUTOFMEM

Параметр Описание
dwSpeed [in] Новое значение скорости речи для расположения. Приложение может определить ее как TTSATTR_MINSPEED или TTSATTR_MAXSPEED для минимальной и максимальной возможных скоростей.

Скорость речи для расположения сохраняется между использованиями расположения.




3.3. DirectTextToSpeech API

3.3.1. Пример кода

Объект DirectTextToSpeech позволяет очень легко использовать TTS из С++, особенно для тех, кто не обладает опытом программирования COM. Для начала программа, использующая это самый COM, должна его инициализировать:

#include "windows.h"
#include "initguid.h"
#include "spchwrap.h"
#include "dsound.h"

int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{

CoInitialize(NULL);

Затем приложение создает новый объект режима (mode) и затем его инициализирует:

PCTTSMode pCTTSMode;
pCTTSMode = new CTTSMode;
if (!pCTTSMode)
return -1;

HRESULT hRes;
hRes = pCTTSMode->Init();
if (hRes)
return -1;

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

Следующая вещь, которую должно сделать приложение, чтобы заговорить:

hRes = pCTTSMode->Speak(L"Hello, World.");
if (hRes)
return -1;

MessageBox(NULL, "Hello, World.", "DirectTextToSpeech Example", MB_OK);

Когда этот кусок отработает, приложение освободит объекты и COM:

if (pCTTSMode)
delete pCTTSMode;

CoUninitialize();

return 0;

}

3.3.2. Класс CTTSMode.

Объект CTTSMode служит оберткой для TTS-движка (производимого поставщиком движка) и части объектов перечислений движка. Он обертывает все интерфейсы объекта TTS-режима. Объект TTS-режима представляет режимы движка, которые преобразуют текст в речь, пригодную для озвучивания. Движок обычно поддерживает набор TTS-режимов, которые могут использоваться для озвучивания текста посредством различных голосов или с различной скоростью. Объект движка поддерживается его поставщиком.

Конструктор

CTTSMode (void);

Деструктор

~CTTSMode (void);


Методы инициализации.


Если приложение намерено перенаправить звук куда-то кроме компьютерного звукового устройства по умолчанию, оно должно вызвать одну из функций InitAudioTest.

HRESULT InitAudioDestMM (DWORD dwDeviceID);

Инициализирует TTS на использование мультимедийного звукового устройства с указанным идентификатором.

HRESULT InitAudioDestDirect (LPUNKNOWN lpUnkDirect);

Инициализирует TTS-движок на использование DirectSound. Приложение должно передать в lpUnkDirect ссылку на библиотеку, и освободить ее при окончании работы движка.

HRESULT InitAudioDestObject (LPUNKNOWN lpUnk);

Инициализирует TTS-движок, использующий различные аудио-выходы. Приложение должно вызвать CoCreateInstance и инициализировать аудио-выход. Библиотека вызывает AddRef для lpUnk, а приложение может пожедать вызвать lpUnk->Release после вызова InitAudioDestObject.


Init

Приложению необходимо инициализировать TTS-режим. Вот несколько вариантов функции Init:

HRESULT Init (void)

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

HRESULT Init (GUID gMode)

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

HRESULT Init (TTSMODEINFOW *pTTSModeInfo, TSMODEINFORANK *pSRModeInfoRank = NULL)

Инициализирует TTS-движок, находя ближайший движок к требуемому в pTTSModeInfo.

HRESULT Init (LPUNKNOWN lpUnk)

Заставляет объект использовать существующий TTS-режим. lpUnk увеличивает количество ссылок (AddRef) и все ссылки освобождаются, когда разрушается объект. Приложение может вызвать lpUnk->Release после вызова Init.


Методы атрибутов.


PitchGet

HRESULT PitchGet (WORD *pwPitch);
WORD PitchGet (void);

Возвращает текущий базовый уровень высоты тона для TTS-режима.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:
· E_INVALIDARG
· E_OUTOFMEMORY
· TTSERR_NOTSUPPORTED
· TTSERR_VALUEOUTOFRANGE

Параметр Описание
pwPitch [out] Адрес переменной, получающей текущий базовый уровень высоты тона в герцах.

Если текст содержит управляющие тэги, действующий уровень высоты тона голоса обычно колеблется возле базового уровня. Тэг Pitch изменяет базовый уровень для режима, так же как если бы была вызвана функция PitchSet. Базовый уровень высоты тона по умолчанию – оптимальный уровень для режима.


PitchSet

HRESULT PitchSet (WORD wPitch);

Устанавливает базовый уровень высоты тона для TTS-режима.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:
· E_INVALIDARG
· E_OUTOFMEMORY
· TTSERR_NOTSUPPORTED
· TTSERR_VALUEOUTOFRANGE

Параметр Описание
wPitch [in] Новый базовый уровень высоты тона голоса в герцах. Если значение выходит за рамки, предусмотренные для движка, возвращается ошибка и уровень не изменяется. Приложение может использовать TTSATTR_MINPITCH и TTSATTR_MAXPITCH для максимального и минимального возможных значений

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


Phoneme

HRESULT Phoneme(VOICECHARSET eCharacterSet, DWORD dwFlags, SDATA dText, PSDATA pdPhoneme);

Переводит текст в фонемное представление, являющееся промежуточным шагом между Unicode-текстом и цифровыми аудио-данными.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:
· E_INVALIDARG
· E_OUTOFMEMORY
· TTSERR_INVALIDCHAR
· TTSERR_NOTSUPPORTED

Параметр Описание
eCharacterSet [in]Набор символов, используемый для конвертации текста. Параметр eCharacterSet должен быть одним из значений, приведенных ниже, хотя движок может поддерживать оба.
dwFlags [in]TTSDATAFLAG_TAGGED, если текст содержит управляющие тэги, или NULL, если текст не содержит тэги. Заметим, что «движковозависимый» набор символов может использовать тэговый протокол, отличный от используемого IPA. Это оставлено для дальнейшего расширения.
dText [in] Структура SDATA, которая содержит адрес заканчивающейся нулем строки, которую нужно конвертировать. Если движок поддерживает набор символов IPA, тэги могут использоваться для рассеивания слов, написанных IPA-фонемами среди слов в наборе символов данного языка. Приложение не должно менять эту память, пока функция не отработает.
pdPhoneme [out] Адрес структуры SDATA, которая получает указатель на фонемное представление текста, используя определенный набор символов. Текстовая строка должна заканчиваться нулем. Набор символов может быть широким или многобайтовым, в зависимости от используемого интерфейса (ITTSCentralW или ITTSCentralA). «Движковозависимый» набор символов должен соответствовать соглашению для широких или многобайтовых наборов символов.

eCharacterSet

Значение Смысл
CHARSET_ENGINEPHONETIC «Движковозависимый» фонетический набор символов
CHARSET_IPAPHONETIC Набор символов международного фонетического алфавита ( International Phonetic Alphabet, IPA).

CHARSET_TEXT не может быть использован как набор символов для конвертации.

Вызывающее приложение выделяет память для структуры SDATA и передает ее адрес Phoneme. Phoneme выделяет память (используя аллокатор задач OLE) для возвращаемых данных и помещает указатель на нее в атрибут pData структуры SDATA. Если память выделить не удается, pData устанавливается в NULL, а атрибут dwSize равен нулю. После вызова приложение должно освободить память, на которую указывает pData, также как и саму структуру SDATA.

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

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

Чтобы освободить память, выделенную этой функцией, вызывающей CoTaskMemAlloc , нужно вызвать CoTaskMemFree.


Register

HRESULT Register (PVOID pNotifyInterface, IID IIDNotifyInterface, DWORD *pdwKey);
HRESULT Register (PITTSNOTIFYSINKW pNotifyInterface, DWORD *pdwKey);

Регистрирует интерфейс ITTSNotifySink для движка, чтобы использовать для оповещения движка независимые от буфера TTS-события. Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:
E_INVALIDARG
E_OUTOFMEMORY
TTSERR_INVALIDINTERFACE

Параметр Описание
pNotifyInterface [in] Адрес интерфейса оповещения, посредством которого движок извещает приложение о независимой от буфера информации. Идентификатор интерфейса определен посредством IIDNotifyInterface. Из-за того, что передавая адрес движку, мы не передаем сам интерфейс опвещения, движок должен вызвать функцию AddRef интерфейса оповещения до того как вернет управление в Register. Движок должен также вызвать функцию Release этого интерфейса, когда фугкция ITTSCentral::UnRegister запрашивает переданный ключ. Вызывающее приложение должно освободить все счетчики ссылок, которыми оно управляет, если оно не нуждается в объекте оповещения после UnRegister.
IIDNotifyInterface [in] Идентификатор интерфейса, используемого для оповещения. В текущей разработке идентификатор должен быть IID_ITTSNotifySinkA (для ANSI) или IID_ITTSNotifySinkW (для Unicode). Движок может определить дополнительные значения для интерфейсов, поддерживаемых пользователем. Приложение может использовать идентификатор IID_ITTSNotifySink, чтобы получить ANSI или Unicode, в зависимости от умолчаний для приложения.
pdwKey [out] Адрес переменной, получающей ключ для интерфейса оповещения. Приложение должно передать этот ключ UnRegister, чтобы освободить интерфейс.

Приложение может вызывать Register многократно. Функция возвращает различные ключи каждый раз, когда она вызывается.

Приложение может использовать IID_ITTSNotifySink для ANSI или Unicode в зависимости от умолчаний для приложения.


TextData

HRESULT TextData (
VOICECHARSET eCharacterSet,
DWORD dwFlags, SDATA dText,
PVOID pNotifyInterface,
IID IIDNotifyInterface);

HRESULT TextData (
VOICECHARSET eCharacterSet,
DWORD dwFlags, SDATA dText,
PITTSBUFNOTIFYSINKW pNotifyInterface = NULL);

Начинает процесс конвертации текста в аудиоданные, пригодные для озвучивания.

Приложение может передать один или несколько управляющих тэгов без реального текста. Например: TextData с "\Rst\" будет работать.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:
· E_FAIL
· E_INVALIDARG
· E_OUTOFMEMORY
· TTSERR_INVALIDCHAR
· TTSERR_QUEUEFULL
· TTSERR_WAVEDEVICEBUSY

Параметр Описание
eCharacterSet [in] Набор символов, который должен быть использован для конвертации текста. Если движок не поддерживает набор, он возвратит ошибку.Параметр eCharacterSet должен быть одним из значений приведенных ниже.
dwFlags [in] TTSDATAFLAG_TAGGED если текст содержит управляющие тэги или ноль в противном случае. Заметим, что «движковозависимый» фонемный набор символов может использовать тэговый протокол, отличный от IPA.
dText [in] Структура SDATA . Параметр структуры pData содержит строку, заканчивающуюся нулем, с текстом, который должен быть озвучен. Параметр структуры dwSize определяет длину строки с учетом завершающего NULL. Из-за того, что TextData копирует этот текст в один или более TTS-буферов, приложение может освободить исходный буфер сразу же после возврата из функции. Когда движок закончит обработку последнего TTS-буфера, он оповестит приложение, ITTS_BufNotifySink::TextDataDone.
Движок не ожидает аудио-объект,чтобы закончить говорить до вызова TextDataDone. Размер TTS-буфера определяется движком. Если движок не может зарезервировать достаточно памяти для TTS-буфера, он должен E_OUTOFMEMORY.
Если dText содержит пустую строку или NULL, движок вернет NOERROR и опошлеет два извещения: ITTSBufNotifySink::TextDataStarted и ITTSBufNotifySink::TextDataDone.
pNotifyInterface[in] Адрес интерфейса оповещения, посредством которого движок извещает приложение о состоянии TTS-буфера. Идентификатор интерфейса определяется IIDNotifyInterface. Если приложение не требует извещений, этот параметр может быть равен NULL.
Из-за того, что передаваемый адреc не содержит собственно интерфейс оповещения, движок должен вызвать функцию AddRef интерфейса оповещения до возврата TextData. Движок должен также вызвать функцию Release, когда интерфейс закрывается. Вызывающее приложение должно осоводить все счетчики ссылок, которые оно поддерживает для интерфейса оповещения после вызова TextData, если оно не собирается использовать объект оповещения в дальнейшем.
IIDNotifyInterface [in] Идентификатор интерфейса, используемого для оповещения. В текущей разработке идентификатор должен IID_ITTSBufNotifySinkA (для ANSI) или IID_ITTSBufNotifySinkW (для Unicode). Движок может определить дополнительные значения поддерживаемых интерфейсов.


Speak

HRESULT Speak (
PCWSTR pszSpeak,
BOOL fTagged = FALSE,
PITTSBUFNOTIFYSINKW pNotifyInterface = NULL);

Проговаривает текст, обрабатывая тэги, если fTagged равен TRUE.


UnRegister

HRESULT UnRegister (DWORD dwKey);

Позволяет приложению освободить интерфейс оповещения, через который движок посылает TTS-сообщения в приложение.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:

· E_INVALIDARG
· E_OUTOFMEMORY
· TTSERR_INVALIDKEY

Параметр Описание
dwKey [in]Значение ключа, возвращаемое Register для интерфейса оповещения, когда приложение регестрирует интерфейс.

Приложение должно вызвать UnRegisterдо до закрытия объекта движка.



3.3.3. Класс CTTSEnum.


Объект CTTSEnum является оберткой для объекта перечисления. Он обертывает все интерфейсы объекта TTS-перечисления.

Объект TTS-перечисления перечисляет TTS-режимы, предоставляемые всеми движками, доступными приложению. Приложение использует TTS-перечисление, чтобы выбрать TTS-режим и создать объект движка, предоставляющий этот режим в программу. TTS-перечисление поддерживается Microsoft.

Конструктор

CTTSEnum (void);

Деструктор

~CTTSEnum (void);


Методы инициализации

Init

HRESULT Init (void);

Приложению нужно вызвать Init до использования объекта.

· HRESULT Init (void) Инициализирует перечисление, создавая новый объект перечисления.

HRESULT Init (LPUNKNOWN lpUnkEnum)

Базирует объект перечисления на существующем COM-объекте. lpUnkEnum увеличивает счетчик ссылок (AddRef) и освобождается, когда объект перечисления разрушается.


Методы перечисления

Clone

CTTSEnum* Clone (void);

Получает новое перечисление, содержащее тот же статус перечисления, что и текущее.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:

· E_INVALIDARG
· E_OUTOFMEMORY
· E_UNEXPECTED

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

Next

HRESULT Next (ULONG uNum, PTTSMODEINFOW pTTSModeInfo, ULONG *uFound = NULL);

HRESULT Next (PTTSMODEINFOW pTTSModeInfo);

Получает конкретный номер элемента в последовательности перечислении.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:

· E_INVALIDARG
· E_OUTOFMEMORY
· E_UNEXPECTED
· S_FALSE
· S_OK

Reset

HRESULT Reset (void);

Сбрасывает последовательность перечисления на начало.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:
· S_FALSE
· S_OK

Select

HRESULT Select (GUID gModeID, PCTTSMode *ppCTTSMode, LPUNKNOWN pUnkAudio = NULL);

Выбирает движок. Обратите внимание, что метод возвращает pCTTSMode. Объект режима уже инициализирован.

Выбирает TTS-режим и создает объект движка, представляющий выбранный режим.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:
· E_INVALIDARG
· E_OUTOFMEMORY
· TTSERR_INVALIDMODE
· TTSERR_OUTOFDISK
· TTSERR_WAVEFORMATNOTSUPPORTED

Параметр Описание
gModeID [in] Глобально уникальный идентификатор (GUID) из структуры TTSMODEINFO для текущего выбранного TTS-режима. Функция создает объект движка, чтобы представлять этот режим.
ppCTTSMode [out] Адрес переменной, получающей указатель на интерфейс ITTSCentral для вновь созданного объекта движка.
pUnkAudio [in] Адрес объекта CTTSMode для звуко-ориентированного объекта, обеспечивающего цифровые аудио-данные для объекта движка. Движок вызывает AddRef для интерфейса и освобождает интерфейс, когда движок разрушается. Из-за этого приложение должно вызвать Release для аудио-объекта после выбора, какой объект – телефонный или аудио будет использоваться.

После того как приложение перечислит TTS-режимы и определит, какой именно использовать, оно вызывает Select, чтобы создать объект движка.

Как только объект движка будет инициализирован, он вызывает интерфейс IAudio звуко-ориентированного объекта, определенного посредством pUnkAudio, чтобы определить, который из двух видов устройст вывода будет использоваться. Если это возможно, функция вернет объект CTTSMode для вновь созданного объекта движка. Иначе, объект движка освободит сам себя и функция Select возвратит ошибку.

После создания объекта движок вызывает IAudio::PassNotify, чтобы передавать свои собственные извещения звуко-ориентированному объекту. Передача шлюза оповещения звуко-ориентированному объекту позволяет объекту извещать движок, когда звуковые данные закончили воспроизводиться. Когда все ссылки на объект движка освобождены, объект движка вызывает IAudio::Release.

Мультимедийный звуко-ориентированный объект может использоваться для передачи аудио-данных устройству звукового вывода. Функция Select передает интерфейс IUnknown раньше, чем интерфейс IAudioDest, поэтому, хотя все устройства должны поддерживать IAudioDest, некоторые движки могут использовать пользовательские интерфейсы, чтобы работать со специальными устройствами и драйверами и IUnknown может быть использован, чтобы получить такой интерфейс..

Параметр pIUnknownForAudio получается в результате использования функции CoCreateInstance. Из –за того, что счетчик ссылок начинается с 1, интерфейс должен быть освобожден после того как отработает Select.

Работа с звуко-ориентированным объектом ведется внутри функции Select, поэтому, если Select отработала без ошибок, контакт с ним успешно установлен.

Skip

HRESULT Skip (ULONG uNum = 1);

Перепрыгивает через заданное число элементов в последовательности.

Возвращает NOERROR в случае успеха, иначе – один из следующих кодов:

· E_INVALIDARG
· E_OUTOFMEMORY
· E_UNEXPECTED
· S_FALSE
· S_OK

Параметр Описание
uNum [in] Число элементов, которое должно быть перепрыгнуто

Find

HRESULT Find (PTTSMODEINFOW pTTSFind, PTTSMODEINFORANK pRank, PTTSMODEINFOW pTTSFound);

HRESULT Find (PTTSMODEINFOW pTTSFind, PTTSMODEINFOW pTTSFound);

Ищет TTS-режим, который наиболее точно соответсвует желаемым характеристикам. Returns NOERROR, if successful, or one of these error values:

· E_FAIL
· E_INVALIDARG
· E_OUTOFMEMORY
· TTSERR_INVALIDMODE

Параметр Описание
pTTSFind [in] Адрес структуры TTSMODEINFO, содержащей желаемые характеристики structure.
pRank [in] Адрем структуры TTSMODEINFORANK, содержащей относительную важность каждой характеристики. Если этот параметр равен NULL, объект использует умолчания, предоставляемые движком.
pTTSFound [out] Адрес структуры TTSMODEINFO, получающей информацию о найденном TTS-режиме. Имеет значение только если не возврашается ошибка.

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



3.3.4. Структуры данных.


TTSMODEINFO

typedef struct { // ttsmi
GUID gEngineID;
WCHAR szMfgName[TTSI_NAMELEN];
WCHAR szProductName[TTSI_NAMELEN];
GUID gModeID;
WCHAR szModeName[TTSI_NAMELEN];
LANGUAGE language;
WCHAR szSpeaker[TTSI_NAMELEN];
WCHAR szStyle[TTSI_STYLELEN];
WORD wGender;
WORD wAge;
DWORD dwFeatures;
DWORD dwInterfaces;
DWORD dwEngineFeatures;
} TTSMODEINFO, *PTTSMODEINFO;

Обеспечивает детальную информацию о TTS-режиме, поддерживаемом конкретным движком.

Параметр Описание
gEngineID Глобально уникальный идентификатор (GUID) движка. GUID может быть сгенерирован случайным образом используя GUIDGEN.EXE, который поставляется с OLE Software Development Kit (SDK). Один идентификатор движка могут иметь более одного режима. В этом случае движок способен говорить на разных языках или разными голосами.
szMfgName Название производителя, например "Acme Corporation."
szProductName Название продукта, например "Acme's Talk-O-Matic."
gModeID GUID, который уникально идентифицирует режим. Эти цифры гарантированно должны быть уникальны, так что нет необходимости выводить или записывать их. В добавок, GUID не сохраняется и не используется OLE, поэтому нет необходимости загружать его в реестр
szModeName Название TTS-режима

Название TTS-режима должно иметь вид: "Описание голоса (возраст, пол и т.д..), язык, [частота речи,] название производителя движка[, номер версии]".

Например, "Mike (Male #1), US English, Microsoft".

language Структура LANGUAGE, содержащая название языка и диалекта
szSpeaker Название голоса или NULL, если имя не существенно.
szStyle Особенности голоса,:

· "Business" (деловой)
· "Casual" (удивленный)
· "Computer" (компьютерный)
· "Excited" (взволнованный)
· "Singsong" (поющий)

wGender Пол голоса. Значение wGender должно быть одним из представленных ниже.
wAge Возраст голоса. Должен быть одним из представленных ниже.
dwFeatures Доступные TTS-свойства. Может быть комбинацией значений, приведенных ниже.
dwInterfaces Интерфейсы, поддерживаемые движком. Может быть комбинацией значений, приведенных ниже.
dwEngineFeatures Свойства, специфичные для данного движка. Эти значения определяются автором движка..

wGender Значение Смысл
GENDER_FEMALE Женский пол
GENDER_MALE Мужской пол
GENDER_NEUTRAL Неопределенный пол

wAge Значение Смысл
TTSAGE_BABY Около 1 года
TTSAGE_TODDLER Около 3 лет
TTSAGE_CHILD Около 6 лет
TTSAGE_ADOLESCENT Около14 лет
TTSAGE_ADULT Между 20 и 60 годами
TTSAGE_ELDERLY Старше 60 лет

dwFeatures Значение Смысл
TTSFEATURE_ANYWORD Движок может пытаться прочитать любое слово.
TTSFEATURE_SAPI4 Сообщает, что движок настроен на SAPI 4 . Настройка на SAPI 4 означает, что он поддерживает все требуемые интерфейсы, определенные в документе и может пройти тест TTSFUNC , включенный в SAPI SDK.
TTSFEATURE_FIXEDAUDIO Аудио-вывод для этого устройства фиксирован, поэтому не требуется выбирать объект аудио-вывода. Если аудио-вывод пропущен, он будет проигнорирован. Посредством этого могут поддерживаться внешние устройства, такие как синтезатор.
TTSFEATURE_IPATEXTDATA TextData поддерживает фонемы IPA в то время когда используется CHARSET_IPAPHONETIC. Приложение может использовать это, чтобы идентифицировать TTS-движок, который может произносить слова исключительно из произношения.
TTSFEATURE_IPAUNICODE Функция движка ITTSCentral::Phoneme поддерживает голосовой набор символов CHARSET_IPAPHONETIC и возвратит фонемное представление, используя Международный Фонетический Алфавит (IPA) в Unicod. Заметим, что должна быть вызвана Unicode-версия Phoneme, даже если этот флаг установлен.
TTSFEATURE_PCOPTIMIZED Голос настроен для работы на компьютере, обеспечивающем лучшее качество звука
TTSFEATURE_PHONEOPTIMIZED Голос разработан, чтобы работать с телефоном и использует частоту дискретизации 8 КГц.
TTSFEATURE_PITCH Движок может подстраивать высоту тона голоса во время звучания речи.
TTSFEATURE_PREFERRED Голос является одним из предпочтительных голосов в множестве, предоставляемом поставщиком из –за своих реалистичности и качества. ITTSFind будет использовать предпочтительные голоса вместо непредпочтительных все время пока они соответсвуют критериям поиска.
TTSFEATURE_SINGLEINSTANCE Движок представляет собой одиночный объект и поэтому только один объект режима может существовать в любой момент времени. Здесь используются TTS-движки типа .EXE.
TTSFEATURE_SPEED Движок может подстраивать скорость речи во время ее звучания.
TTSFEATURE_TAGGED Движок может интерпретировать тест с тэгами, чтобы управлять голосом.
TTSFEATURE_THREADSAFE Движок полностью защищен потоком и может использоваться из других потоков.
TTSFEATURE_TRANSPLANTED Поддерживаются перенесенные просодии.
TTSFEATURE_VISUAL Движок может обеспечивать информацию о положении губ для голоса.
TTSFEATURE_VOLUME Движок может подстраивать громкость голоса.
TTSFEATURE_WORDPOSITION Движок посылает извещения по позиции слова.

dwInterface Значение Смысл
TTSI_ILEXPRONOUNCE Интерфейс ILexPronounce
TTSI_ITTSATTRIBUTES Интерфейс ITTSAttributes
TTSI_ITTSCENTRAL Интерфейс ITTSCentral
TTSI_ITTSDIALOGS Интерфейс ITTSDialogs

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

LANGUAGE

typedef struct { // lang
LANGID LanguageID;
WCHAR szDialect [LANG_LEN];
} LANGUAGE, FAR *PLANGUAGE;

Содержит название языка и диалекта. Строки языка и диалекта не зависят от регистра.

Параметр Описание
LanguageID Языковой идентификатор определен для Win32 API. Биты с 0 по 9 идентифицируют первичный язык, такой как английский, испанский, французский, русский и т.д. Биты с 10 по 15 указывают подъязык. Например, португальский имеет два подъязыка: бразильский и стандартный.
szDialect Диалект, специфичный для языка, напрмер, "Вологда" или "Курск". Строка диалекта может быть любой. Этот параметр может быть равен "Standard" для стандартного диалекта, используемого средствами радио и телевидения.

SDATA

typedef struct { // sdata
PVOID pData;
DWORD dwSize;
} SDATA, *PSDATA;

Содержит адрес буфера данных и объем данных в буфере. Приложение использует эту структуру, чтобы передавать данные различным API-функциям.

Параметр Описание
pData Адрес буфера, содержащего данные.
dwSize Размер, в байтах, данных в буфере, определенном посредством pData.


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