博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpeechLib 应用
阅读量:5071 次
发布时间:2019-06-12

本文共 3248 字,大约阅读时间需要 10 分钟。

//引用组件:Interop.SpeechLib.dll

//导入空间:SpeechLib

 

//引用组件:Interop.SpeechLib.dll

//导入空间:SpeechLib

//1.SpVoice voice = new SpVoice();

//2.voice.Speak(txt.Text, SpeechVoiceSpeakFlags.SVSFDefault); //同步朗读

//3.voice.Speak(txt.Text, SpeechVoiceSpeakFlags.SVSFlagsAsync); //异步朗读

//voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(0);//设置中文语音

//voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(1);设置英文语音

//错误修改:VS2010中 错误无法嵌入互操作类型“SpeechLib.SpVoiceClass”。请改用适用的接口
//解决方案:选中项目中引入的dll,鼠标右键,选择属性,把“嵌入互操作类型”设置为False。

//异常来自 HRESULT:0x8004503异常信息。一般是由Windows Audio服务没有开启造成的,尤其是win2003默认不开Windows Audio服务。

//1)请确认Windows Audio(AudioSrv)服务启动。
//进入cmd 输入net start AudioSrv
//2)声卡驱动安装成功。"

功能强大之处在于TTS能识别XML标记,通过给文本加上XML标记,我们让TTS朗读出更加符合语言阅读习惯的句子。例如:
<volume level=
"60"
></volume> 用于设置文本朗读的音量;
<rate absspeed=
"1"
/>、<rate speed=
"5"
/> 分别用于设置文本朗读的绝对速度和相对速度;
<pitch absmiddle=
"2"
/>、<pitch middle=
"5"
/> 分别用于设置文本朗读的绝对语调和相对语调;
<emph></emph> 在他们之间的句子被视为强调;
<spell></spell> 可以将单词逐个字母的拼写出来;
<silence msec=
"500"
/> 表示停止发声,并保持500微秒;
<context id=
"date_mdy"
>02/03/07</context> 可以按要求朗读出日期
<voice required=
"Language=409"
></voice> 用于设置朗读所用的语言,其中409表示使用英语,804表示使用汉语,而411表示日语。

  实例:

protected 
void 
speak_Click(
object 
sender, EventArgs e)
{
    
if 
(!
string
.IsNullOrWhiteSpace(txt.Text))
    
{
        
SpVoice voice =
new 
SpVoice();
        
StreamReader objReader =
new 
StreamReader(HttpContext.Current.Server.MapPath(
"~/upload/test.xml"
));
        
string 
sLine =
string
.Empty ;
       
string 
sPreview =
string
.Empty;
        
while 
(sLine !=
null
)
        
{
            
sLine = objReader.ReadLine();
            
if 
(sLine !=
null
)
            
{
                
// 这里需要添加Environment.NewLine表示换行
                
sPreview += sLine + Environment.NewLine;
            
}
        
}
        
SpeakXml(sPreview);
        
// 关闭文件读取器
        
objReader.Close();
    
}
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/// <summary>
/// 读出Xml文件内容
/// </summary>
/// <param name="xml">Xml文件内容</param>
public 
void 
SpeakXml(
string 
xml)
{
    
new 
SpVoice().Speak(xml, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync);
}
/// <summary>
/// 保存音频到文件
/// </summary>
/// <param name="xml">要读的Xml格式的内容</param>
/// <param name="fileName">要保存的文件名</param>
public 
void 
Save(
string 
xml, 
string 
fileName)
{
    
SpVoice voice = 
new 
SpVoice();
    
SpFileStream stream = 
new 
SpFileStream();
    
stream.Open(HttpContext.Current.Server.MapPath(fileName), SpeechStreamFileMode.SSFMCreateForWrite, 
false
);
    
voice.AudioOutputStream = stream;
    
voice.Speak(xml, SpeechVoiceSpeakFlags.SVSFlagsAsync | SpeechVoiceSpeakFlags.SVSFIsXML);
    
voice.WaitUntilDone(3);
    
stream.Close();
}
// <summary>
/// 设置中文语音
/// </summary>
public 
void 
SetChinaVoice()
{
    
SpVoice voice = 
new 
SpVoice();
    
voice.Voice = voice.GetVoices(
string
.Empty, 
string
.Empty).Item(0);
}
 
/// <summary>
/// 设置英文语音
/// </summary>
public 
void 
SetEnglishVoice()
{
    
SpVoice voice = 
new 
SpVoice();
    
voice.Voice = voice.GetVoices(
string
.Empty, 
string
.Empty).Item(1);
}

  

 

界面的实现

在打开文件时,可以选择打开文本文件(*.Txt)和XML文件(*.Xml),如果打开的是XML文件,将不对内容作任何修改,并且也不允许调节音量、语速、语调,因为这些都应该在XML文件中写好;如果打开的是文本文件,则在朗读前,会调用AddXmlLangTag方法给文本加上语言标记,调用AddXmlPitchTag方法给文本加上语调标记,同时也允许调节音量、语速、语调。
总结
通过为普通文本内容设置语音XML标记,并调用SpVoice接口的Speak方法,可以实现中英文文本的混合朗读。如果要使朗读的效果更佳,就必须手工为每一个句子设置相应的XML标记,这样可使朗读更接近人性化。

转载于:https://www.cnblogs.com/wenlong2019/p/10494671.html

你可能感兴趣的文章
小算法
查看>>
201521123024 《java程序设计》 第12周学习总结
查看>>
新作《ASP.NET MVC 5框架揭秘》正式出版
查看>>
IdentityServer4-用EF配置Client(一)
查看>>
WPF中实现多选ComboBox控件
查看>>
读构建之法第四章第十七章有感
查看>>
Windows Phone开发(4):框架和页 转:http://blog.csdn.net/tcjiaan/article/details/7263146
查看>>
Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)【转】
查看>>
python asyncio 异步实现mongodb数据转xls文件
查看>>
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
[ZJOI2007]棋盘制作 【最大同色矩形】
查看>>
IOS-图片操作集合
查看>>
模板统计LA 4670 Dominating Patterns
查看>>
团队项目开发客户端——登录子系统的设计
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
session如何保存在专门的StateServer服务器中
查看>>
react展示数据
查看>>
测试计划
查看>>
选择器
查看>>