C # SAPI em um serviço web
-
08-07-2019 - |
Pergunta
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();
}
Este código exato trabalha em um aplicativo WinForm, mas quando eu executá-lo dentro de um webservice recebo a seguinte
System.Runtime.InteropServices.COMException was unhandled
Message="Exception from HRESULT: 0x80045003"
Source="Interop.SpeechLib"
ErrorCode=-2147201021
Alguém tem alguma idéia do que pode estar causando esse erro? Os meios de código de erro
SPERR_UNSUPPORTED_FORMAT
Para completar aqui é o método 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);
}
Eu dei acesso completo aos usuários na pasta C: \ Temp onde o arquivo está a ser escrito. Qualquer ajuda seria apreciada!
Solução
Eu não acho que as obras System.Speech em serviço do Windows. Parece há uma dependência para Shell , que não está disponível para serviços. Tente interoperabilidade com interfaces de SAPI C ++. Alguns classe em System.Runtime.InteropServices pode ajudar com isso.
Outras dicas
A nossa convenção de nomenclatura nos obriga a usar uma extensão de arquivo não-padrão. Esta multa trabalha em um aplicativo WinForms, mas não no nosso servidor web. Alterar a volta extensão do arquivo para .wav resolvido esse erro para nós.
Certifique-se de definir explicitamente o formato do objeto SPFileStream. ISpAudio :: SetState (que é chamado em uma camada inferior de speechEngine.Speak) irá retornar SPERR_UNSUPPORTED_FORMAT
se o formato não é suportado.
Eu só tenho a webservice para desovar um aplicativo console para fazer o processamento. PITA: -)