C#调用SAPI实现语音合成的两种方法
[size=medium]
我们都知道现在的语音合成TTS是可以通过微软的SAPI实现的,好处我就不多说了,方便而已,因为在微软的操作系统里面就自带了这个玩意,主要的方式有两种:
[color=red]
1、使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来的东西在XP和WIN7都能跑。(要引入SpeechLib,好像在项目上点引用,然后选到系统COM吧,好久没弄,记不清楚了)
2、使用WIN7的windows api,其实最终还是调用了SAPI,所以开发出来的东西就只能在WIN7上面跑。
[/color]
其实不管是哪一种,都是调用SAPI,可能后一种代码比较简单,使用已经安装的TTS引擎,现在一般用NeoSpeech,这个就不解释了,太强大了这个发音。。。
[/size]
COM组件技术:
public class Speach { private static Speach _Instance = null ; private SpeechLib.SpVoiceClass voice =null; //SAPI5.1private SpeechLib.SpVoice voice = null;//SAPI 5.4private Speach() { BuildSpeach() ; } public static Speach instance() { if (_Instance == null) _Instance = new Speach() ; return _Instance ; }
private void SetChinaVoice() { voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(0) ; }
private void SetEnglishVoice() { voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(1) ; }
private void SpeakChina(string strSpeak) { SetChinaVoice() ; Speak(strSpeak) ; }
private void SpeakEnglishi(string strSpeak) { SetEnglishVoice() ; Speak(strSpeak) ; }
public void AnalyseSpeak(string strSpeak) { int iCbeg = 0 ; int iEbeg = 0 ; bool IsChina = true ; for(int i=0;i<strSpeak.Length;i++) { char chr = strSpeak[i] ; if (IsChina) { if (chr<=122&&chr>=65) { int iLen = i - iCbeg ; string strValue = strSpeak.Substring(iCbeg,iLen) ; SpeakChina(strValue) ; iEbeg = i ; IsChina = false ; } } else { if (chr>122||chr<65) { int iLen = i - iEbeg ; string strValue = strSpeak.Substring(iEbeg,iLen) ; this.SpeakEnglishi(strValue) ; iCbeg = i ; IsChina = true ; } } }//end for if (IsChina) { int iLen = strSpeak.Length - iCbeg ; string strValue = strSpeak.Substring(iCbeg,iLen) ; SpeakChina(strValue) ; } else { int iLen = strSpeak.Length - iEbeg ; string strValue = strSpeak.Substring(iEbeg,iLen) ; SpeakEnglishi(strValue) ; } }
private void BuildSpeach() { if (voice == null) voice = new SpVoiceClass() ; }
public int Volume { get { return voice.Volume ; }
set { voice.SetVolume((ushort)(value)) ; } }
public int Rate { get { return voice.Rate ; } set { voice.SetRate(value) ; } }
private void Speak(string strSpeack) { try { voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ; } catch(Exception err) { throw(new Exception("发生一个错误:"+err.Message)) ; } }
public void Stop() { voice.Speak(string.Empty,SpeechLib.SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak) ; }
public void Pause()
{ voice.Pause() ; }
public void Continue() { voice.Resume() ; } }//end class
[color=blue][size=medium]在 private SpeechLib.SpVoiceClass voice =null;这里,我们定义个一个用来发音的类,并且在第一次调用该类时,对它用BuildSpeach方法进行了初始化。
我们还定义了两个属性Volume和Rate,能够设置音量和语速。
我们知道,SpVoiceClass 有一个Speak方法,我们发音主要就是给他传递一个字符串,它负责读出该字符串,如下所示。 [/size][/color]
private void Speak(string strSpeack) { try { voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ; } catch(Exception err) { throw(new Exception("发生一个错误:"+err.Message)) ; }}
[color=violet][size=medium]第二种使用.NET类库和系统API的代码如下:[/size][/color]
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Speech.Synthesis;using System.Speech;
namespace StudyBeta{ public class SRead { public SpeechSynthesizer synth; //语音合成对象 public SRead() { synth = new SpeechSynthesizer(); } public SRead(int m, int n) { //使用 synth 设置朗读音量 [范围 0 ~ 100] synth.Volume = m; //使用 synth 设置朗读频率 [范围 -10 ~ 10] synth.Rate = n; } public void SpeakChina(string ggg) { //SpVoice Voice = new SpVoice(); synth.SelectVoice("Microsoft Lili"); //Voice.Speak(ggg, SpFlags); synth.SpeakAsync(ggg); //String speechPeople = synth.Voice; //使用 synth 设置朗读音量 [范围 0 ~ 100] // synth.Volume = 80; //使用 synth 设置朗读频率 [范围 -10 ~ 10] // synth.Rate = 0; //使用synth 合成 wav 音频文件: //synth.SetOutputToWaveFile(string path); } public void SpeakEnglish(string ggg) { //SpVoice Voice = new SpVoice(); synth.SelectVoice("VW Julie"); synth.Speak(ggg); //ggg为要合成的内容 } public int m { get { return synth.Volume; } set { synth.Volume = value; } } public int n { get { return synth.Rate; } set { synth.Rate = value; } }}
C#调用SAPI实现语音合成的两种方法相关推荐
- dede列表页if判断输出html,首页、列表页调用文章body内容的两种方法
随着源码的开放性,很多SEOER对页面的要求也越来越复杂多样性,很多时候,织梦系统的原有功能并不能满足seoer的页面布置要求,这就需要继续开发页面,做更多的功能调用. 今天徐金华SEO给大家讲的是关 ...
- 织梦首页、列表页调用文章body内容的两种方法
关于首页.列表页调用文章body内容的两种方法,具体方法如下: 第一种方法: {dede:arclist row='1' typeid='1' addfields='body' idlist='1' ...
- ant中调用外部ant任务的两种方法
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- 【PyQt】pyqt加载调用ui界面文件的两种方法
使用PyQt开发界面软件,自然会用到Qt Designer进行界面设计,拖拖按钮.设置菜单什么的,然后保存为 .ui 文件.但是在 Python 代码里面如何使用这些 .ui 文件呢? 有两种方法: ...
- Python3调用谷歌机翻的两种方法
笔者环境:win10 + python3.9 + requests 2.25.1 + urllib3 1.25.8 + selenium 3.141.0 + chromedriver.exe 90.0 ...
- [整理] C#调用SQLDMO.DLL时间数据库备份 / 还原。 (香神无涯) // C#实现SQLSERVER2000数据库备份还原的两种方法 (带进度条)...
/// <summary> /// 通过调用MSSQL的SQLDMO.DLL文件来实现备份数据库 /// 1.首先在在项目中引用SQLDMO.DLL文件. /// 2.在引用中的SQLDM ...
- Py之qrcode:调用python的qrcode库两种方式生成二维码、带logo的二维码
Py之qrcode:调用python的qrcode库两种方式生成二维码.带logo的二维码 目录 python编程实现生成二维码 1.第一种方式-纯文本 2.第二种方式-带logo
- PhpCms V9调用指定栏目子栏目文章的两种方法
PhpCms V9调用指定栏目子栏目文章的两种方法 第一种.直接写子栏目id ,用cat in {pc:get sql="SELECT * from v9_news where status ...
- VB中FSO的调用的两种方法
方法一: Dim objFso Set objFso = CreateObject("Scripting.FileSystemObject") ...
最新文章
- 妙用vector:根据第一个不等的元素比较两个序列大小的利器
- 使用lucce分词怎么_深度学习时代,分词真的有必要吗
- 提问赠书 | 我们请了 7 位云原生专家,等你来问
- 从国考大数据看中国哪个省的人最爱当官
- 编程实现将一个N进制数转换成M进制数
- LeetCode动态规划 环形子数组的最大和
- 应用程序的主入口点应用程序的主入口点应用程序的主入口点
- Vscode 用Filter Line看日志,很爽
- SAP License:BWBCS学习记录
- python之decorator理解
- airtestide 下载后打不开_惠普打印机驱动怎么下载 惠普打印机驱动安装方法【步骤】...
- 001 spring介绍
- 【noip2013】d2解题报告
- 计算机odbc数据源管理位置,ODBC 常见数据源配置整理
- 【C/C++】在Dosbox安装和体验Turbo C++ 3.0
- 迅雷专用下载的几种代码
- Pico Neo3 4VR一体机破解版游戏资源合集安装包下载及安装教程分享
- 密西根州立大学计算机qs分数,密歇根州立大学有哪些专业_专业排名(QS世界排名)...
- Python 基础变量声明
- java下的Http多线程下载与断点续传分析【转自酷勤网】