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!

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top