<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
本控件是本人基于微软公司的 Speech SDK 5.1开发包,独立开发的。
使用必备条件:开发平台必须安装微软的 Speech SDK 5.1。
语音输入法:即嘴巴打字、麦克风输入法。它可以认为是目前世界上最简便、最易用的输入法,只要你会说话,它就能打字。它是一款功能齐全、界面友好、易学易用、可以快速方便的进行语音输入的软件。我们在分析了市场上众多语音输入系列软件基础上进行设计的,因此它吸取了市场上众多语音输入软件的优点,同时去除和改进了它们的一些缺点,增加了软件的可用性、舒适性。语音输入法核心模块采用 Microsoft Speech SDK5.1 的 GetAlternates 函数和 GetText 函数实现,实现简单方便,它是建立在语音识别的基础上采用 ISpPhraseAlt *pcpPhraseAlt[] 语音数组进行轮询获取相似语法后,再进行文字的提取。代码简单但功能却很强大!
本文的语音输入法模块是采用vc6.0开发的dll,界面采用Borland C++Builder2006开发的
核心代码详述如下,其它外围代码请看优快云/MSDN其它详细介绍!
... ...
// 语法数组
ISpPhraseAlt *pcpPhraseAlt[MY_MAX_ALTERNATES];
// 获取输入的语法
hr = pPhrase->GetPhrase(&m_SpPhrase);
if (FAILED(hr))
{
m_sError=_T(" 语音输入法获取语法出错 ! ");
return 0;
}
// 获取首个识别字
hr = pPhrase->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &pwszFirstWord, NULL);
// 获取其他发音相似字 , 进行语法轮询 , 提取发音相似的文法
hr = pPhrase->GetAlternates(m_SpPhrase->Rule.ulFirstElement,
m_SpPhrase->Rule.ulCountOfElements,
MY_MAX_ALTERNATES,
pcpPhraseAlt,
&ulCount);
if (SUCCEEDED(hr))
{
for (ULONG i = 0; i < ulCount; i++)
{
// 获取每个语法的文字
hr =pcpPhraseAlt[i]->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &pwszAlternate, NULL);
if (SUCCEEDED(hr))
{
if (wcscmp(pwszAlternate,L"")!=0) // 不为空
{
strTemp+=W2A(pwszAlternate);
// 用 '#' 隔开每个音形字 , 组成一串文字用于进程间文字参数的传递(即将获取的文字从VC开发的dll传递到C++Builder2006开发的主界面上)
strTemp+="#";
ulIndex++;
}
}
}
}
m_strWords=strTemp;
... ...
详细核心源代码如下:
//函数 名:bool CSpeechRecognition::GetAlternatesEx(WCHAR **ppszFirstWord,WCHAR **ppszCoMemText)
//编写 者:南才北往,Frank_Huang
//参考资料: Speech SDK5.1 帮助文档
//函数功能:获取发音相似的多个识别字.
//输入参数:ppszFirstWord - 获取首个识别字 ; pstrOtherWords - 其他音形字
//返回 值:ULONG -语音相似字的个数
//备 注:用于语音输入法
///
ULONG CSpeechRecognition::GetAlternatesEx(ISpRecoResult *pPhrase)
{
USES_CONVERSION;
HRESULT hr = S_OK;
SPPHRASE *m_SpPhrase;
CString strTemp="";
ULONG ulIndex=0;//语音识别文字的实际个数
ULONG ulCount=0;//语音识别文字的总个数
WCHAR *pwszAlternate=L"";
WCHAR *pwszFirstWord=L"";
ISpPhraseAlt *pcpPhraseAlt[MY_MAX_ALTERNATES];
hr = pPhrase->GetPhrase(&m_SpPhrase);
if (FAILED(hr))
{
m_sError=_T("语音输入法获取语法出错! ");
return 0;
}
hr = pPhrase->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &pwszFirstWord, NULL);
if (SUCCEEDED(hr))
{
if (wcscmp(pwszFirstWord,L"")!=0)
wcscpy ( m_wchFirstWord, pwszFirstWord );//语音词组首个识别字
else
wcscpy ( m_wchFirstWord, L"Can`t get the first word! " );//语音词组首个识别字
}
hr = pPhrase->GetAlternates(m_SpPhrase->Rule.ulFirstElement,
m_SpPhrase->Rule.ulCountOfElements,
MY_MAX_ALTERNATES,
pcpPhraseAlt,
&ulCount);
if (SUCCEEDED(hr))
{
for (ULONG i = 0; i < ulCount; i++)
{
hr = pcpPhraseAlt[i]->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &pwszAlternate, NULL);
if (SUCCEEDED(hr))
{
if (wcscmp(pwszAlternate,L"")!=0)//不为空
{
strTemp+=W2A(pwszAlternate);
strTemp+="#";//用'#'隔开每个音形字
ulIndex++;
}
}
}
}
m_strWords=strTemp;
// 释放资源
if (pwszAlternate) ::CoTaskMemFree(pwszAlternate);
if (pwszFirstWord) ::CoTaskMemFree(pwszFirstWord);
if (m_SpPhrase) ::CoTaskMemFree(m_SpPhrase);
for (ULONG i=0;i<ulCount;i++)
{
pcpPhraseAlt[i]->Release();
pcpPhraseAlt[i]=NULL;
}
return ulIndex;
}