C # SAPI en un servicio web
-
08-07-2019 - |
Pregunta
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 exacto funciona en una aplicación WinForm, pero cuando lo ejecuto dentro de un servicio web obtengo lo siguiente
System.Runtime.InteropServices.COMException was unhandled
Message="Exception from HRESULT: 0x80045003"
Source="Interop.SpeechLib"
ErrorCode=-2147201021
¿Alguien tiene alguna idea de lo que podría estar causando este error? El código de error significa
SPERR_UNSUPPORTED_FORMAT
Para completar, aquí está el 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);
}
He dado acceso completo a los USUARIOS en la carpeta C: \ Temp donde se va a escribir el archivo. Cualquier ayuda sería apreciada!
Solución
No creo que System.Speech funcione en el servicio de Windows. Parece que hay un dependencia a Shell , que no está disponible para los servicios. Intente interoperabilidad con las interfaces C ++ de SAPI. Alguna clase en System.Runtime.InteropServices puede ayudar en eso.
Otros consejos
Nuestra convención de nomenclatura requiere que usemos una extensión de archivo no estándar. Esto funciona bien en una aplicación Winforms, pero falló en nuestro servidor web. Cambiar la extensión del archivo de nuevo a .wav nos resolvió este error.
Asegúrese de establecer explícitamente el formato en el objeto SPFileStream. ISpAudio :: SetState (que se llama una capa inferior de speechEngine.Speak) devolverá SPERR_UNSUPPORTED_FORMAT
si el formato no es compatible.
Acabo de recibir el servicio web para generar una aplicación de consola para hacer el procesamiento. PITA :-)