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

标签 c# listbox win-universal-app text-to-speech

我正在尝试实现文本转语音以按顺序读取列表框中的项目。最初,程序会同时读出所有彼此重叠的项目。经过研究,我添加了一个 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的文档,您会发现有两种将文本转换为语音的方法。一个是你用过的,SynthesizeTextToStreamAsync method ,此方法从字符串异步生成语音输出。

另一个是SynthesizeSsmlToStreamAsync method ,并且此方法从包含 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'/>每一项后的字符串,每项后语音将暂停 500 毫秒。

关于c# - UWP 列表框中的文本到语音 (c#'),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35463566/

相关文章:

水平排列其项目的 WPF ListBox

c# - .NET Generic 集合在多线程环境中是否更慢

string - 检查列表框中的项目忽略大小写

wpf - WPF ListBox 可以是 "read only"吗?

c# - win2D uwp 不会在 inkcanvas 中保存高亮笔画

c# - 设置通知参数

c# - 给定的键不存在于 Activator.CreateInstance 的字典中

c# - 无法在 C# 代码中将 Azure 云存储帐户的公共(public)文件 URL 过期时间设置为超过 1 年

c# - Oracle 连接请求超时

nuget - 如何检查 nuget 包是否支持通用 Windows 应用程序 (UWP)?