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);
何がうまくいかないのか考えてみませんか?