1 下载 jacob
下载 jacob
2 解压 jacob
Windows 系统 版本 | 文件复制位置 |
---|---|
Windows 64 位 | 选择 jacob-1.19-x64.dll 复制到 项目用 JDK 的 bin 目录下面(*****\jdk1.8.0_191\bin) |
Windows 32 位 | 选择 jacob-1.19-x86.dll 复制到 项目用 JDK 的 bin 目录下面(*****\jdk1.8.0_191\bin) |
复制 :
jacob.jar 到自己的Java项目中
3 测试代码
3.1 语音合成(文字转语音)
package com.xu.voice;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
/**
* Java Music 文字转音频
* @ClassName: Voice
* @Description: Java Music 文字转音频
* @author: hyacinth
* @date: 2019年10月27日 下午13:08:41
* @Copyright: hyacinth
*/
public class Voice {
private ActiveXComponent component = null;
private Dispatch ovoice = null;
private int volume = 100;//音量大小:1到100
private int rate = 0;//播放速度:-10到10
public Voice() {
component = new ActiveXComponent("Sapi.SpVoice");
ovoice = component.getObject();
}
public static void main(String[] args) {
Voice voice = new Voice();
voice.text_to_voice("将文字转换成音频信号");
}
/**
* Java Music 文字-->声音
* @Title: text_to_voice
* @Description: 文字-->声音
* @param str 文字
* @date 2019年10月27日 下午14:28:41
*/
public void text_to_voice(String str) {
component.setProperty("Volume", new Variant(this.volume));
component.setProperty("Rate", new Variant(this.rate));
Dispatch.call(ovoice, "Speak", new Variant(str));
component.safeRelease();
ovoice.safeRelease();
}
}
3.2 语音合成(文字转音频文件)
package com.xu.voice;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
/**
* Java Music 文字转音频文件
* @ClassName: Voice
* @Description: Java Music 文字转音频文件
* @author: hyacinth
* @date: 2019年10月27日 下午13:15:41
* @Copyright: hyacinth
*/
public class Song {
private ActiveXComponent active = null;
private int type=39;// 音频的输出格式
private int volume = 100;// 音量大小:1到100
private int rate = 0;// 播放速度:-10到10
public static void main(String[] args) {
Song song = new Song();
song.text_to_wav("将文字转换成音频信号","C:\\Users\\Administrator\\Desktop\\TEST.wav");
}
/**
* Java Music 文字-->wav音频文件
* @Title: text_to_wav
* @Description: 文字-->wav音频文件
* @param str 文字
* @param wpath wav文件保存路径
* @date 2019年10月27日 下午13:15:41
*/
public void text_to_wav (String str,String wpath) {
// 1 创建 文件输出对象
active = new ActiveXComponent("Sapi.SpFileStream");//文件输出对象
Dispatch file = active.getObject();
// 2 创建 音频格式对象
active = new ActiveXComponent("Sapi.SpAudioFormat");//音频格式对象
Dispatch audio = active.getObject();
// 3 创建 语音合成对象
active = new ActiveXComponent("Sapi.SpVoice");//语音合成对象
Dispatch voice = active.getObject();
// 4 设置 音频格式
Dispatch.put(audio,"Type",new Variant(this.type));
// 5 设置 输出音频
Dispatch.putRef(file,"Format",audio);
// 6 设置 音频文件输出路径
Dispatch.call(file,"Open",new Variant(wpath),new Variant(3),new Variant(true));
// 7 音频-->输出音频流
Dispatch.putRef(voice,"AudioOutputStream",file);
// 8 调整音量和语速
Dispatch.put(voice,"Volume",new Variant(this.volume));// 设置音量
Dispatch.put(voice,"Rate",new Variant(this.rate));// 设置速率
// 9 语音合成(文字-->音频)
Dispatch.call(voice,"Speak",new Variant(str));
// 10 关闭流对,释放资源
Dispatch.call(file,"Close");
audio.safeRelease();
voice.safeRelease();
}
}
3.3 语音合成(全部代码)
package com.xu.voice;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
/**
* Java 播放音频
* @ClassName: MusicPlayer
* @Description: TODO
* @author: hyacinth
* @date: 2019年10月25日 下午12:08:41
* @Copyright: hyacinth
*/
public class Music {
private ActiveXComponent component = null;
private Dispatch voice = null;
private Dispatch file = null;// 音频文件对象
private Dispatch audio = null;// 音频格式对象
private int type = 39;// 音频的输出格式
private int volume = 100;// 音量大小:1到100
private int rate = 0;// 播放速度:-10到10
private int nvoice = 0;// 语音库序号
private int naudio = 0;// 输出设备序号
public Music() {
ComThread.InitSTA();
component = new ActiveXComponent("Sapi.SpVoice");
voice = component.getObject();
}
public static void main(String[] args) {
Music music = new Music();
music.get_system_voices();
music.get_system_audio_outputs();
//music.text_to_voice("将文字转换成音频信号","C:\\Users\\Administrator\\Desktop\\TEST.wav");
music.text_to_voice("将文字转换成音频信号");
}
public int getVolume() {
return volume;
}
public void setVolume(int volume) {
this.volume = volume;
}
public int getRate() {
return rate;
}
public void setRate(int rate) {
this.rate = rate;
}
/**
* Java Music 设置音频输出格式类型
* @Title: set_voice_format_type
* <table border="1" cellpadding="10">
* <tr><td colspan="2" align="center">Default</td></tr>
* <tr><th align="center">参数解释</th><th align="center">输入参数</th></tr>
* <tr><td align="left">SAFTDefault</td><td align="center">-1 </td></tr>
* <tr><td align="left">SAFTNoAssignedFormat <td align="center"> 0 </td></tr>
* <tr><td align="left">SAFTText <td align="center"> 1 </td></tr>
* <tr><td align="left">SAFTNonStandardFormat <td align="center"> 2 </td></tr>
* <tr><td align="left">SAFTExtendedAudioFormat <td align="center"> 3 </td></tr>
* <tr><td colspan="2" align="center"> Standard PCM wave formats </td></tr>
* <tr><td align="left">SAFT8kHz8BitMono <td align="center"> 4 </td></tr>
* <tr><td align="left">SAFT8kHz8BitStereo <td align="center"> 5 </td></tr>
* <tr><td align="left">SAFT8kHz16BitMono <td align="center"> 6 </td></tr>
* <tr><td align="left">SAFT8kHz16BitStereo <td align="center"> 7 </td></tr>
* <tr><td align="left">SAFT11kHz8BitMono <td align="center"> 8 </td></tr>
* <tr><td align="left">SAFT11kHz8BitStereo <td align="center"> 9 </td></tr>
* <tr><td align="left">SAFT11kHz16BitMono <td align="center"> 10 </td></tr>
* <tr><td align="left">SAFT11kHz16BitStereo <td align="center"> 11 </td></tr>
* <tr><td align="left">SAFT12kHz8BitMono <td align="center"> 12 </td></tr>
* <tr><td align="left">SAFT12kHz8BitStereo <td align="center"> 13 </td></tr>
* <tr><td align="left">SAFT12kHz16BitMono <td align="center"> 14 </td></tr>
* <tr><td align="left">SAFT12kHz16BitStereo <td align="center"> 15 </td></tr>
* <tr><td align="left">SAFT16kHz8BitMono <td align="center"> 16 </td></tr>
* <tr><td align="left">SAFT16kHz8BitStereo <td align="center"> 17 </td></tr>
* <tr><td align="left">SAFT16kHz16BitMono <td align="center"> 18 </td></tr>
* <tr><td align="left">SAFT16kHz16BitStereo <td align="center"> 19 </td></tr>
* <tr><td align="left">SAFT22kHz8BitMono <td align="center"> 20 </td></tr>
* <tr><td align="left">SAFT22kHz8BitStereo <td align="center"> 21 </td></tr>
* <tr><td align="left">SAFT22kHz16BitMono <td align="center"> 22 </td></tr>
* <tr><td align="left">SAFT22kHz16BitStereo <td align="center"> 23 </td></tr>
* <tr><td align="left">SAFT24kHz8BitMono <td align="center"> 24 </td></tr>
* <tr><td align="left">SAFT24kHz8BitStereo <td align="center"> 25 </td></tr>
* <tr><td align="left">SAFT24kHz16BitMono <td align="center"> 26 </td></tr>
* <tr><td align="left">SAFT24kHz16BitStereo <td align="center"> 27 </td></tr>
* <tr><td align="left">SAFT32kHz8BitMono <td align="center"> 28 </td></tr>
* <tr><td align="left">SAFT32kHz8BitStereo <td align="center"> 29 </td></tr>
* <tr><td align="left">SAFT32kHz16BitMono <td align="center"> 30 </td></tr>
* <tr><td align="left">SAFT32kHz16BitStereo <td align="center"> 31 </td></tr>
* <tr><td align="left">SAFT44kHz8BitMono <td align="center"> 32 </td></tr>
* <tr><td align="left">SAFT44kHz8BitStereo <td align="center"> 33 </td></tr>
* <tr><td align="left">SAFT44kHz16BitMono <td align="center"> 34 </td></tr>
* <tr><td align="left">SAFT44kHz16BitStereo <td align="center"> 35 </td></tr>
* <tr><td align="left">SAFT48kHz8BitMono <td align="center"> 36 </td></tr>
* <tr><td align="left">SAFT48kHz8BitStereo <td align="center"> 37 </td></tr>
* <tr><td align="left">SAFT48kHz16BitMono <td align="center"> 38 </td></tr>
* <tr><td align="left">SAFT48kHz16BitStereo <td align="center"> 39 </td></tr>
* <tr><td colspan="2" align="center">TrueSpeech format </td></tr>
* <tr><td align="left">SAFTTrueSpeech_8kHz1BitMono <td align="center"> 40 </td></tr>
* <tr><td colspan="2" align="center">A-Law formats </td></tr>
* <tr><td align="left">SAFTCCITT_ALaw_8kHzMono <td align="center"> 41 </td></tr>
* <tr><td align="left">SAFTCCITT_ALaw_8kHzStereo <td align="center"> 42 </td></tr>
* <tr><td align="left">SAFTCCITT_ALaw_11kHzMono <td align="center"> 43 </td></tr>
* <tr><td align="left">SAFTCCITT_ALaw_11kHzStereo <td align="center"> 4 </td></tr>
* <tr><td align="left">SAFTCCITT_ALaw_22kHzMono <td align="center"> 44 </td></tr>
* <tr><td align="left">SAFTCCITT_ALaw_22kHzStereo <td align="center"> 45 </td></tr>
* <tr><td align="left">SAFTCCITT_ALaw_44kHzMono <td align="center"> 46 </td></tr>
* <tr><td align="left">SAFTCCITT_ALaw_44kHzStereo <td align="center"> 47 </td></tr>
* <tr><td colspan="2" align="center"> u-Law formats </td></tr>
* <tr><td align="left">SAFTCCITT_uLaw_8kHzMono <td align="center"> 48 </td></tr>
* <tr><td align="left">SAFTCCITT_uLaw_8kHzStereo <td align="center"> 49 </td></tr>
* <tr><td align="left">SAFTCCITT_uLaw_11kHzMono <td align="center"> 50 </td></tr>
* <tr><td align="left">SAFTCCITT_uLaw_11kHzStereo <td align="center"> 51 </td></tr>
* <tr><td align="left">SAFTCCITT_uLaw_22kHzMono <td align="center"> 52 </td></tr>
* <tr><td align="left">SAFTCCITT_uLaw_22kHzStereo <td align="center"> 53 </td></tr>
* <tr><td align="left">SAFTCCITT_uLaw_44kHzMono <td align="center"> 54 </td></tr>
* <tr><td align="left">SAFTCCITT_uLaw_44kHzStereo <td align="center"> 55 </td></tr>
* <tr><td align="left">SAFTADPCM_8kHzMono <td align="center"> 56 </td></tr>
* <tr><td align="left">SAFTADPCM_8kHzStereo <td align="center"> 57 </td></tr>
* <tr><td align="left">SAFTADPCM_11kHzMono <td align="center"> 58 </td></tr>
* <tr><td align="left">SAFTADPCM_11kHzStereo <td align="center"> 59 </td></tr>
* <tr><td align="left">SAFTADPCM_22kHzMono <td align="center"> 60 </td></tr>
* <tr><td align="left">SAFTADPCM_22kHzStereo <td align="center"> 61 </td></tr>
* <tr><td align="left">SAFTADPCM_44kHzMono <td align="center"> 62 </td></tr>
* <tr><td align="left">SAFTADPCM_44kHzStereo <td align="center"> 63 </td></tr>
* <tr><td colspan="2" align="center">GSM 6.10 formats </td></tr>
* <tr><td align="left">SAFTGSM610_8kHzMono <td align="center"> 64 </td></tr>
* <tr><td align="left">SAFTGSM610_11kHzMono <td align="center"> 65 </td></tr>
* <tr><td align="left">SAFTGSM610_22kHzMono <td align="center"> 66 </td></tr>
* <tr><td align="left">SAFTGSM610_44kHzMono <td align="center"> 67 </td></tr>
* <tr><td colspan="2" align="center">Other formats </td></tr>
* <tr><td align="left">SAFTNUM_FORMATS <td align="center"> 68 </td></tr>
* @param type 音频输出格式类型
* @date 2019年10月27日12:10:41
*/
public void set_voice_format_type(int type) {
this.type=type;
}
/**
* Java Music 文字-->wav音频
* @Title: text_to_wav
* @Description: 文字-->wav音频
* @param str 文字
* @param wpath wav文件保存路径
* @date 2019年10月27日 下午12:28:41
*/
public void text_to_wav(String str,String wpath) {
// 1 创建 文件输出对象
component = new ActiveXComponent("Sapi.SpFileStream");
file = component.getObject();
// 2 创建音频流格式对象
if(audio == null) {
component = new ActiveXComponent("Sapi.SpAudioFormat");
audio = component.getObject();
}
// 3 设置 音频格式
Dispatch.put(audio,"Type",new Variant(this.type));
// 4 设置 输出音频
Dispatch.putRef(file,"Format",audio);
// 5 设置 音频文件输出路径
Dispatch.call(file,"Open",new Variant(wpath),new Variant(3),new Variant(true));
// 6 音频-->输出音频流
Dispatch.putRef(voice,"AudioOutputStream",file);
// 8 调整音量和语速
Dispatch.put(voice,"Volume",new Variant(this.volume));// 设置音量
Dispatch.put(voice,"Rate",new Variant(this.rate));// 设置速率
// 9 语音合成(文字-->音频)
Dispatch.call(voice,"Speak",new Variant(str));
// 10 关闭流对,释放资源
Dispatch.call(file,"Close");
audio.safeRelease();
voice.safeRelease();
}
/**
* Java Music 文字-->wav音频-->声音
* @Title: text_to_voice
* @Description: 文字-->音频-->声音
* @param str 文字
* @param wpath wav文件保存路径
* @throws IOException
* @throws UnsupportedAudioFileException
* @date 2019年10月25日 下午12:28:41
*/
public void text_to_voice(String str,String wpath) throws UnsupportedAudioFileException, IOException {
// 1 创建 文件输出对象
component = new ActiveXComponent("Sapi.SpFileStream");
file = component.getObject();
// 2 创建音频流格式对象
if(audio == null) {
component = new ActiveXComponent("Sapi.SpAudioFormat");
audio = component.getObject();
}
// 3 设置 音频格式
Dispatch.put(audio,"Type",new Variant(this.type));
// 4 设置 输出音频
Dispatch.putRef(file,"Format",audio);
// 5 设置 音频文件输出路径
Dispatch.call(file,"Open",new Variant(wpath),new Variant(3),new Variant(true));
// 6 音频-->输出音频流
Dispatch.putRef(voice,"AudioOutputStream",file);
// 8 调整音量和语速
Dispatch.put(voice,"Volume",new Variant(this.volume));// 设置音量
Dispatch.put(voice,"Rate",new Variant(this.rate));// 设置速率
// 9 语音合成(文字-->音频)
Dispatch.call(voice,"Speak",new Variant(str));
// 10 关闭流对,释放资源
Dispatch.call(file,"Close");
audio.safeRelease();
voice.safeRelease();
play_wav(wpath);
}
/**
* Java Music 文字-->声音
* @Title: text_to_voice
* @Description: 文字-->声音
* @param str 文字
* @date 2019年10月25日 下午12:28:41
*/
public void text_to_voice(String str) {
component.setProperty("Volume", new Variant(this.volume));
component.setProperty("Rate", new Variant(this.rate));
Dispatch.call(voice, "Speak", new Variant(str));
component.safeRelease();
voice.safeRelease();
}
/**
* Java Music 播放 WAV音频文件
* @Title: play_wav
* @Description: 播放 WAV音频文件
* @param path WAV文件路径
* @throws IOException
* @throws UnsupportedAudioFileException
* @date 2019年10月25日 下午12:28:41
*
*/
public void play_wav(String path) throws UnsupportedAudioFileException, IOException {
File file=new File(path);
if(!file.exists() || !path.toLowerCase().endsWith(".wav")) {
throw new RuntimeException("文件不存在");
}
AudioInputStream stream=AudioSystem.getAudioInputStream(file);
AudioFormat target = stream.getFormat();
DataLine.Info dinfo = new DataLine.Info(SourceDataLine.class, target);
SourceDataLine line = null;
int len = -1;
try {
line = (SourceDataLine) AudioSystem.getLine(dinfo);
line.open(target);
line.start();
byte[] buffer = new byte[1024];
while ((len = stream.read(buffer)) > 0) {
line.write(buffer, 0, len);
}
// Block等待临时数据被输出为空
line.drain();
// 关闭读取流
stream.close();
// 停止播放
line.stop();
line.close();
}catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
/**
* Java Music 设置语音库
* @Title: set_voice_library
* @Description: 设置语音库
* @param voice 语音库序号
* @date 2019年10月25日 下午12:28:41
*/
public void set_voice_library(int nvoice) {
if(this.nvoice != nvoice) {
this.nvoice = nvoice;
} try {
Dispatch items = Dispatch.call(voice,"GetVoices").toDispatch();
int count=Integer.valueOf(Dispatch.call(items,"Count").toString());
if(count>0 && nvoice<=count) {
Dispatch item=Dispatch.call(items,"Item",new Variant(voice)).toDispatch();
if (item !=null) {
Dispatch.put(voice,"Voice",item);
}
}
}catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
/**
* Java Music 改变音频输出设备
* @Title: set_voice_library
* @Description: 改变音频输出设备
* @param audio 音频设备序号
* @date 2019年10月25日 下午12:28:41
*/
public void set_voice_audio(int audio) {
if(this.naudio != audio) {
this.naudio=audio;
} try {
Dispatch items=Dispatch.call(voice,"GetAudioOutputs").toDispatch();
int count=Integer.valueOf(Dispatch.call(items,"Count").toString());
if(count > 0 && audio <= count) {
Dispatch item=Dispatch.call(items,"Item",new Variant(this.naudio)).toDispatch();
if (item !=null) {
Dispatch.put(voice,"AudioOutput",item);
}
}
} catch(Exception e) {
throw new RuntimeException(e.getMessage());
}
}
/**
* Java Music 获取系统中所有的语音库名称
* @Title: get_system_voices
* @Description: 获取系统中所有的语音库名称
* @return 系统中所有的语音库名称
* @date 2019年10月25日 下午12:28:41
*/
public String[] get_system_voices() {
String[] result=null;
try {
Dispatch item=Dispatch.call(voice,"GetVoices").toDispatch();
int count=Integer.valueOf(Dispatch.call(item,"Count").toString());
if(count > 0) {
result=new String[count];
for(int i=0;i<count;i++) {
Dispatch items=Dispatch.call(item,"Item",new Variant(i)).toDispatch();
String voice=Dispatch.call(items,"GetDescription").toString();
result[i]=voice;
}
}
System.out.println(Arrays.toString(result));
} catch(Exception e) {
throw new RuntimeException(e.getMessage());
}
return result;
}
/**
* Java Music 获取系统中音频输出设备名称数组
* @Title: get_system_voices
* @Description: 获取系统中音频输出设备名称数组
* @return 系统中所有音频输出设备名称
* @date 2019年10月25日 下午12:28:41
*/
public String[] get_system_audio_outputs() {
String[] result=null;
try {
Dispatch audioOutputs=Dispatch.call(voice,"GetAudioOutputs").toDispatch();
int count=Integer.valueOf(Dispatch.call(audioOutputs,"Count").toString());
if(count > 0) {
result=new String[count];
for(int i=0;i<count;i++) {
Dispatch item=Dispatch.call(audioOutputs,"Item",new Variant(i)).toDispatch();
String voice=Dispatch.call(item,"GetDescription").toString();
result[i]=voice;
}
}
System.out.println(Arrays.toString(result));
} catch(Exception e) {
throw new RuntimeException(e.getMessage());
}
return result;
}
}