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");
}
}