作为21世纪20年代的一款小说阅读器,如果不实现一个朗读功能,那就太落伍了。.Net
提供了Speech
模块,但需要通过工具->nuget
包管理器中下载:搜索Speech
,选择System.Speech
,然后点击右侧的安装按钮,安装完成就可以using
了。
下面举一个简单的例子
using System.Speech.Synthesis;
// 在MainWindow类中写一个下面的函数
// text为输入文本内容
void test()
{
var speech = new SpeechSynthesizer();
speech.Speak("我是一个高冷的文本阅读器");
}
然后将test
在init
中引用,这样在运行程序之前,就会听到一个高冷的女声说:“我是一个高冷的文本阅读器”。
为了实现语音播放功能,在设置面板中添加一个播放按钮,并注册事件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
类提供了暂停和继续的功能,分别为Pause
和Resume
,则其代码改写为
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
时,表示处于暂停状态,此时点击按钮将继续播放。
而按钮内容则为▶️和⏯️交替变化。