Java jacob 文字转语音
1 下载 jacob
下载 jacob
2 解压 jacob
复制
Windows 64 位 选择 jacob-1.19-x64.dll
Windows 32 位 选择 jacob-1.19-x86.dll
到 JDK 的 bin 目录下面
复制 jacob.jar 到自己的项目中
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 ovoice = null;
private Dispatch voice_stream_file = null;// 音频文件输出流对象,在读取或保存音频文件时使用
private Dispatch voice_stream_type = null;// 音频格式对象
private int format_type=39;// 音频的输出格式,默认为:SAFT22kHz16BitMono
private int volume = 100;// 声音:1到100
private int rate = 0;// 频率:-10到10
private int voice = 0;// 语音库序号
private int audio = 0;// 输出设备序号
public Music() {
ComThread.InitSTA();
component = new ActiveXComponent("Sapi.SpVoice");
ovoice = component.getObject();
}
/**
* 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月25日12:10:41
*/
public void set_voice_format_type(int type) {
this.format_type=type;
}
/**
* Java Music 文字转 wav
* @Title: text_to_wav
* @Description: 文字转 wav
* @param str 文字
* @date 2019年10月25日 下午12:28:41
*/
public void text_to_wav(String str,String wpath) {
//1 创建输出文件流对象
component = new ActiveXComponent("Sapi.SpFileStream");
voice_stream_file = component.getObject();
//2 创建音频流格式对象
if(voice_stream_type==null) {
component = new ActiveXComponent("Sapi.SpAudioFormat");
voice_stream_type = component.getObject();
}
//3 设置音频流格式类型
Dispatch.put(voice_stream_type,"Type",new Variant(this.format_type));
//4 设置文件输出流的格式
Dispatch.putRef(voice_stream_file,"Format",voice_stream_type);
//5 调用输出文件流对象的打开方法,创建一个.wav文件
Dispatch.call(voice_stream_file,"Open",new Variant(wpath),new Variant(3),new Variant(true));
//6 设置声音对象的音频输出流为输出文件流对象
Dispatch.putRef(ovoice,"AudioOutputStream",voice_stream_file);
//7 调整音量和读的速度
Dispatch.put(ovoice,"Volume",new Variant(this.volume));// 设置音量
Dispatch.put(ovoice,"Rate",new Variant(this.rate));// 设置速率
//8 开始朗读文本文件中的文字
Dispatch.call(ovoice,"Speak",new Variant(str));
//9 关闭输出文件流对象,释放资源
Dispatch.call(voice_stream_file,"Close");
voice_stream_file.safeRelease();
voice_stream_type.safeRelease();
component.safeRelease();
ovoice.safeRelease();
}
/**
* Java Music 播放文字转音频
* @Title: text_to_voice
* @Description: 播放文字转音频
* @param str 文字
* @date 2019年10月25日 下午12:28:41
*/
public void text_to_voice(String str,String wpath) {
//1 创建输出文件流对象
component = new ActiveXComponent("Sapi.SpFileStream");
voice_stream_file = component.getObject();
//2 创建音频流格式对象
if(voice_stream_type==null) {
component = new ActiveXComponent("Sapi.SpAudioFormat");
voice_stream_type = component.getObject();
}
//3 设置音频流格式类型
Dispatch.put(voice_stream_type,"Type",new Variant(this.format_type));
//4 设置文件输出流的格式
Dispatch.putRef(voice_stream_file,"Format",voice_stream_type);
//5 调用输出文件流对象的打开方法,创建一个.wav文件
Dispatch.call(voice_stream_file,"Open",new Variant(wpath),new Variant(3),new Variant(true));
//6 设置声音对象的音频输出流为输出文件流对象
Dispatch.putRef(ovoice,"AudioOutputStream",voice_stream_file);
//7 调整音量和读的速度
Dispatch.put(ovoice,"Volume",new Variant(this.volume));// 设置音量
Dispatch.put(ovoice,"Rate",new Variant(this.rate));// 设置速率
//8 开始朗读文本文件中的文字
Dispatch.call(ovoice,"Speak",new Variant(str));
//9 关闭输出文件流对象,释放资源
Dispatch.call(voice_stream_file,"Close");
voice_stream_file.safeRelease();
voice_stream_type.safeRelease();
component.safeRelease();
ovoice.safeRelease();
}
/**
* Java Music 播放 WAV
* @Title: play_wav
* @Description: 播放 PCM
* @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 voice) {
if(this.voice != voice) {
this.voice=voice;
} try {
Dispatch items = Dispatch.call(ovoice,"GetVoices").toDispatch();
int count=Integer.valueOf(Dispatch.call(items,"Count").toString());
if(count>0 && voice<=count) {
Dispatch item=Dispatch.call(items,"Item",new Variant(voice)).toDispatch();
if (item !=null) {
Dispatch.put(ovoice,"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.audio != audio) {
this.audio=audio;
} try {
Dispatch items=Dispatch.call(ovoice,"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.audio)).toDispatch();
if (item !=null) {
Dispatch.put(ovoice,"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(ovoice,"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(ovoice,"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;
}
public static void main(String[] args) {
Music music = new Music();
music.get_system_voices();
music.text_to_voice("将文字转换成音频信号","C:\\Users\\Administrator\\Desktop\\TEST.wav");
}
}