gpt4 book ai didi

C++ 和 Microsoft SAPI 5 : How to list all available voices and select a voice

转载 作者:搜寻专家 更新时间:2023-10-31 01:08:46 40 4
gpt4 key购买 nike

首先,C++ 不是我的语言(我是 java 程序员)。

我看过 Microsoft SAPI 5.1 的示例,我需要一种方法来打印机器中所有可用的语音。我看过 Object token SAPI,我有点混淆 CComPtr 是如何用于迭代的。谁能帮我这个。此外,如何选择特定语音而不是使用默认语音。

根据示例,您可以通过调用以下代码来获取默认语音:

ISpVoice * pVoice = NULL;

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

HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);

简而言之:如何列出所有可用的语音以及如何选择语音?

//PS:我不需要将它放在组合框中(就像我见过的所有示例一样),我正在为 JNI dll 库实现它,所以更喜欢迭代的例子。

最佳答案

首先,CComPtr 是对 COM 接口(interface)的智能指针抽象,而不是枚举器。

要列出所有声音,需要枚举SPCAT_VOICES中的token类别。

HRESULT hr = S_OK;
CComPtr<ISpObjectTokenCategory> cpSpCategory = NULL;
if (SUCCEEDED(hr = SpGetCategoryFromId(SPCAT_VOICES, &cpSpCategory)))
{
CComPtr<IEnumSpObjectTokens> cpSpEnumTokens;
if (SUCCEEDED(hr = cpSpCategory->EnumTokens(NULL, NULL, &cpSpEnumTokens)))
{
CComPtr<ISpObjectToken> pSpTok;
while (SUCCEEDED(hr = cpSpEnumTokens->Next(1,&pSpTok, NULL))))
{
// do something with the token here; for example, set the voice
pVoice->SetVoice(pSpTok,FALSE);
// NOTE: IEnumSpObjectTokens::Next will *overwrite* the pointer; must manually release
pSpTok.Release();
}
}
}

如果您想选择特定的声音,您需要指定该声音独有的属性。 EnumTokens允许您指定必需的和可选的属性。属性实际上是由语音的创建者定义的,但一些公共(public)属性是

  • 姓名(例如,“Microsoft Anna”)
  • 语言(由数字区域设置 ID 指定)
  • 性别(男/女)
  • 供应商(创建语音的公司名称)

因此要指定“Microsoft Anna”而不是任何语音,您可以使用

if (SUCCEEDED(hr = cpSpCategory->EnumTokens(L"Name=Microsoft Anna", NULL, &cpSpEnumTokens))) 

代替

if (SUCCEEDED(hr = cpSpCategory->EnumTokens(NULL, NULL, &cpSpEnumTokens))) 

关于C++ 和 Microsoft SAPI 5 : How to list all available voices and select a voice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17675177/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com