2

まず第一に、C++ は私の言語ではありません (私は Java プログラマーです)。

Microsoft SAPI 5.1 の例を見てきましたが、マシンで利用可能なすべての音声を出力する方法が必要です。SAPI のObject トークンを見たことがありますが、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 ライブラリ用にこれを実装しているので、反復の例を使用することをお勧めします。

4

2 に答える 2

4

まず、CComPtr は列挙子ではなく、COM インターフェイスを介したスマート ポインターの抽象化です。

すべてのボイスを一覧表示するには、 SPCAT_VOICESカテゴリのトークンを列挙する必要があります。

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を使用すると、必須およびオプションの属性を指定できます。属性は実際にはボイスの作成者によって定義されますが、いくつかの一般的な属性は次のとおりです。

  • 名前 (例: "Microsoft Anna")
  • 言語 (数値のロケール ID で指定)
  • 性別男性女性)
  • ベンダー(音声を作成した会社名)

したがって、任意の音声の代わりに "Microsoft Anna" を指定するには、次のように使用します。

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

それ以外の

if (SUCCEEDED(hr = cpSpCategory->EnumTokens(NULL, NULL, &cpSpEnumTokens))) 
于 2013-07-16T17:58:20.637 に答える
0

enum メソッドは機能しますが、少し扱いに​​くいです。最良の方法は、レジストリを開いてキーとその属性を確認することです。詳細については、次を参照してください。

msdn: SAPI トークン、カテゴリ、およびレジストリ

繰り返しますが、それはちょっとした作業なので、何か他のことをしながらインターフェイスを作成しました。それはあなたや他の誰かを助けるかもしれません:

音声トークンを列挙および検索するための Sapi インターフェイス

于 2016-03-08T13:02:37.157 に答える