C# SAPI in a web service
-
08-07-2019 - |
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!
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 :-)