如何设置语音SAPI5

时间:2014-01-19 17:32:54

标签: c++ voice sapi

我没有意识到我怎么能设置一些不同的声音?是!我读过MSDN,它没有帮助

ISpVoice * pVoice = NULL,* pv1 = NULL;

if (FAILED(::CoInitialize(NULL)))
    return FALSE;


HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
    pVoice->SetVolume(100);
    //pVoice->SetVoice();
    hr = pVoice->Speak(L"Hello papa", SPF_IS_XML, NULL);
    pVoice->Release();
    pVoice = NULL;
}

1 个答案:

答案 0 :(得分:2)

通过ISpObjectToken选择SAPI中的语音。通常使用辅助函数SpFindBestToken来查找最佳标记,然后使用ISpVoice :: SetVoice()来选择该标记:

ISpObjectToken* cpToken(NULL);
SpFindBestToken(SPCAT_VOICES, szRequiredAttribs, L"", &cpToken);
pVoice->SetVoice(cpToken);
cpToken->Release();

现在,唯一的问题是您需要为szRequiredAttribs传递的内容。这需要是以分号分隔的属性列表。有关SAPI语音属性的最佳文档,请参见Object Tokens and Registry Settings白皮书,特别是“语音”部分。在那里,它说所有声音都必须支持以下属性:

  • 供应商(TTS引擎供应商名称)
  • 语言(此引擎所说语言的十六进制LCID)
  • 性别(如果是男性话,价值应该是“男性”,如果是男性,则应为“女性”)
  • VendorPreferred(如果这是供应商中指定的供应商的默认语音)
  • 名称(表示语言无关名称的字符串)

这不是属性的独家列表;其他属性可以由供应商定义。

因此,如果您想要Microsoft的首选语音,您可以设置szRequiredAttribs = L"vendor=microsoft;vendorpreferred"。如果您想要男声(来自任何供应商),请设置szRequiredAttribs = L"gender=male"