Java jacob 文字转语音

1 篇文章 0 订阅

1 下载 jacob

下载 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;
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值