赞
踩
注:如果你使用的是C++工程项目(VS 2010),则需要对项目属性进行配置:
1.在项目属性页->配置属性->c/c++c->常规,在附加包含目录中,添加你的SAPI的include目录,例如:C:\Program Files\Microsoft Speech SDK 5.1\Include
2..在项目属性页->配置属性->连接器->输入,在附加依赖项中,添加你的SAPI.lib库的路径,例如:C:\Program Files\Microsoft Speech SDK 5.1\Lib\i386\sapi.lib
3.在程序中添加引用:
#include <sapi.h>
#pragma comment(lib,"sapi.lib");
然后就可以进行编程了。C++的使用方法可以参考博客:http://www.cnblogs.com/eping/archive/2010/05/23/1742201.html,也可以在网上搜。
SpVoice类有以下主要属性:
• Voice: 表示发音类型,相当于进行朗读的人,通常我们可以通过安装相应的语音引擎来增加相应的语音。
• Rate: 语音朗读速度,取值范围为-10到+10。数值越大,速度越快。
• Volume:音量,取值范围为0到100。数值越大,音量越大。
SpVoice有以下主要方法:
• Speak():完成将文本信息转换为语音并按照指定的参数进行朗读,该方法有Text和Flags两个参数,分别指定要朗读的文本和朗读方式(同步或异步等)。
• Pause():暂停使用该对象的所有朗读进程。该方法没有参数。
• Resume():恢复该对象所对应的被暂停的朗读进程。该方法没有参数。
关于SpVoice更多的内容可以参考帮助文件,安装了Speech SDK就会有,也可以去网上下载,不过是5.1版本的。
- //输出到音频:
- SpeechVoiceSpeakFlags ss = SpeechVoiceSpeakFlags.SVSFlagsAsync;//异步朗读模式
- SpVoice sp = new SpVoice();
- voice.Volume= 80;//音量
- voice.Rate = -3;//语速
- sp.Speak(string,ss);//string是要朗读的文本,可以是Edit控件里的文本或者数据库中的文本。
- //输出到语音文件
- SaveFileDialog dialog = new SaveFileDialog();
- dialog.Filter = "All files (*.*)|*.*|wav files (*.wav)|*.wav";
- dialog.Title = "Save to a wave file";
- dialog.FilterIndex = 2;
- dialog.RestoreDirectory = true;
- if (dialog.ShowDialog() == DialogResult.OK) {
- SpeechStreamFileMode spFileMode = SpeechStreamFileMode.SSFMCreateForWrite;//写模式
- SpFileStream spFileStream = new SpFileStream();//文件流
- spFileStream.Open(dialog.FileName, spFileMode, false);
- voice.AudioOutputStream = spFileStream;//voice设置输出对象为文件流
- voice.Speak(txtText.Text.Trim(), flags);//speak到文件流中,这时音频不会有声音发出
- voice.WaitUntilDone(5000);//直到输出完成或者超时
- spFileStream.Close();
- }
spFileStream.Format.Type = SpeechAudioFormatType.SAFTCCITT_ALaw_8kHzMono;//输出为A-LAW格式
- //输出到内存
- SpMemoryStream spmemorystrem = new SpMemoryStream();//内存流
- spmemorystrem.Format.Type = SpeechAudioFormatType.SAFTCCITT_ALaw_8kHzMono;
- voice.AudioOutputStream = spFileStream;
- voice.Speak(InvName, SpFlags);
- voice.WaitUntilDone(50000);//等待完成或者超时
注:
这里编译可以通过,运行时也没有音频输出,按理说是输出到内存中去了,但是不知道如何操作这个内存,比如返回一个指针什么的。SpMemoryStream 有GetData(),SetData()方法,分别是从内存中读取数据,和写数据。前者返回的是Object,后者没有返回值。所以没有办法从内存中得到音频流,然后用别的工具(比如语音卡的内存播发函数)进行播放。
目前有一个折中的方案,先将数据库中的文本合成到语音文件,然后调用文件播放函数(语音卡的函数)加载后播放电话端。这样一次播放就进行了两次IO操作。
参考文章:
http://www.cnblogs.com/SkyD/archive/2008/08/28/1278478.html
http://www.cnblogs.com/pfs1314/archive/2011/01/11/1932870.html
http://q.cnblogs.com/q/8393/
http://tech.it168.com/a2011/0103/1145/000001145635_1.shtml
http://blog.csdn.net/callmeback/article/details/6838024
http://blog.csdn.net/yuanchunze/article/details/3850835
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。