1

Microsoft SAPI TTS を使用してアプリケーションを開発できるように、最近 Visual Studio 2015 (Community) をダウンロードしました。5.1 SDK をインストールしてから 5.4 SDK for Speech をインストールし、Runtime Languages for SAPI をインストールしました。

これまでのところ、直接の引数と SSML .XML ファイルの読み取りの両方で SAPI に話させたいフレーズを使用することで、なんとかアプリを機能させることができました。音声トークンの変更に関するものを除いて、SAPI と SSML のすべての機能が機能します。(例: <voice xml:lang="pl-PL">... <voice required="Gender:Female">...など)

言語/音声トークンの設定方法に関するいくつかのフォーラムを読み、次のコードを試しました。

if(FAILED(::CoInitialized(NULL))
  return false;

HRESULT                         hr = S_OK;
CComPtr<ISpVoice>               cpVoice;
CComPtr<ISpObjectTokenCategory> cpObjectCat;
CComPtr<ISpObjectToken>         cpObjectToken;
CComPtr<IEnumSpObjectTokens>    cpEnum;

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

if(SUCCEEDED(hr))
{
    hr = SpGetDefaultTokenFromCategoryId(SPCAT_VOICES, &cpObjectToken);
} 
if(SUCCEEDED(hr))
{
    hr = SpGetCategoryFromId(SPCAT_VOICES, &cpObjectCat);
}
if(SUCCEEDED(hr))
{
    hr = cpObjectCat->EnumTokens(NULL, NULL, &cpEnum);
}
if(SUCCEEDED(hr))
{
    hr = cpEnum->Next(1, &cpObjectToken, NULL);
    //Currently only concerned with making 1 token assign without
    //throwing exception
}
if(SUCCEEDED(hr))
{
    hr = cpVoice->SetVoice(cpObjectToken);
}
if(SUCCEEDED(hr))
{
    hr = cpVoice->Speak(L"Hello There!", NULL, NULL);
}
//... lots of commented-out code here ...
cpVoice.Release();
::CoUninitialize();
return true; // <-- Throws Exception Here

プログラムはエラーなしでビルドされますが、最後の return ステートメントでエラー 0xC0000005 (メモリ アクセス違反) がスローされます。

<sphelper.h>非推奨のメソッド ::GetVersionExW() のため、ヘッダーファイルを変更する必要がありました。 Windows-s-deprecation-of-GetVe . 奇跡的に (そして、システムのソース コードを少し調整しただけで、おそらく悪い考えでした)、それは機能しました。

問題はレジストリトークンにアクセスするプログラムにあるに違いないため、プログラムが最後にスローする理由はわかりません。通常、問題はポインターにあることはわかっていますが、これを機能させるために何をする必要がありますか?

cpVoiceオブジェクトにポーランドのトークン「Paulina」を使用させようとしていることに注意してください。オブジェクトにレジストリ トークン値を手動で割り当てる方法はありますか?

4

1 に答える 1