質問
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アプリで動作しますが、Webサービス内で実行すると、次のものが得られます
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のUSERSへのフルアクセスを許可しました。助けていただければ幸いです!
解決
System.SpeechがWindowsサービスで機能するとは思わない。 があるシェルへの依存関係。サービスには使用できません。 SAPIのC ++インターフェイスとの相互運用を試してください。 System.Runtime.InteropServicesの一部のクラスは、これに役立つ場合があります。
他のヒント
命名規則では、非標準のファイル拡張子を使用する必要があります。これはWinformsアプリでは正常に機能しますが、Webサーバーでは失敗しました。ファイル拡張子を.wavに戻すと、このエラーは解決されました。
SPFileStreamオブジェクトの形式を明示的に設定してください。 ISpAudio :: SetState (これは呼び出されますspeechEngine.Speakの下位層)は、形式がサポートされていない場合に SPERR_UNSUPPORTED_FORMAT
を返します。
処理を実行するコンソールアプリを生成するWebサービスを取得しました。 PITA:-)
所属していません StackOverflow