windows-nt/Source/XPSP1/NT/enduser/speech/tts/prompts/engine/phonecontext.h

240 lines
5.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//////////////////////////////////////////////////////////////////////
// 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_)