如何获得Microsoft TTS演讲的经过的时间
How to get the elapsed time of Microsoft TTS speech?
我现在使用以下函数实现TTS服务。
int tts(LPCWSTR text){
::CoInitialize(NULL);
CLSID CLSID_SpVoice;
CLSIDFromProgID(_T("SAPI.SpVoice"), &CLSID_SpVoice);
ISpVoice *pSpVoice = NULL;
IEnumSpObjectTokens *pSpEnumTokens = NULL;
if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&pSpVoice))){
return -1;
}
if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, &pSpEnumTokens))){
ISpObjectToken *pSpToken = NULL;
SpFindBestToken(SPCAT_VOICES, L"Gender=Male", L"Name=Microsoft Simplified Chinese", &pSpToken);
pSpVoice->SetVoice(pSpToken);
pSpVoice->Speak(text, SPF_DEFAULT, NULL);
pSpEnumTokens->Release();
}
pSpVoice->Release();
::CoUninitialize();
return 0;
}
我有可能让每个角色所经过的时间流逝吗?还是恒定(如果设定了语音率)?目的是我想展示一些面部动画以匹配演讲...
您不一定需要经过的时间;您可以使用视觉事件触发动画。
由于您使用的是C ,请使用ISPVOICE :: SETInterest描述所需的事件集,以及ISPnotifYsource方法之一(取决于您的外部代码所做的)来获取事件。
Microsoft有一个详细的工作,以防此草图没有帮助。
请注意,Visemes的精确 set (以及哪些Visemes映射到哪些值)是依赖语言的。对于我们英语,在这里定义了观众。对于中文,从音素到Viseme的映射尚未公开定义。
另一方面,您可以使用触发器的Vibeme事件,并且并不真正在乎实际的Viseme values 。
假设您在应用程序中的某个地方有消息循环,则您的代码看起来像:
CLSID CLSID_SpVoice;
CLSIDFromProgID(_T("SAPI.SpVoice"), &CLSID_SpVoice);
ISpVoice *pSpVoice = NULL;
IEnumSpObjectTokens *pSpEnumTokens = NULL;
ULONGLONG ullMyEvents = SPFEI(SPEI_VISEME);
if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&pSpVoice))){
return -1;
}
if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, &pSpEnumTokens))){
ISpObjectToken *pSpToken = NULL;
SpFindBestToken(SPCAT_VOICES, L"Gender=Male", L"Name=Microsoft Simplified Chinese", &pSpToken);
pSpVoice->SetVoice(pSpToken);
// Set type of events the client is interested in.
pSpVoice->SetInterest(ullMyEvents, ullMyEvents);
// deliver a WM_APP message when a SAPI event arrives.
// Use a different message ID for real code.
pSpVoice->SetNotifyWindowMessage(hWnd, WM_APP, 0, 0);
pSpVoice->Speak(text, SPF_DEFAULT, NULL);
pSpEnumTokens->Release();
}
pSpVoice->Release();
以后,在您的消息循环中,您需要处理SAPI消息:
case WM_APP:
SPEVENT eventItem;
memset( &eventItem;, 0,sizeof(SPEVENT));
while( pVoice->GetEvents(1, &eventItem;, NULL ) == S_OK )
{
switch(eventItem.eEventId )
{
case SPEI_VISEME:
.
.
.
break;
default:
break;
}
SpClearEvent( eventItem );
相关文章:
- 为什么根据测量位置测量经过的时间时会有很大的不同?
- 如何比较两个经过的时间?
- 为什么这个经过的时间(帧时间)计算会锁定我的游戏
- 获取标准::未来<T>::wait_for的经过时间
- C++ 时间机器无法正确计算经过的时间量
- 填充 unordered_map (c++) 后 malloc 的经过时间
- 自当地时间上午8点以来,将时间经过的时间与Boost
- 如何获得Microsoft TTS演讲的经过的时间
- 获取自C++执行以来经过时间的最干净,最简单的方法
- 在 Linux 中,非常高的经过(挂钟)时间和低系统时间的含义
- 16.66ms 帧时间.当 sleep() 只经过整毫秒时,你如何获得完美的 60 fps
- 以格式化字符串的形式获取经过的时间
- 如何在C++中检查经过的时间和分配的内存
- 在visualc++2010中经过的时间
- 如何在没有计时器的情况下确定经过了多少时间
- 如何获得自SFML中按下键以来经过的时间
- 在经过时间后做某事C++SFML 2
- 试图使用gettimeofday来查找以毫秒为单位的经过时间
- 以C++记录经过时间的正确方法
- 以复数表示的实际经过时间