C # SAPI в веб-сервисе
-
08-07-2019 - |
Вопрос
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();
}
Этот точный код работает в приложении WinForm, но когда я запускаю его в веб-сервисе, я получаю следующее
System.Runtime.InteropServices.COMException was unhandled
Message="Exception from HRESULT: 0x80045003"
Source="Interop.SpeechLib"
ErrorCode=-2147201021
У кого-нибудь есть идеи, что может быть причиной этой ошибки? Код ошибки означает
SPERR_UNSUPPORTED_FORMAT
Для полноты здесь используется метод 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);
}
Я предоставил полный доступ к ПОЛЬЗОВАТЕЛЯМ в папке C: \ Temp, где должен быть записан файл. Любая помощь будет оценена!
Решение
Я не думаю, что System.Speech работает в службе Windows. Похоже, что есть зависимость от Shell , которая недоступна для служб. Попробуйте взаимодействовать с интерфейсами SAPI C ++. Некоторые классы в System.Runtime.InteropServices могут помочь в этом.
Другие советы
Наше соглашение об именах требует от нас использовать нестандартное расширение файла. Это прекрасно работает в приложении Winforms, но не удалось на нашем веб-сервере. Изменение расширения файла обратно на .wav решило эту ошибку для нас. Р>
Убедитесь, что вы явно установили формат для объекта SPFileStream. ISpAudio :: SetState (который вызывается в нижний уровень из speechEngine.Speak) вернет SPERR_UNSUPPORTED_FORMAT
, если формат не поддерживается.
Я только что получил веб-сервис для запуска консольного приложения для выполнения обработки. PITA: -)