2014-01-19 84 views
0

我不知道我可以如何设置一些不同的声音?是!我读MSDN,它并没有帮助如何设置声音SAPI5

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; 
} 
+0

有一个例子[here](http://msdn.microsoft.com/en-us/library/ms719807(v = vs.85).aspx)。 – chris

+0

有没有例子,我可以选择我的声音! – gek0n

+0

那么你对对象令牌有什么问题? –

回答

2

SAPI中的声音通过ISpObjectToken选择。通常,一个使用了辅助函数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(如果这是在厂商指定的供应商)
  • 名称默认声音(代表语言无关的名称)
0123字符串

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

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

+0

非常感谢!这很有帮助 – gek0n