2014-10-08 3 views
2

Speechlib Speech를 사용하여 텍스트 음성 변환 용 응용 프로그램을 만들었습니다. 그것은 윈도우 응용 프로그램과 잘 작동합니다.HRESULT에서 예외 얻기 : Speechlib의 0x8004503A

하지만 같은 코드를 사용하여 Windows 서비스를 만들 때. HRESULT에서 예외 : 그것은 나에게이 오류

함께 System.Runtime.InteropServices.COMException (0x8004503A)을 얻었다 0x8004503A는 SpeechLib.ISpeechVoice.Speak

에서이 내 코드입니다

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

다른 계정으로 서비스를 실행 해 보셨습니까? '오른쪽 클릭 서비스 -> 속성 -> 로그온 탭'- '로컬 시스템 계정'대신 자신의 계정을 사용하십시오. – wal

답변

3

SAPI 호출 SPERR_NOT_FOUND에서 반환하는 저수준 오류입니다. 스 니펫과 예외의 스택 추적을 게시하지 않을 때 신뢰할 수있게 질문에 대답하기가 너무 어렵게 만듭니다. 또는 심지어 어떻게 관찰했는지, 이러한 COM 오류는 일반적으로 .NET 예외로 변환됩니다.

오류 코드는 "작업을 수행하는 데 필요한 것을 찾을 수 없습니다"이상은 아닙니다. 호출 컨텍스트는 무엇이 빠져 있는지 명확히해야하지만, 우리는 이것을 볼 수 없습니다. 서비스에서이 코드를 실행하는 것은 일종의 신호입니다. 이 서비스를 실행하는 사용자 계정은 System.Speech에 대한 많은 구성이 레지스트리에 저장되며 서비스는 HKLM 대신 HKCU에 저장된 config를 찾는 데 어려움을 겪습니다. 예를 들어, 음성을 구입하여 등록한 경우 흔하지 않습니다. 또한 마이크 나 스피커와 같은 하드웨어를 찾는 것이 어려울 수도 있습니다.

그래서 가장 먼저 시도해보십시오. 기본 시스템 계정 대신 특정 사용자 계정 (예 : 사용자 계정)으로 서비스가 실행되도록 구성하는 것입니다. 시도 할 다음 작업은 SysInternals의 프로세스 모니터를 사용하는 것입니다. 프로그램에서 키를 찾기 위해 레지스트리를 검색합니다. 데스크톱 프로그램으로 실행했을 때 얻었던 흔적과 서비스에서 실행 한 흔적을 비교하십시오. 그리고 더 나은 답변을 얻으려면 필요한 정보로 질문을 업데이트하십시오.