I've tried using something along the lines of:

public async Task ReadParagraph(int id) { var mp = (App.Current as App).mediaPlayer; var ns = (App.Current as App).nextStream; readerPosition = id; var tb = Items.OfType<TextBlock>(); if (readerPosition < tb.Count()) { if (synth == null) synth = new SpeechSynthesizer(); synth.Voice = SpeechSynthesizer.DefaultVoice; var str = await synth.SynthesizeTextToStreamAsync(tb.ElementAt(readerPosition).Text); var ms = MediaSource.CreateFromStream(str, str.ContentType); mp.Source = ms; mp.PlaybackSession.PlaybackRate = 1.3; mp.Play(); } }

And in the App.xml.cs file:

private async void MediaPlayer_MediaEnded(MediaPlayer sender, object args) { await currentStory.Commands.ReadParagraph(Reader.Current.readerPosition + 1); }

In theory this works. The problem is, there's 3s+ pause between each synth streams. On WP8.1, with MediaElement it worked perfectly, but it seems like MediaPlayer, with its Background Audio Playback capability seems to be working on different terms.

Also, is there any other way to change MediaPlayer 's default playback rate instead of changing ebvery file's separately? It doesn't seem to work 100% of the time the way I have it set up currently.

I've also been thinking about initializing the entire text as a List<SpeechSynthesisStream> , but this seems like it would take up a lot of memory with long texts.

What'd the best option to handle this?