UWP 文本到列表框的语音 (c#')

UWP text to speech from listbox (c#')

我正在尝试实现文本到语音以按顺序从列表框中读取项目。最初,程序会同时读出所有相互重叠的项目。经过研究,我添加了一个 MediaEnded 处理程序,但我只能设法读出第一个项目,只有在这个实现的情况下。我将不胜感激任何帮助。

    private async void ToSpeechButton_Click(object sender, RoutedEventArgs e)
    {
            MediaElement mediaElement = new MediaElement();
            var tsc = new TaskCompletionSource<bool>();
            mediaElement.MediaEnded += (o, f) => { tsc.TrySetResult(true); };
            mediaElement.Play();

        foreach (var item in ListBox.Items)
        {   
            readText(item.ToString());
            await tsc.Task;
        }                

    }


    private async void readText(string mytext)
    {
        MediaElement mediaplayer = new MediaElement();
        using (var speech = new SpeechSynthesizer())
        {
            speech.Voice = SpeechSynthesizer.AllVoices.First(gender => gender.Gender == VoiceGender.Female);
            SpeechSynthesisStream stream = await speech.SynthesizeTextToStreamAsync(mytext);
            mediaplayer.SetSource(stream, stream.ContentType);
            mediaplayer.Play();
        }
    } 

如果您阅读 SpeechSynthesizer class, you will find there are two method to convert text to speech. One is what you have used, SynthesizeTextToStreamAsync method 的文档,此方法会从字符串异步生成语音输出。

另一个是SynthesizeSsmlToStreamAsync method, and this method asynchronously generate speech output from a string containing Speech Synthesis Markup Language (SSML)

在这种情况下,我们可以使用SynthesizeSsmlToStreamAsync方法在每个项目之间暂停语音,例如:

private string allitem;

private void ToSpeechButton_Click(object sender, RoutedEventArgs e)
{
    foreach (var item in listBox.Items)
    {
        var txt = item as ListBoxItem;
        allitem += txt.Content.ToString() + "<break time='500ms'/>";
    }
    readText(allitem);
}

private async void readText(string mytext)
{
    MediaElement mediaplayer = new MediaElement();
    using (var speech = new SpeechSynthesizer())
    {
        speech.Voice = SpeechSynthesizer.AllVoices.First(gender => gender.Gender == VoiceGender.Female);
        string ssml = @"<speak version='1.0' " + "xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='en-US'>" + allitem + "</speak>";
        SpeechSynthesisStream stream = await speech.SynthesizeSsmlToStreamAsync(ssml);
        mediaplayer.SetSource(stream, stream.ContentType);
        mediaplayer.Play();
    }
}

在每个项目后合并这个<break time='500ms'/>字符串,语音将在每个项目后暂停500ms。