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!

¿Fue útil?

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 :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top