Ես պետք է ձայնային ֆայլ ստեղծեմ 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);
Կա՞ պատկերացում, թե ինչ կարող է սխալ լինել: