WPF开发txt阅读器10:语音播报快进快退

news2024/11/25 12:43:29

文章目录

    • MySpeech类
    • 快进

文章目录

    • MySpeech类
    • 快进

txt阅读器系列:

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

MySpeech类

speech的操作逻辑可以理解为一边合成语音,一边播放语音,所以理论上来说并不能对播放位置进行跳转。

如果有着强烈的跳转愿望,那么就需要对文本进行分割,考虑到SpeechSynthesizer是个密封类,不让被继承,所以新建一个类,并用st来调节阅读的起始位置。

internal class MySpeech
{
    public SpeechSynthesizer speech;
    public string text;
    public int st, charPosition;


    public MySpeech(string text)
    {
        this.text = text;
        speech = new SpeechSynthesizer();
        st = 0;
    }

    public void Speak()
    {
        speech.SpeakAsync(text[st..]);
    }

    public void ctrlTask()
    {
        switch (speech.State.ToString())
        {
            case "Paused": speech.Resume(); break;
            case "Speaking": speech.Pause(); break;
            case "Ready": Speak(); break;
        }
    }

    public void Jump(int L)
    {
        st += L + charPosition;
        st = Math.Max(st, 0);
        st = Math.Min(st, text.Length);
        speech.SpeakAsyncCancelAll(); 
        Speak();
    }

}

然后将主窗口中的所有SpeechSynthesizer对象替换为MySpeech对象,由于对一些函数采用了同名封装,所以除了更改SpeechSynthesizer speechMySpeech speech之外,其他地方的改动只有两处,一是speech.Speak()中没有参数了;二则是speech.SpeakProgress += Speech_SpeakProgress; 改为 speech.speech.SpeakProgress += Speech_SpeakProgress;,即调用MySpeech 中的SpeechSynthesizer对象来实现绑定。

MySpeech类中,SpeakAsync为异步朗读,用这个函数的好处是,无需担心阻塞主窗口,从而在主程序中也就无需新建线程来Speak,而只需

private void btnReadStart_Click(object sender, RoutedEventArgs e)
{
    var btn = sender as Button;
    speech.ctrlTask();
    txt.Focus();
    btn.Content = btn.Content.ToString()== "▶️" ? "⏯️" : "▶️";
}

另一方面,在跳转过程中,启用了SpeakAsyncCancelAll来终止Speak线程,从而可以重新开始朗读。

快进

首先,在Speech_SpeakProgress函数中更改speech中的开始游标st,即添加如下代码

speech.st = e.CharacterPosition;

然后,新增两个按钮,并注册btnSpeechJump_Click事件,

<Button Content="⏪" Click="btnSpeechJump_Click"/>
<Button Content="▶️" Width="20" Click="btnReadStart_Click"/>
<Button Content="⏩" Click="btnSpeechJump_Click"/>

其内容为

private void btnSpeechJump_Click(object sender, RoutedEventArgs e)
{
    var btn = sender as Button;
    int flag = btn.Content.ToString() == "⏩" ? 1 : -1;
    txtInfo.Text = (flag * 20).ToString();
    speech.Jump(flag * 20);
    txt.Focus();
}

其功能是每次点击快进,则前进20个字符,最终效果如下

在这里插入图片描述

当然,这个20不一定合理,所以最后可将其设为可设的,并为其分配一个参数。另外,快进和快退这两个按钮两侧还有两个按钮,预留用于跳转到下一章节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/651915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 中有哪些锁?

数据库中锁的设计初衷处理并发问题&#xff0c;作为多用户共享资源&#xff0c;当出现并发访问的时候&#xff0c;数据库需要合理控制资源访问规则。锁就是实现这些访问规则中的重要数据。 锁的分类 根据加锁范围&#xff0c;MySQL 里面的锁可以分成全局锁、表级锁、行锁三类…

计算机视觉算法——BEV Perception算法总结

计算机视觉算法——BEV Perception算法总结 计算机视觉算法——BEV Perception算法总结1. Homograph Based——3D LaneNet2. Depth Based——LSS3. MLP Based——PON4. Transformer Based——BEVFormer5. Transformer Based——Translating Image into Maps 计算机视觉算法——…

急于生成人工智能是有风险的:如何保护数据

每天的业务用户都在尝试使用 ChatGPT 和其他生成式 AI 工具。事实上&#xff0c; Gartner 预测&#xff0c; 到 2025 年&#xff0c;30% 的营销内容将由生成式人工智能创建并由人类增强。 然而&#xff0c;像三星这样的公司已经发现&#xff0c;不了解新技术风险的用户正在成…

linux(线程控制)

目录&#xff1a; 1.线程创建 2.线程等待 3.线程终止 4.线程分离 5.线程ID -------------------------------------------------------------------------------------------------------------------------------- 1.线程创建 pthread_create pthread_t *pthread 是一个输出型…

Nucleo-F411RE (STM32F411)LL库体验 5 - 通用定时器TIM2的使用

Nucleo-F411RE &#xff08;STM32F411&#xff09;LL库体验 5 - 通用定时器TIM2的使用 1、简述 设定TIM2&#xff0c;计数周期为10KHZ&#xff0c;即计时1s需要10000次&#xff0c;通过shell命令动态修改reload值&#xff0c;来更改定时器的频率。 假定设定TIM2 counter cloc…

第五章 部署PKI与证书服务

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 前言 PKI&#xff08;公钥加密基础结构&#xff09;&#xff1a;通…

【C++】list的使用和模拟实现

目录 1.什么是list2.list的一些接口3.list的模拟实现3.1 迭代器3.2 list主体3.2.1 构造函数3.2.2 拷贝构造、赋值重载3.2.3 主体内引入迭代器3.2.4 insert和erase3.2.5 clear和析构函数 3.3 const迭代器的实现3.4 实现迭代器的operator-> 4.总结list迭代器的实现 1.什么是li…

领域驱动应用架构实践

一个合适的应用架构不仅能促使项目朝着好的方向发展&#xff0c;易于维护&#xff0c;也能指导团队成员有效协作。 DDD是站在领域的角度来驱动应用架构的落地&#xff0c;接下来将介绍一种落地方案。 架构分层 首先在架构层次方面&#xff0c;在遵循DDD的分层架构模式的同时&…

STM32单片机(六)TIM定时器 -> 第五节:TIM输入捕获

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

Nucleo-F411RE (STM32F411)LL库体验 4 -Letter Shell移植与调试

Nucleo-F411RE &#xff08;STM32F411&#xff09;LL库体验 4 -Letter Shell移植与使用 1、串口的初始化 Nucleo-F411RE自带st-link&#xff0c;并支持虚拟串口的功能&#xff0c;根据原理图&#xff0c;st-link的rx tx接到了Nucleo-F411RE的PA2 PA3&#xff0c;所以我们要初…

以太网MII、RMII、GMII、RGMII(三)

目录 一、MII 二、RMII 三、GMII 四、RGMII 以太网硬件主要包括OSI的最下面两层&#xff0c;物理层和数据链路层&#xff0c;前者的芯片为PHY&#xff0c;后者的芯片为MAC控制器。而MAC与PHY之间的常用的数据传输接口有MII、RMII、GMII、RGMII。 模式 时钟 位宽 速率 M…

pytorch笔记:transformer 源码

来自B站视频&#xff0c;API查阅&#xff0c;TORCH.NN seq2seq 可以是 CNN&#xff0c;RNN&#xff0c;transformer nn.Transformer 关键源码&#xff1a; encoder_layer TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout,activation, layer_norm_eps, ba…

5.vue3医疗在线问诊项目 - _极速问诊-前置准备 ==> 需求分析、枚举类型、pinia仓库的初始化

5.vue3医疗在线问诊项目 - _极速问诊-前置准备 > 需求分析、枚举类型、pinia仓库的初始化 极速问诊-需求分析{#consult-product} 极速问诊阶段流程分析 线下看病流程&#xff1a; 选择医院&#xff08;三甲、普通&#xff09;》挂号》选择科室 》选择医生&#xff08;专家…

牛客网专项练习——C语言错题集(5)

文章目录 指针的值指针与数组、函数的组合空结构体* 和 的优先级 指针的值 指针的值是一个地址&#xff0c;题目中的字符串 “girl” 应该是 *p 的值&#xff0c;即指针 p 所指地址存储的数据的值。 指针与数组、函数的组合 int *p[n] 等价于 int (*)p[n]&#xff0c;是一个…

xinput1_3.dll丢失怎么办?xinput1_3.dll丢失的修复方法

xinput1_3.dll是电脑文件中的dll文件&#xff08;动态链接库文件&#xff09;。如果计算机中丢失了某个dll文件&#xff0c;可能会导致某些软件和游戏等程序无法正常启动运行&#xff0c;并且导致电脑系统弹窗报错。 在我们打开软件或者游戏的时候&#xff0c;电脑提示xinput1_…

STM32 Proteus仿真自动刹车系统超声波测距电机控制-0042

STM32 Proteus仿真自动刹车系统超声波测距电机控制-0042 Proteus仿真小实验&#xff1a; STM32 Proteus仿真自动刹车系统超声波测距电机控制-0042 功能&#xff1a; 硬件组成&#xff1a;STM32F103C6单片机 LCD1602显示器HCSR04超声波传感器按键(加 减)电机蜂鸣器 1.单片机…

学习Angular的编程之旅

目录 1、简介 2、特点 2.1 横跨多种平台 2.2 速度与性能 2.3 美妙的工具 3、Angular 应用&#xff1a;知识要点 3.1 组件 3.2 模板 3.3 依赖注入 4、与其他框架的对比 1、简介 Angular 是一个应用设计框架与开发平台&#xff0c;旨在创建高效而精致的单页面应用。 A…

Java(二):Spring Boot 项目-文件的增删改查下载

Spring Boot 项目-文件的增删改查下载 准备docker运行mysql设置MySQL时区查看当前MySQL使用的时区MySQL建库建表 定义两个实体类数据表实体类查询条件实体类 工具类com/example/user/utils/FileUtil.java 用到的SQL语句mapper user/src/main/resources/mapper/FileTableDao.xml…

基于SSM框架的Java的医院管理系统的设计与实现+文档

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 基于SSM框架的Java的医院管理系统的设计与实现文档 视频演示 视频去哪了呢&#xff1f;_哔哩哔哩_bilibili 系统介绍 摘 要 随着互联网技术的快速进…

ARM-驱动

字符设备驱动的内部实现&#xff1a; 文件存在文件系统中&#xff0c;会有一个标识inode号&#xff0c;基于这个标识找到了struct_inode结构体&#xff08;保存当前文件信息&#xff09;&#xff0c;struct_inode结构体中有一个struct cdev *i_cdev类型的字符设备指针&#x…