【问题标题】:Simple text to speech with SAPI in a Windows Service在 Windows 服务中使用 SAPI 的简单文本到语音
【发布时间】:2014-06-19 05:09:18
【问题描述】:

为什么只有当进程作为服务运行时,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" );

【问题讨论】:

    标签: c++ sapi


    【解决方案1】:

    SAPI 文档将SPERR_NOT_ACTIVE_SESSION 列为

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

    服务在后台会话中运行。由于在 Vista 中引入了Session 0 Isolation,服务无法访问交互式资源,其中包括 Text-To-Speech。

    谷歌搜索,我找到了几个 cmet 来支持这一说法:

    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__ extract 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 错误。

    至于SpeechSynthesizer,我猜它内部没有使用SAPI。 SpeechSynthesizer 的源代码可在此处获得:

    SpeechSynthesizer.cs

    VoiceSynthesis.cs

    【讨论】:

    • 我将只使用 .NET 和 System.Speech,因为我认为这不是微不足道的。 SAPI 在 Microsoft.Speech 内部使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2015-03-11
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多