Java使用Jacob调用SAPI合成语音

本文介绍了如何在Java中利用Jacob库调用SAPI进行语音合成。首先,详细说明了配置Jacob库的过程,包括将jar文件放入项目lib目录以及根据JDK位数选择合适的dll文件放入JRE的BIN目录。接着,提供了相关的代码示例来展示如何实现语音合成功能。此外,还提及了将wav文件转换为pcm格式的步骤,使用的工具是sound.jar,并给出了下载这些依赖包的链接。
摘要由CSDN通过智能技术生成


Java使用Jacob调用SAPI合成语音:
1.配置Jacob:我这里使用的jacob为jacob-1.18-M2,jacob-1.18-M2下载下来之后,解压缩文件,
里面的文件为docs、jacob.jar、jacob-1.18-M2-x64.dll、jacob-1.18-M2-x86.dll、LICENSE.TXT、README.txt;
把jacob.jar复制到项目的lib目录下面,jacob-1.18-M2-x64.dll和jacob-1.18-M2-x86.dll是两个动态库文件,
它们指JDK的安装版本,如果JDK是64位的,那么需要把jacob-1.18-M2-x64.dll复制到JRE BIN目录下面,因为
我装的JDK是32位的,所以我把jacob-1.18-M2-x86.dll复制到JRE BIN目录下面,
我的JRE路径为G:\Program Files (x86)\Java\jre7\bin。
2.代码如下

package com.jacob;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

/**
 * 调用MSTTS将字符串转换成语音信息
 * 调用windows speech API(SAPI)
 * @author suyunlong
 *
 */
public class MSTTSSpeech
{
	private int volume=100;// 声音:1到100
	private int rate=0;// 频率:-10到10
	private int voice=0;// 语音库序号
	private int audio=0;// 输出设备序号
	private ActiveXComponent ax=null;
	private Dispatch spVoice=null;// 声音对象
	private Dispatch spFileStream=null;// 音频文件输出流对象,在读取或保存音频文件时使用
	private Dispatch spAudioFormat=null;// 音频格式对象
	private Dispatch spMMAudioOut=null;// 音频输出对象
	private int formatType=22;// 音频的输出格式,默认为:SAFT22kHz16BitMono
	public MSTTSSpeech() 
	{
		ComThread.InitSTA();
		if(ax==null)
		{
			ax=new ActiveXComponent("Sapi.SpVoice");
			spVoice=ax.getObject();
		}
	}
	/**
	 * 改变语音库
	 * @param voice 语音库序号
	 */
	public void changeVoice(int voice)
	{
		if(this.voice != voice)
		{
			this.voice=voice;
		}
		try
		{
			Dispatch voiceItems=Dispatch.call(spVoice,"GetVoices").toDispatch();
			int count=Integer.valueOf(Dispatch.call(voiceItems,"Count").toString());
			if(count>0)
			{
				Dispatch voiceItem=Dispatch.call(voiceItems,"Item",new Variant(this.voice)).toDispatch();
				Dispatch.put(spVoice,"Voice",voiceItem);
			}
		}
		catch(Exception e)
		{
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
	}
	/**
	 * 改变音频输出设备
	 * @param audio 音频设备序号
	 */
	public void changeAudioOutput(int audio)
	{
		if(this.audio != audio)
		{
			this.audio=audio;
		}
		try
		{
			Dispatch audioOutputs=Dispatch.call(spVoice,"GetAudioOutputs").toDispatch();
			int count=Integer.valueOf(Dispatch.call(audioOutputs,"Count").toString());
			if(count > 0)
			{
				Dispatch audioOutput=Dispatch.call(audioOutputs,"Item",new Variant(this.audio)).toDispatch();
				Dispatch.put(spVoice,"AudioOutput",audioOutput);
			}
		}
		catch(Exception e)
		{
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
	}
	/**
	 * 播放语音 
	 * @param text 要转换成语音的文本
	 */
	public void speak(String text)
	{
		this.speak(text,0);
	}
	/**
	 * 停止播
  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值