C # SAPI dans un service Web
-
08-07-2019 - |
Question
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();
}
Ce code exact fonctionne dans une application WinForm, mais lorsque je l'exécute dans un service Web, je reçois le message suivant
System.Runtime.InteropServices.COMException was unhandled
Message="Exception from HRESULT: 0x80045003"
Source="Interop.SpeechLib"
ErrorCode=-2147201021
Quelqu'un at-il une idée de ce qui pourrait causer cette erreur? Le code d'erreur signifie
SPERR_UNSUPPORTED_FORMAT
Pour être complet, voici la méthode 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);
}
J'ai donné un accès complet aux utilisateurs sur le dossier C: \ Temp où le fichier doit être écrit. Toute aide serait la bienvenue!
La solution
Je ne pense pas que System.Speech fonctionne dans le service Windows. Cela ressemble à il existe un dépendance à Shell , qui n'est pas disponible pour les services. Essayez d'interopérabilité avec les interfaces C ++ de SAPI. Certaines classes de System.Runtime.InteropServices peuvent vous aider.
Autres conseils
Notre convention de dénomination nous oblige à utiliser une extension de fichier non standard. Cela fonctionne bien dans une application Winforms, mais a échoué sur notre serveur Web. Remettre l'extension de fichier en .wav a résolu cette erreur pour nous.
Assurez-vous de définir explicitement le format sur l'objet SPFileStream. ISpAudio :: SetState (qui est appelé une couche inférieure de speechEngine.Speak) renverra SPERR_UNSUPPORTED_FORMAT
si le format n'est pas pris en charge.
Je viens de recevoir le service Web pour créer une application console permettant d'effectuer le traitement. PITA: -)