在Windows服务中使用SAPI进行简单的文本到语音转换

时间:2014-06-18 19:42:16

标签: c++ sapi

为什么只有当进程作为服务运行时,Speak()后面的代码才会失败,错误代码为0x80045063(SPERR_NOT_ACTIVE_SESSION)?

ISpVoicePtr pVoice;
CoCreateInstance(
    CLSID_SpVoice,
    0,
    CLSCTX_INPROC_SERVER,
    IID_ISpVoice, ( LPVOID * ) &pVoice
);

pVoice->SetOutput( 0, TRUE );
pVoice->Speak( L"Hello", 0, NULL );

我能提出的唯一资源是关于与桌面会话交互的服务的安全性更改。 .NET中的以下内容将在一个服务中运行,所以我只是想知道如何使用带或不带SAPI的普通C ++来实现它。

System::Speech::Synthesis::SpeechSynthesizer synth;
synth.SetOutputToDefaultAudioDevice();
synth.Speak( "Hello" );

1 个答案:

答案 0 :(得分:2)

SAPI文档将SPERR_NOT_ACTIVE_SESSION列为

  

非活动控制台会话不支持音频输出和输入。

服务在后台会话中运行。由于Vista中引入了Session 0 Isolation,服务无法访问包含文字转语音在内的交互式资源。

在谷歌上搜索,我发现了一些评论来支持这一主张:

http://www.ip-symcon.de/en/service/documentation/module-reference/text-to-speech/tts-speak/

  

此功能在Windows __ Vista / 2003__或更新版本下无效。 这是因为出于安全原因,IP-Symcon等服务无法访问系统中的交互式组件。 Text To Speech输出是一个交互式组件。该问题表现为错误消息:__ OLE错误80045063__提取MSDN: SPERR_NOT_ACTIVE_SESSION

http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.tapi/2009-06/msg00003.html

  

请注意,它们(故意我认为)从Vista(及更高版本)开始破坏了这些东西。 如果您尝试在服务中使用SAPI的ISpMMSysAudio界面(因为它们在上面的链接中的项目符号中进行了草绘),迟早会看到SPERR_NOT_ACTIVE_SESSION错误。 < / p>

对于SpeechSynthesizer,我的猜测是它内部不使用SAPI。 SpeechSynthesizer的源代码可在此处获取:

SpeechSynthesizer.cs

VoiceSynthesis.cs