0
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 にフル アクセスを許可しました。どんな助けでも大歓迎です!

4

4 に答える 4

1

System.Speech が Windows サービスで機能するとは思わない。サービスでは利用できないShell への依存関係があるようです。SAPI の C++ インターフェイスとの相互運用を試してください。System.Runtime.InteropServices の一部のクラスが役立つ場合があります。

于 2009-10-28T22:42:15.130 に答える
1

私たちの命名規則では、非標準のファイル拡張子を使用する必要があります。これは Winforms アプリでは正常に機能しますが、Web サーバーでは失敗しました。ファイル拡張子を .wav に戻すと、このエラーは解決しました。

于 2011-07-25T15:55:06.653 に答える
0

SPFileStream オブジェクトで形式を明示的に設定していることを確認してください。 ISpAudio::SetState (speechEngine.Speak から下位層で呼び出される) はSPERR_UNSUPPORTED_FORMAT、形式がサポートされていない場合に返されます。

于 2009-10-29T18:18:17.193 に答える
0

処理を行うためのコンソール アプリを生成する Web サービスを取得しました。ピタ :-)

于 2009-10-30T18:51:50.107 に答える