c++ - 在 SAPI 中说出进度事件

标签 c++ text-to-speech sapi

我正在尝试使用 Microsoft SAPI 编写文本转语音程序。为此,我有以下代码:

ISpVoice * pVoice = NULL;

int main(int argc, char* argv[])
{

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

    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
    if (SUCCEEDED(hr))
    {
        hr = pVoice->Speak(L"Anyone who reads Old and Middle English literary texts will be familiar with the mid-brown volumes of the EETS, with the symbol of Alfred's jewel embossed on the front cover. Most of the works attributed to King Alfred or to Aelfric, along with some of those by bishop Wulfstan and much anonymous prose and verse from the pre-Conquest period, are to be found within the Society's three series; all of the surviving medieval drama, most of the Middle English romances, much religious and secular prose and verse including the English works of John Gower, Thomas Hoccleve and most of Caxton's prints all find their place in the publications. Without EETS editions, study of medieval English texts would hardly be possible.", SPF_IS_XML, NULL);
        pVoice->Release();
        pVoice = NULL;
    }
    ::CoUninitialize();
    return TRUE;
}

我想将说话进度打印到屏幕上,打印说出的每个单词。与System.Speech.Synthesis中的类似:

synth.SpeakProgress += new EventHandler<SpeakProgressEventArgs>(synth_SpeakProgress);

了解更多详情:Use Speech Synthesis Events

那么,我如何使用 SAPI 来做到这一点?

最佳答案

ISpVoice 继承自 ISpEventSource ,它又继承自 ISpNotifySource .

使用ISpEventSource::SetInterest()注册所需事件的方法,例如 SPEI_WORD_BOUNDARY:

A word is beginning to synthesize. Markup language (XML) markers are counted in the boundaries and offsets. wParam is the character length of the word in the current input stream being synthesized. lParam is the character position within the current text input stream of the word being synthesized.

使用各种 ISpNotifySource::SetNotify...() 方法指定您希望如何从 SAPI 接收事件:

当您收到新事件的通知时,请使用 ISpEventSource::GetEvents()如果需要,获取详细的事件信息。

关于c++ - 在 SAPI 中说出进度事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44638514/

相关文章:

c++ - 如何删除 Sprite 并再次使用相同的 Sprite

java - 最大化两个凸包之间的最小距离

c++ - 一次输出整个数组

php - eSpeak to mp3 in php on both windows and linux (online text-to-speech)

c# - 如何在 SAPI 5 上使用 x-sampa 音标

c++ - 调试 sapi5 文本到语音引擎

c++ - 为什么 Visual Studio 找不到我的 DLL?

iOS 7 文本转语音 API 不工作

delphi - SAPI 与 Dephi : Async speech doesn't work

javascript - 将 PHP 变量传递给 Javascript 不起作用