2009-10-28 46 views
0
var speechEngine = new SpVoiceClass(); 
SetVoice(speechEngine, job.Voice); 

var fileMode = SpeechStreamFileMode.SSFMCreateForWrite; 
var fileStream = new SpFileStream(); 
try 
{ 
    fileStream.Open(filePath, fileMode, false); 
    speechEngine.AudioOutputStream = fileStream; 
    speechEngine.Speak(job.Script, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak | SpeechVoiceSpeakFlags.SVSFDefault); //TODO: Change to XML 
    //Wait for 15 minutes only 
    speechEngine.WaitUntilDone((uint)new TimeSpan(0, 15, 0).TotalMilliseconds); 
} 
finally 
{ 
    fileStream.Close(); 
} 

这个确切的代码在一个WinForm的应用程序,但是当我运行一个Web服务中,我得到以下C#SAPI在Web服务

System.Runtime.InteropServices.COMException was unhandled 
    Message="Exception from HRESULT: 0x80045003" 
    Source="Interop.SpeechLib" 
    ErrorCode=-2147201021 

没有人有任何想法可能是造成这个错误?该错误代码的含义

SPERR_UNSUPPORTED_FORMAT 

为了完整这里是SetVoice方法

void SetVoice(SpVoiceClass speechEngine, string voiceName) 
{ 
    var voices = speechEngine.GetVoices(null, null); 
    for (int index = 0; index < voices.Count; index++) 
    { 
     var currentToken = (SpObjectToken)voices.Item(index); 
     if (currentToken.GetDescription(0) == voiceName) 
     { 
      speechEngine.SetVoice((ISpObjectToken)currentToken); 
      return; 
     } 
    } 
    throw new Exception("Voice not found: " + voiceName); 
} 

我已经给予了充分的用户访问该文件夹C:\ Temp其中的文件将被写入。任何帮助,将不胜感激!

+0

哪一行产生错误? – ChrisF 2009-10-28 20:51:18

+0

SpeechEngine.Speak导致错误 – 2009-10-29 10:20:00

回答

1

我不认为System.Speech在Windows服务中起作用。它看起来像there is a dependency to Shell,它不适用于服务。尝试与SAPI的C++接口进行交互。 System.Runtime.InteropServices中的某些类可能会对此有所帮助。

0

确保您明确设置了SPFileStream对象上的格式。 ISpAudio::SetState(在speechEngine.Speak的底层调用)将返回SPERR_UNSUPPORTED_FORMAT如果格式不支持。

0

我刚刚得到了web服务来产生一个控制台应用程序来处理。 PITA :-)

1

我们的命名约定要求我们使用非标准的文件扩展名。这在Winforms应用程序中正常工作,但在我们的Web服务器上失败。将文件扩展名更改回.wav为我们解决了这个错误。