Java jacob 文字轉語音

1 下載 jacob

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

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章