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!

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top