使用语音即时校对输入内容

简介:

 

 

此文将介绍利用微软TTS引擎,在录入数据时进行即时语音校对的示例。

 

这是一项非常简单且非常实用的技术,此功能在行业软件中使用的话,将会使用户的录入准确率大幅提高,还可减少甚至取消后期核对工作。

 

你需要使用以下类库来操作TTS

 

 

在文章末尾处提供的源代码中将包含此类库。

 

现在开始编写这个示例程序:

 

新建一个WinForm项目,引入上述dll,在窗体后台代码中添加对其命名空间的引用:

 

 

using  DotNetSpeech;

 

 

由于我们还需要用到正则表达式,所以也将其所在命名空间一并引用:

 

 

using  System.Text.RegularExpressions;

 

 

然后来设计一个基本的用户界面:

 

 

添加一个BackgroundWorker组件:

 

 

为其DoWork事件添加处理:

 

 

private   void  backgroundWorker1_DoWork( object  sender, DoWorkEventArgs e)

{

        SpeechVoiceSpeakFlags SpFlags 
=  SpeechVoiceSpeakFlags.SVSFlagsAsync;

        SpVoice Voice 
=   new  SpVoice();

        Voice.Rate 
=   - 3 ;

        Voice.Speak(e.Argument.ToString(), SpFlags);

}

 

 

Voice.Rate属性是用来设置语速的修正值的,我希望它读慢点,所以就设为了-3

 

这个事件处理的功能就是在后台将接收到的字符串通过TTS念出来。

 

我们再来编写一个方法,来统一对backgroundWorker1进行调用:

 

 

void  朗读( object  内容)

{

    
try

    {

        backgroundWorker1.RunWorkerAsync(内容);

    }

    
catch  (Exception er)

    {

        MessageBox.Show(er.Message, 
" 提示 " , MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

}

 

 

为了便于演示,加上我个人习惯,我将此方法名称设为了中文。

 

由于语音处理需要一定时间,在此期间如果再度调用backgroundWorker1的RunWorkerAsync方法,将会引发异常,所以需要进行捕获。

 

实际应用中如需要照顾较高速度的录入,可以采用多个BackgroundWorker组件,轮流滚动处理。

 

接下来就是为每个输入框定义朗读方式了,我们会在用户按下回车键时,进行语音处理,并将光标跳转到下一个输入框。

 

首先设置序号输入框的事件处理:

 

 

private   void  numericUpDown1_KeyDown( object  sender, KeyEventArgs e)

{

    
if  (e.KeyData  !=  Keys.Enter)  return ;

    朗读(numericUpDown1.Value);

    textBox1.Select();

}

 

 

然后是品名的:

 

 

private   void  textBox1_KeyDown( object  sender, KeyEventArgs e)

{

    
if  (e.KeyData  !=  Keys.Enter)  return ;

    朗读(textBox1.Text);

    numericUpDown2.Select();

}

 

 

这两个都比较简单,九十直接念出原文。

 

单价则有些不同:

 

 

private   void  numericUpDown2_KeyDown( object  sender, KeyEventArgs e)

{

    
if  (e.KeyData  !=  Keys.Enter)  return ;

    朗读(
" "   +  numericUpDown2.Value);

    numericUpDown3.Select();

}

 

 

在其内容前加了人民币符号,它阅读时就会这样读:九百六十七元

 

数量与之类似:

 

 

private   void  numericUpDown3_KeyDown( object  sender, KeyEventArgs e)

{

    
if  (e.KeyData  !=  Keys.Enter)  return ;

    朗读(numericUpDown3.Value 
+   " " );

    textBox2.Select();

}

 

 

内部编号有些特殊,我期望它能够将每个字母或数字都单独念出,这可以通过加注拼写标记来实现:“<spell></spell>”

但是这样还有一个问题,就是他读数字的时候会将其读作英文,这不是我们所希望的,这还需通过加注语言标记来修正:“<voice required=""Language=804""></voice>”

故此我们需要附属一个方法来将源文本格式化:

 

 

private   void  textBox2_KeyDown( object  sender, KeyEventArgs e)

{

    
if  (e.KeyData  !=  Keys.Enter)  return ;

    朗读(加注中文标记(textBox2.Text));

    button1.Select();

}

 

string  加注中文标记( string  原字符串)

{

    
return   string .Format( " <spell>{0}</spell> " , Regex.Replace(原字符串,  @" (.) " @" <voice required=""Language=804"">$1</voice> " ));

}

 

 

好了,最后是提交按钮的事件处理,我们也要让他朗读点东西:

 

 

private   void  button1_Click( object  sender, EventArgs e)

{

    listBox1.Items.Add(
new

    {

        序号 
=  numericUpDown1.Value,

        品名 
=  textBox1.Text,

        价格 
=  numericUpDown2.Value,

        数量 
=  numericUpDown3.Value,

        内部编号 
=  textBox2.Text

    });

    朗读(numericUpDown1.Value 
+   " 号,添加完毕 " );

    numericUpDown1.Value
++ ;

    numericUpDown2.Value 
=   0 ;

    numericUpDown3.Value 
=   1 ;

    textBox1.Text 
=  textBox2.Text  =   "" ;

    numericUpDown1.Select();

}

 

 

至此这个示例就完成了,其使用效果见下面这段视频:

 

 

源代码下载

 


 

插播个小喇叭广播:

 

我的MailMail现已正式发布,现在开始到9月1日0时止举办免费赠送注册码活动,欢迎参与^^:http://www.cnblogs.com/SkyD/archive/2008/08/28/1278463.html

 

  


本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2008/08/28/1278478.html,如需转载请自行联系原作者

相关文章
|
9月前
|
存储 Java
Bitmap位图(Java实现)
本文介绍了使用Java实现一个简单的Bitmap,通过自定义byte数组存储数据,提供put和exist方法分别用于插入数据和查询数据是否存在。Bitmap利用位操作高效地管理大量布尔值,适用于空间优化的场景。代码中详细解释了位图的核心原理、方法实现及边界检查。后续计划探讨位图在海量数据去重中的应用及JDK BitSet源码分析。
646 7
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
GPT学术优化:专为学术研究和写作设计的多功能开源项目
GPT学术优化是一个专为学术研究和写作设计的多功能开源项目,集成了论文翻译、源代码解析、互联网信息获取、Latex文章校对、论文润色和摘要生成等多项实用功能。本文将详细介绍GPT学术优化的主要功能、技术原理以及如何运行该项目的教程。
357 11
GPT学术优化:专为学术研究和写作设计的多功能开源项目
|
9月前
|
Python
批量将不同的工作簿合并到同一个Excel文件
本文介绍如何使用Python的`pandas`库批量合并不同工作簿至同一Excel文件。通过模拟生成三个班级的成绩数据,分别保存为Excel文件,再将这些文件合并成一个包含所有班级成绩的总成绩单。步骤包括安装必要库、生成数据、保存与合并工作簿。
222 6
|
10月前
|
人工智能 并行计算 监控
深入剖析 Qwen2.5 - 32B 模型在 VLLM 上的单机三卡部署与运行
本文深入探讨了Qwen2.5 - 32B模型在VLLM框架上的部署过程,从模型下载、启动命令、资源占用分析到GPU资源分配及CUDA图应用,详述了大模型运行的挑战与优化策略,强调了硬件资源规划与技术调优的重要性。
6135 2
|
消息中间件 Oracle 关系型数据库
Flink CDC(Change Data Capture)
Flink CDC(Change Data Capture)是一个 Flink 应用程序,用于从关系型数据库(如 MySQL、PostgreSQL 等)中捕获数据更改,将其转换为流数据,并将其发送到 Flink
730 1
|
存储 Java C++
大端(Big Endian)与小端(Little Endian)简介与实现
【大端(Big Endian)与小端(Little Endian)简介】Byte Endian是指字节在内存中的组织,所以也称它为Byte Ordering,或Byte Order。     对于数据中跨越多个字节的对象,我们必须为它建立这样的约定: (1) 它的地址是多少? (2) 它的字节在内存中是如何组织的?     针对第一个问题,有这样的解释:     对于跨
2606 0
|
小程序
🍁商城类小程序实战(二):底部导航栏的制作
🍁商城类小程序实战(二):底部导航栏的制作
449 3
🍁商城类小程序实战(二):底部导航栏的制作
|
Web App开发
用户脚本管理器 Tampermonkey 安装使用图文教程
Tampermonkey是一款备受欢迎的浏览器扩展和用户脚本管理器,它适用于目前各种主流浏览器。 方便的脚本管理(正在运行的脚本和可以运行的脚本在图标处显示一览无余) 脚本自动更新(可以设置更新频率,保持脚本处于最新版本) 设置白名单(将不需要使用脚本的网站加入名单) chrome同步(多个chrome浏览器可以同步脚本设置)
用户脚本管理器 Tampermonkey 安装使用图文教程
云存储网关商业化发布
产品介绍: 通过云存储网关,客户在无需改变应用程序接口的情况下,可以直接使用NFS/SMB或iSCSI协议访问OSS存储空间适用客户: 典型客户群体: 生命科学,影视渲染,医疗,制造业 视频监控,中小企业,工作室,分支机构等。
897 0
|
Web App开发 安全
Twitter安全漏洞传病毒 国内类似网站亦需警惕
Twitter是即时信息的一个变种,它允许用户将自己的最新动态和想法以短信息的形式发送给手机和个性化网站群。日前,国外安全厂商的研究人员发现了一个Twitter的安全漏洞,这个漏洞可以被利用来传播病毒。
2891 0