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 要转换成语音的文本
*/
public void speak(String text)
{
this.speak(text,0);
}
/**
* 停止播