Windows Server 2016: Windows вход на сервер как LSA не может выбрать Microsoft David Voice - PullRequest
0 голосов
/ 10 июля 2020

У меня есть служба windows, генерирующая звук TTS с использованием голоса Microsoft David Desktop на Windows Server 2012. При перемещении на Windows Server 2016 возвращается ошибка 0x80045040. Моя служба windows входит в систему как администратор. Вы видели эту ошибку? Примечание: он может воспроизводить другие 32-битные голоса SAPI.

Если оконная служба входит в систему как локальная системная учетная запись (LSA), ошибки не возникает. Мне нужно выполнить вход в службу windows как администратор, потому что ему нужен доступ к общим дискам.

Спасибо за вашу помощь.

Пример 1: Ошибка = 0x80045040 aka SPERR_INVALID_REGISTRY_KEY

//using SpeechLib; //References:  Interop.SpeechLib
public string SapiGenerateTTS()
{
string ret = "";
string strVoice = "Microsoft David Desktop";
SpVoice spVoice = new SpVoice();
SpFileStream voiceStream = new SpFileStream();
bool bVoiceStreamOpen = false;
try
{
spVoice.Voice = spVoice.GetVoices("name = " + strVoice).Item(0);                
voiceStream.Format.Type = SpeechAudioFormatType.SAFT8kHz16BitMono;
string strTrimPathTemp = @"c:\Temp\test.wav";
voiceStream.Open(strTrimPathTemp, SpeechStreamFileMode.SSFMCreateForWrite, true);
bVoiceStreamOpen = true;
spVoice.AudioOutputStream = voiceStream;
string strInputString = "My speech voice is " + strVoice;
spVoice.Speak(strInputString);
spVoice.WaitUntilDone(-1);
ret = strTrimPathTemp;
}
catch(Exception ex)
{
ret = ex.Message;
}
finally
{
if (bVoiceStreamOpen)
voiceStream.Close();
voiceStream = null;
spVoice = null;
}

return ret;
}

Пример 2: Ошибка: «Невозможно настроить голос. Соответствующий голос не установлен или голос был отключен».

using System.Speech.Synthesis;
using System.Speech.AudioFormat;
static string GenerateTTS(string strVoice)
{
string ret = "";
SpeechSynthesizer synth = null;
try
{
synth = new SpeechSynthesizer();
synth.SelectVoice(strVoice);
string strTrimPathTemp = @"c:\Temp\test.wav";
SpeechAudioFormatInfo fmtInfo = new SpeechAudioFormatInfo(8000, AudioBitsPerSample.Sixteen, AudioChannel.Mono);
synth.SetOutputToWaveFile(strTrimPathTemp, fmtInfo);
string strInputString = "My speech voice is " + strVoice;
synth.Speak(strInputString);
ret = strTrimPathTemp;
}
catch(Exception ex)
{
ret = ex.Message;
}
finally
{
if (synth != null)
{
synth.Dispose();
}
}
return ret;
}
...