|
|
//////////////////////////////////////////////////////////////////////
// PhoneContext.h: interface for the CPhoneContext class.
//
// Created by JOEM 04-2000
// Copyright (C) 2000 Microsoft Corporation
// All Rights Reserved
//
/////////////////////////////////////////////////////// JOEM 4-2000 //
#if !defined(AFX_PHONECONTEXT_H__9E560692_45A6_4472_B0F9_31AD3F6157B8__INCLUDED_)
#define AFX_PHONECONTEXT_H__9E560692_45A6_4472_B0F9_31AD3F6157B8__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "common.h"
#include "MSPromptEng.h"
enum PHONE_CONTEXT_TAG_ID { START_TAG, END_TAG, RIGHT_TAG, LEFT_TAG };
struct CONTEXT_PHONE_TAG { PHONE_CONTEXT_TAG_ID iPhoneTag; WCHAR* pszPhoneTag; };
static const CONTEXT_PHONE_TAG g_Phone_Tags[] = { { START_TAG, L"START_PHONE" }, { END_TAG, L"END_PHONE" }, { RIGHT_TAG, L"RIGHT_CONTEXT" }, { LEFT_TAG, L"LEFT_CONTEXT" } };
struct Macro { WCHAR name[32]; double value; };
struct CPhoneClass { WCHAR* m_pszPhoneClassName; WCHAR** m_pppszPhones; USHORT m_unNPhones; double m_dWeight; };
struct CContextRule { WCHAR* m_pszRuleName; USHORT m_unNPhoneClasses; CPhoneClass** m_pvPhoneClasses; };
//--- START OF DEFAULT PHONE CONTEXT RULES -----------------------------
// The following are used for default US English context rules.
#define MAX_RULES 15
static WCHAR* g_macros[] = { L"%NoMatchWeight 5.0", L"%BadMatchWeight 3.0", L"%GoodMatchWeight 1.0", L"%MatchWeight 0.0" };
static const USHORT g_nMacros = sizeof(g_macros)/sizeof(g_macros[0]);
enum RULE_CODES { main, phone, consonant, velar, alveolar, palatal, deltal, labial, labiodental };
struct RULE { RULE_CODES code; WCHAR* name; WCHAR* rule[MAX_RULES]; };
static const RULE g_rules[] = { // main rule - these four classes are mandatory
{ main, L"main", { L"none {} %NoMatchWeight", L"all {} %MatchWeight", L"silence { sp sil } %MatchWeight", L"phone { uw uh oy ow iy ih ey eh ay ax aw ao ah ae aa zh \
z y w v th t sh s r er p ng n m l k jh g \ f dh d ch b h } %BadMatchWeight" } },
// phone rule
{ phone, L"phone", { L"vowel { uw uh oy ow iy ih ey eh ay ax aw ao ah ae aa } %GoodMatchWeight", L"consonant { zh z y w v th t sh s r er p ng n m l k jh g f dh d ch b h } %BadMatchWeight" } },
// consonant rule
{ consonant, L"consonant", { L"nasal { m ng n } %GoodMatchWeight", L"lateral { l } %GoodMatchWeight", L"retroflex { er r } %GoodMatchWeight", L"velar { k g } %BadMatchWeight", L"alveolar { z s t d } %BadMatchWeight", L"palatal { zh sh ch jh } %BadMatchWeight", L"dental { dh th } %BadMatchWeight", L"labial { b p } %BadMatchWeight", L"labiodental { v f } %BadMatchWeight", L"glide { w y } %GoodMatchWeight" L"glottal { h } %GoodMatchWeight" } },
// velar rule
{ velar, L"velar", { L"voiced { g } %GoodMatchWeight", L"unvoiced { k } %GoodMatchWeight" } },
// alveolar rule
{ alveolar, L"alveolar", { L"voiced { z d } %GoodMatchWeight", L"unvoiced { s t } %GoodMatchWeight" } },
// palatal rule
{ palatal, L"palatal", { L"voiced { zh jh } %GoodMatchWeight", L"unvoiced { sh ch } %GoodMatchWeight" } },
// deltal rule
{ deltal, L"deltal", { L"voiced { dh } %GoodMatchWeight", L"unvoiced { th } %GoodMatchWeight" } },
// labial rule
{ labial, L"labial", { L"voiced { b } %GoodMatchWeight", L"unvoiced { p } %GoodMatchWeight" } },
// labiodental rule
{ labiodental, L"labiodental", { L"voiced { v } %GoodMatchWeight", L"unvoiced { f } %GoodMatchWeight" } }, };
static const USHORT g_nRules = sizeof(g_rules) / sizeof(g_rules[0]);
//--- END OF DEFAULT PHONE CONTEXT RULES -------------------------------
class CPhoneContext { public: HRESULT LoadDefault(); CPhoneContext(); ~CPhoneContext(); STDMETHOD(Load)(const WCHAR* pszPathName); STDMETHOD(Apply)(IPromptEntry* pPreviousEntry, IPromptEntry* pCurrentEntry, double* pdCost); void DebugContextClass();
private: void DeleteContextRule(CContextRule* pRule); void DeletePhoneClass(CPhoneClass* pClass); STDMETHOD(ApplyRule)(const CContextRule* pRule, const WCHAR* pszPhone, WCHAR** ppszNextRule); STDMETHOD(GetWeight)(const CContextRule* pRule, const WCHAR* pszName, double* pdCost); STDMETHOD(ApplyPhoneticRule)(const WCHAR* pszPhone, const WCHAR* pszContext, double* pdCost); STDMETHOD(SearchPhoneTag)(IPromptEntry* DbEntry, const WCHAR** result, CONTEXT_PHONE_TAG phoneTag); STDMETHOD(AddPhoneToClass)(CPhoneClass* phClass, WCHAR *phone); STDMETHOD(CreatePhoneClass)(CPhoneClass*** pppClasses, USHORT* punClasses, const WCHAR *psz); STDMETHOD(ReadMacro)(const WCHAR* pszText, Macro** ppMacros, USHORT* punMacros); STDMETHOD(ParsePhoneClass)(const Macro *pMacros, const USHORT unMacros, CContextRule* pRule, WCHAR **ppszOrig); STDMETHOD(CreateRule)(const WCHAR* pszText); STDMETHOD(FindContextRule)(const WCHAR* pszName, CContextRule** ppRule);
private: ULONG m_ulNRules; CContextRule** m_ppContextRules;
};
#endif // !defined(AFX_PHONECONTEXT_H__9E560692_45A6_4472_B0F9_31AD3F6157B8__INCLUDED_)
|