我在WP8.1项目中有一个背景音频任务,它使用BackgroundMediaPlayer
来播放音频。
在我的前台应用程序中,我有可以收听的文章(在线文章)。这是通过TTS(SpeechSynthesizer
)完成的。
我尝试过两件事来实现这个功能:
在任务中创建SpeechSynthesisStream
并将其与BackgroundMediaPlayer.Current.SetStreamSource(IRandomAccessStream stream)
一起使用。
当文本长于几百个字符时,始终使用此方法命中内存异常。
在前台应用中创建流并将其保存到 .wav 文件中。 这适用于第一种方法中较长的文本,但创建了非常大的文件,并且生成时间长得不可接受,内存增加了几百MB。
第二次实施的代码:
string content = ".......";
// create stream from synthesizer
SpeechSynthesizer synth = new SpeechSynthesizer();
SpeechSynthesisStream stream = await synth.SynthesizeTextToStreamAsync(content);
// get inputstream and size of stream
ulong size = stream.Size;
IInputStream inputStream = stream.GetInputStreamAt(0);
stream.Dispose();
DataReader dataReader = new DataReader(inputStream);
await dataReader.LoadAsync((uint)size);
byte[] buffer = new byte[(int)size];
dataReader.ReadBytes(buffer);
inputStream.Dispose();
dataReader.Dispose();
// open folder and file
IStorageFolder folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("Audio", CreationCollisionOption.OpenIfExists);
IStorageFile file = await folder.CreateFileAsync("audio.wav", Windows.Storage.CreationCollisionOption.ReplaceExisting);
// write file
await Windows.Storage.FileIO.WriteBytesAsync(file, buffer);
如何以“内存友好”和快速的方式实现此功能(不使用在线服务)?