【发布时间】:2016-07-22 10:17:56
【问题描述】:
我写信是想就有关 SAPI 引擎的特定问题向您请教一些建议。我有一个可以与扬声器和 WAV 文件对话的应用程序。我还需要注意一些事件,即单词边界和结束输入。
m_cpVoice->SetNotifyWindowMessage(m_hWnd, TTS_MSG, 0, 0);
hr = m_cpVoice->SetInterest(SPFEI_ALL_EVENTS, SPFEI_ALL_EVENTS);
只是为了测试我添加了所有事件!当引擎对扬声器说话时,所有事件都会被触发并发送到m_hWnd 窗口,但是当我将输出设置为 WAV 文件时,它们都不会被发送
CSpStreamFormat fmt;
CComPtr<ISpStreamFormat> pOld;
m_cpVoice->GetOutputStream(&pOld);
fmt.AssignFormat(pOld);
SPBindToFile(file, SPFM_CREATE_ALWAYS, &m_wavStream, &fmt.FormatId(), fmt.WaveFormatExPtr());
m_cpVoice->SetOutput(m_wavStream, false);
m_cpVoice->Speak(L"Test", SPF_ASYNC, 0);
file 是作为参数传递的路径。
实际上,此代码取自 SAPI SDK 上的 TTS 示例。设置格式的部分似乎有点晦涩......
你能帮我找出问题吗?或者你们中有人知道将 TTS 写入 WAV 的更好方法吗?不能用manager code,最好用C++版的……
非常感谢您的帮助
编辑 1
这似乎是一个线程问题,在包含SPBindToFile 帮助器的spuihelp.h 文件中搜索我发现它使用CoCreateInstance() 函数来创建流。也许这就是ISpVoice 对象失去了在其创建线程中发送事件的能力的地方。
你怎么看?
【问题讨论】:
-
无法从发布的代码中看出,但是当您发送到 WAV 文件时,您是否在某处发送消息?
-
您如何编译代码 - Visual Studio?如果有,是哪个版本?
-
@EricBrown 好吧......真的不是......我读到过,但“著名的”WaitAndPumpMessage() 函数仍在阻塞(不是吗?)
-
@GavinBrelstaff 是的,我正在使用 2015 年社区!
标签: visual-c++ visual-studio-2015 text-to-speech sapi