我使用Speechlib SpVoice创建了一个文本到语音的应用程序。它适用于Windows应用程序。
但是当我使用相同的代码创建Windows服务时。它给了我这个错误
System.Runtime.InteropServices.COMException(0x8004503A):异常 来自HRESULT:SpeechLib.ISpeechVoice.Speak的0x8004503A
这是我的代码
public partial class LEDPlayService : ServiceBase
{
static int MessageID = 0;
static SpeechLib.SpVoice VoiceObj = new SpeechLib.SpVoice();
static System.Timers.Timer myTimer = new System.Timers.Timer();
protected override void OnStart(string[] args)
{
myTimer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
//This statement is used to set interval to 1 minute (= 60,000 milliseconds)
myTimer.Interval = 60* 1000;
// enabling the timer
myTimer.Enabled = true; ;
myTimer.AutoReset = false;
}
private static void OnElapsedTime(object source, ElapsedEventArgs e)
{
((System.Timers.Timer)source).Stop();
myTimer.Enabled = false; ;
bool result =PlayAudio("Hello prithvi");
((System.Timers.Timer)source).Start();
myTimer.Enabled = true;
// TraceService(""+DateTime.Now.TimeOfDay);
}
public static bool PlayAudio(string text)
{
bool res = false;
try
{
VoiceObj.Speak(text, SpeechLib.SpeechVoiceSpeakFlags.SVSFDefault);
res = true;
}
catch(Exception e)
{
TraceService("error in sound........."+e.InnerException+e.Message+" "+e.ToString());
res = false;
}
return res;
}
}
请帮帮我..
答案 0 :(得分:3)
这是SAPI调用SPERR_NOT_FOUND返回的低级错误。当您不发布代码片段和异常的堆栈跟踪时,您可能会非常难以可靠地回答问题。或者你如何观察它,这些COM错误通常被转换为.NET异常。
错误代码不会比“无法找到完成工作所需的内容”更多。调用上下文应该清楚地说明可能缺少什么,但我们看不到这一点。在服务中运行此代码是各种各样的提示。运行此服务的用户帐户很重要,System.Speech的大量配置存储在注册表中,并且服务很难找到存储在HKCU而不是HKLM中的配置。例如,如果您购买了一个声音并进行了注册,则并不罕见。它可能很难找到硬件,如麦克风或扬声器。
首先要尝试的是将服务配置为使用特定用户帐户(如您的帐户)而不是默认的系统帐户运行。接下来要尝试的是使用SysInternals的Process Monitor,您将看到您的程序在注册表中搜索键。比较一个好的跟踪,一个从运行它作为桌面程序获得的跟踪,与从服务运行它时获得的跟踪。并使用所需信息更新您的问题,以获得更好的答案。