WPF开发txt阅读器8:C#文本朗读

文章目录

    • 朗读功能
    • 阅读文本
    • 暂停

txt阅读器系列:

  • 需求分析和文件读写
  • 目录提取类列表控件与目录
  • 字体控件绑定前景/背景颜色
  • 书籍管理系统用树形图管理书籍

朗读功能

作为21世纪20年代的一款小说阅读器,如果不实现一个朗读功能,那就太落伍了。.Net提供了Speech模块,但需要通过工具->nuget包管理器中下载:搜索Speech,选择System.Speech,然后点击右侧的安装按钮,安装完成就可以using了。

下面举一个简单的例子

using System.Speech.Synthesis;
// 在MainWindow类中写一个下面的函数
//  text为输入文本内容
void test()
{
    var speech = new SpeechSynthesizer();
    speech.Speak("我是一个高冷的文本阅读器");
}

然后将testinit中引用,这样在运行程序之前,就会听到一个高冷的女声说:“我是一个高冷的文本阅读器”。

阅读文本

为了实现语音播放功能,在设置面板中添加一个播放按钮,并注册事件btnReadStart_Click

<StackPanel Orientation="Horizontal">
    <Button Content="▶️" Click="btnReadStart_Click"/>
StackPanel>

C#代码为

SpeechSynthesizer speech = new SpeechSynthesizer();
private void btnReadStart_Click(object sender, RoutedEventArgs e)
{
    var speech = new SpeechSynthesizer();
    Task.Run(() =>
    {
        speech.Speak(txt.Text);
    });
}

其中,speech为全局变量,用于朗读文本。由于文本是连续朗读的,为了不阻塞窗口,所以用Task.Run开启了一个新的线程。

SpeechSynthesizer speech = new SpeechSynthesizer();
private void btnReadStart_Click(object sender, RoutedEventArgs e)
{
    var text = txt.Text;
    Task.Run(() => speech.Speak(text));
}

由于播放功能的引入,使得我们需要找一个恰当的时机为speech进行初始化,比较合适的方案是,在txt控件内容发生变化的时候,初始化speech,从而新建一个函数

private void txtChang(string text)
{
    txt.Text = text;
    speech = new SpeechSynthesizer();
}

然后将所有txt.Text = ....的代码,都改写为引用txtChange函数。

暂停

SpeechSynthesizer类提供了暂停和继续的功能,分别为PauseResume,则其代码改写为

SpeechSynthesizer speech = new SpeechSynthesizer();
private void btnReadStart_Click(object sender, RoutedEventArgs e)
{
    var btn = sender as Button;
    string text = txt.Text;
    Task.Run(()=>speechCtrlTask(text));
    btn.Content = btn.Content.ToString()== "▶️" ? "⏯️" : "▶️";
}

private void speechCtrlTask(string text="")
{
    switch (speech.State.ToString())
    {
        case "Paused": speech.Resume(); break;
        case "Speaking": speech.Pause(); break;
        case "Ready": speech.Speak(text); break;
    }
}

其中,speech.State表示阅读文本的状态,若为Ready,说明此时已经准备好了播放语音,所以将开始阅读一段文本;当状态为Speaking时,说明正在阅读,此时点击按钮,表示暂停播放;当为Paused时,表示处于暂停状态,此时点击按钮将继续播放。

而按钮内容则为▶️和⏯️交替变化。

你可能感兴趣的:(.Net,wpf,C#,文本朗读,文本播报,System.Speech)