Domanda

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();
}

Questo codice esatto funziona in un'app WinForm, ma quando lo eseguo all'interno di un servizio Web ottengo quanto segue

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

Qualcuno ha qualche idea di cosa potrebbe causare questo errore? Il codice di errore significa

SPERR_UNSUPPORTED_FORMAT

Per completezza ecco il metodo 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);
}

Ho dato pieno accesso agli UTENTI nella cartella C: \ Temp in cui il file deve essere scritto. Qualsiasi aiuto sarebbe apprezzato!

È stato utile?

Soluzione

Non credo che System.Speech funzioni nel servizio Windows. Sembra che c'è un dipendenza da Shell , che non è disponibile per i servizi. Prova a interagire con le interfacce C ++ di SAPI. Alcune classi in System.Runtime.InteropServices possono essere d'aiuto in questo.

Altri suggerimenti

La nostra convenzione di denominazione ci impone di utilizzare un'estensione di file non standard. Funziona bene in un'app Winforms, ma non è riuscita sul nostro server web. La modifica dell'estensione del file in .wav ha risolto questo errore per noi.

Assicurati di impostare esplicitamente il formato sull'oggetto SPFileStream. ISpAudio :: SetState (che viene chiamato in un livello inferiore da speechEngine.Speak) restituirà SPERR_UNSUPPORTED_FORMAT se il formato non è supportato.

Ho appena ricevuto il servizio web per generare un'app console per eseguire l'elaborazione. PITA :-)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top