Java使用Jacob调用SAPI合成语音:
1.配置Jacob:我这里使用的jacob为jacob-1.18-M2,jacob-1.18-M2下载下来之后,解压缩文件,
里面的文件为docs、jacob.jar、jacob-1.18-M2-x64.dll、jacob-1.18-M2-x86.dll、LICENSE.TXT、README.txt;
把jacob.jar复制到项目的lib目录下面,jacob-1.18-M2-x64.dll和jacob-1.18-M2-x86.dll是两个动态库文件,
它们指JDK的安装版本,如果JDK是64位的,那么需要把jacob-1.18-M2-x64.dll复制到JRE BIN目录下面,因为
我装的JDK是32位的,所以我把jacob-1.18-M2-x86.dll复制到JRE BIN目录下面,
我的JRE路径为G:\Program Files (x86)\Java\jre7\bin。
2.代码如下
- package com.jacob;
- import com.jacob.activeX.ActiveXComponent;
- import com.jacob.com.ComThread;
- import com.jacob.com.Dispatch;
- import com.jacob.com.Variant;
- /**
- * 调用MSTTS将字符串转换成语音信息
- * 调用windows speech API(SAPI)
- * @author suyunlong
- *
- */
- public class MSTTSSpeech
- {
- private int volume=100;// 声音:1到100
- private int rate=0;// 频率:-10到10
- private int voice=0;// 语音库序号
- private int audio=0;// 输出设备序号
- private ActiveXComponent ax=null;
- private Dispatch spVoice=null;// 声音对象
- private Dispatch spFileStream=null;// 音频文件输出流对象,在读取或保存音频文件时使用
- private Dispatch spAudioFormat=null;// 音频格式对象
- private Dispatch spMMAudioOut=null;// 音频输出对象
- private int formatType=22;// 音频的输出格式,默认为:SAFT22kHz16BitMono
- public MSTTSSpeech()
- {
- ComThread.InitSTA();
- if(ax==null)
- {
- ax=new ActiveXComponent("Sapi.SpVoice");
- spVoice=ax.getObject();
- }
- }
- /**
- * 改变语音库
- * @param voice 语音库序号
- */
- public void changeVoice(int voice)
- {
- if(this.voice != voice)
- {
- this.voice=voice;
- }
- try
- {
- Dispatch voiceItems=Dispatch.call(spVoice,"GetVoices").toDispatch();
- int count=Integer.valueOf(Dispatch.call(voiceItems,"Count").toString());
- if(count>0)
- {
- Dispatch voiceItem=Dispatch.call(voiceItems,"Item",new Variant(this.voice)).toDispatch();
- Dispatch.put(spVoice,"Voice",voiceItem);
- }
- }
- catch(Exception e)
- {
- System.out.println(e.getMessage());
- e.printStackTrace();
- }
- }
- /**
- * 改变音频输出设备
- * @param audio 音频设备序号
- */
- public void changeAudioOutput(int audio)
- {
- if(this.audio != audio)
- {
- this.audio=audio;
- }
- try
- {
- Dispatch audioOutputs=Dispatch.call(spVoice,"GetAudioOutputs").toDispatch();
- int count=Integer.valueOf(Dispatch.call(audioOutputs,"Count").toString());
- if(count > 0)
- {
- Dispatch audioOutput=Dispatch.call(audioOutputs,"Item",new Variant(this.audio)).toDispatch();
- Dispatch.put(spVoice,"AudioOutput",audioOutput);
- }
- }
- catch(Exception e)
- {
- System.out.println(e.getMessage());
- e.printStackTrace();
- }
- }
- /**
- * 播放语音
- * @param text 要转换成语音的文本
*/