0

SpeechSynthesizerによって生成されたストリームからオーディオファイルを作成する必要があります。

これは使用しているコードです

var stream = await _SpeechSynth.GetSpeakStreamAsync(text, this.Language);
            var reader = new Windows.Storage.Streams.DataReader(stream.GetInputStreamAt(0));
            await reader.LoadAsync((uint)stream.Size);

            byte[] bytes = new byte[stream.Size];
            reader.ReadBytes(bytes);

             var audioFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(_AgendaAudioFilename, CreationCollisionOption.ReplaceExisting);

             using (var outputStream = await audioFile.OpenAsync(FileAccessMode.ReadWrite))
             {

                 Stream os = outputStream.GetOutputStreamAt(0).AsStreamForWrite();
                 await os.WriteAsync(bytes, 0, bytes.Length);
             }

問題は、「os.WriteAsync」で待たされていなかったことです。その行にブレークポイントを設定して数秒待つと、ファイルは正しく作成されていました。awaitキーワードは、すべてのバイトがストリームにコピーされるまで待ってから次の行に進むべきではありませんか?

InMemoryRandomAccessStreamをファイルにコピーするためのより良い方法を誰かが提案できるかどうかは気になりませんか?

編集:

マハンテシュの答えは魅力のように機能します。どうもありがとう。しかし、新たな問題に直面しています。

ファイルが作成された後、ファイルをもう一度開いて再生しようとしていますが、このエラーが発生します。

「アクセスが拒否されました。(HRESULTからの例外:0x80070005(E_ACCESSDENIED))」

これは私のコードです。

if (!cacheHit)
        {
            var stream = await _SpeechSynth.GetSpeakStreamAsync(text, this.Language);

            //write the stream to disk (seems to be buggy when attempting to playback from the result of the speech synth request)
            var audioFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(_AgendaAudioFilename, CreationCollisionOption.ReplaceExisting);

             outputStream = await audioFile.OpenAsync(FileAccessMode.ReadWrite);

             await RandomAccessStream.CopyAsync(stream, outputStream);                 

        }

        //read agenda from disk and play back the audio
        var agendaStorageFile = await ApplicationData.Current.TemporaryFolder.GetFileAsync(_AgendaAudioFilename);
        var agendaStreamFromDisk = await agendaStorageFile.OpenAsync(FileAccessMode.Read);            

        _MediaPlayer.Url = text;
        _MediaPlayer.SetBytestream(agendaStreamFromDisk);
        _MediaPlayer.Play();    

この行でエラーが発生しています:

var agendaStreamFromDisk = await agendaStorageFile.OpenAsync(FileAccessMode.Read);

何がうまくいかないのか考えてみませんか?

4

2 に答える 2

1

私はあなたが試すことができると思います

await RandomAccessStream.CopyAsync(inMemoryStream, outputStream);

新しい問題の解決策:

if (!cacheHit)
    {
        var stream = await _SpeechSynth.GetSpeakStreamAsync(text, this.Language);

        //write the stream to disk (seems to be buggy when attempting to playback from the result of the speech synth request)
        var audioFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(_AgendaAudioFilename, CreationCollisionOption.ReplaceExisting);

         using(outputStream = await audioFile.OpenAsync(FileAccessMode.ReadWrite)){
         await RandomAccessStream.CopyAsync(stream, outputStream);}

    }

    //read agenda from disk and play back the audio
    var agendaStorageFile = await ApplicationData.Current.TemporaryFolder.GetFileAsync(_AgendaAudioFilename);
   using (var agendaStreamFromDisk = await agendaStorageFile.OpenAsync(FileAccessMode.Read)){

    _MediaPlayer.Url = text;
    _MediaPlayer.SetBytestream(agendaStreamFromDisk);
    _MediaPlayer.Play();  }
于 2012-12-28T07:40:53.097 に答える
0

待機にキーワードを使用しawaitているため、次のような同期バージョンのメソッドを使用することをお勧めします。

using (var outputStream = audioFile.Open(FileAccessMode.ReadWrite))
{
    Stream os = outputStream.GetOutputStreamAt(0).AsStreamForWrite();
    os.Write(bytes, 0, bytes.Length);
}
于 2012-12-28T07:33:36.337 に答える