C # SAPI in einem Web-Service
-
08-07-2019 - |
Frage
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();
}
Das genaue Code funktioniert in einer WinForm app, aber wenn ich es in einem Webservice betreibe ich das folgende
erhaltenSystem.Runtime.InteropServices.COMException was unhandled
Message="Exception from HRESULT: 0x80045003"
Source="Interop.SpeechLib"
ErrorCode=-2147201021
Hat jemand irgendwelche Ideen, was diesen Fehler verursachen? Die Fehlercodemittel
SPERR_UNSUPPORTED_FORMAT
Für Vollständigkeit ist hier die SetVoice Methode
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);
}
\ Temp in dem die Datei geschrieben werden soll: habe ich vollen Zugriff auf Nutzer im Ordner C gegeben. Jede mögliche Hilfe würde geschätzt!
Lösung
Das glaube ich nicht die System.Speech in Windows-Dienst arbeitet. Es sieht aus wie eine ist Abhängigkeit von Shell , die Dienste nicht verfügbar. Versuchen Sie Interop mit SAPI der C ++ Schnittstellen. Einige Klasse in System.Runtime.InteropServices kann auf das helfen.
Andere Tipps
Unsere Namenskonvention erfordert, dass wir eine Nicht-Standard-Dateierweiterung zu verwenden. Dies funktioniert in einer WinForms-Anwendung, aber nicht auf unserem Webserver. Ändern der Dateierweiterung .wav zurück gelöst diesen Fehler für uns.
Stellen Sie sicher, dass Sie explizit das Format auf dem SPFileStream Objekt festgelegt. ISpAudio :: SetState (die aufgerufen wird, eine untere Schicht aus speechEngine.Speak) kehrt SPERR_UNSUPPORTED_FORMAT
, wenn das Format nicht unterstützt wird.
Ich habe gerade die webservice eine Konsolenanwendung, um laichen die Verarbeitung zu tun. PITA: -)