在线语音合成 Java SDK 文档

1、简介

与语音听写相反,语音合成是将一段文字转换为语音,可根据需要合成出不同音色、语速和语调的声音,让机器像人一样开口说话。

语音合成详细的接口介绍及说明请参考: MSC Java API 文档, 在集成过程中如有疑问,可登录讯飞开放平台论坛,查找答案或与其他开发者交流。

*** 小语种及少数民族方言 ***:暂不支持,敬请期待!

2、SDK集成指南

2.1 Demo运行步骤

1.在控制台下载对应sdk(如何下载见下方常见问题)。

2.配置JDK环境 编者采用的版本是jdk1.8,读者可以从 Sun官网 下载所需的版本;

3.安装Eclipse Java IDE 编者采用的版本是Ecilpse Java IDE,读者可以到eclipse官网下载所需的版本;

4.直接打开File-->import Projects--->选择已下载java sdk内的sample/MscDemo。

5.直接运行Mainview即可,其中TtsSpeechView为在线语音合成能力代码示例。

2.1.1 创建账号&应用

进入讯飞开放平台主页https://www.ai-nanchang.cn/或者对应的产品页,点击右上角登陆或者注册按钮,完成登陆操作。

进入控制台“我的应用”列表页,点击左上角“创建新应用”,并填写相关应用信息,未认证用户只允许创建1个应用;个人实名认证用户可创建5个应用,企业实名认证用户可创建20个应用,若创建更多应用用户可选择企业实名认证。

2.1.2 开通&购买服务

创建完应用之后,在当前应用选择“在线语音合成”,然后在控制台点击购买服务量,跳转至官网产品价格页可领取免费交互量或者购买套餐交互量,发音人可在下方授权管理一栏点击购买和试用。

2.1.3 获取APPid和secret_key以及SDK下载

购买完成后,在“控制台”的对应的应用上,进入在线语音合成一栏,选择Java sdk下载。若为WEBAPI,可以直接点开技术文档查看接口文档,另外在服务的产品页“在线语音合成”服务管理中,可以查看密钥,请牢记WEBAPI唯一标识appid和合成服务访问秘钥secret_key和apikey!

2.1.4 demo运行方式

对于Java版SDK,通过如下配置,可以将SDK中的内容导入至工程。下载开发包组件完成后,将开发包组件中的jar文件放置于“<工程路径>/lib”中。进入Eclipse,在选项栏中进入Project -> Properties,在左边选择“Java Build Path”,右边的tab中选择“Libraries”,可见如下界面:移除报错的旧版jar包,点击右边的“Add JARs”,并将刚刚添加到工程里的开发包组件添加,点击“OK”,即完成了开发包组件的添加,之后需配置好config.properties文件,项目无报错即可运行转写服务demo。

2.2 项目集成步骤

2.2.1 SDK包说明

《SDK目录结构一览》

  • bin:

    • 相关类文件
  • lib:

    • msc相关jar包
  • msc:

    • 日志存放文件夹
  • res:

    • UI图片存放文件夹
  • src:

    • TtsSpeechView.java(语音听写示例代码)
  • libmsc32库文件

  • libmsc64库文件

  • msc32.dll

  • msc64.dll

2.2.2 SDK导入

  1. 在Eclipse中建立你的Java工程。

  2. 将开发工具包中lib目录下的Msc.jar复制到新建工程的lib目录中(如下图所示)。

  3. 在Eclipse中选中工程,通过工具栏Project->Properties->Java Build Path->Libraries->Add JARS或ADD External JARS引入Msc.jar(如下图所示)。

  1. 将SDK.\lib目录下库文件拷贝到工程根目录(如下图所示)。

  1. 在你需要使用MSC服务的文件中导入相应的类,如。

    import com.iflytek.cloud.speech.SpeechSynthesizer;;
    
    

2.2.3 初始化

创建用户语音配置对象后才可以使用语音服务,建议在程序入口处调用。

关于初始化时指定库名,或报加载库失败的解决办法,请参考《MSC Reference Manual》中,关于SpeechUtility类,以及SpeechConstant类的说明。

// 将“XXXXXXXX”替换成您申请的APPID
SpeechUtility.createUtility( SpeechConstant.APPID +"=XXXXXXXX ");

2.3 参数与说明

2.3.1 合成播放

public void actionPerformed(ActionEvent e) {
		
		DebugLog.Log( "actionPerformed enter" );
		
		if (e.getSource() == jbtnPlay) {
			setting();
			// 合成文本为TEXT_CONTENT的句子,设置监听器为mSynListener
			mText = resultArea.getText().trim();
			mTts.startSpeaking( mText, mSynListener );
		} else if (e.getSource() == jbtnCancel) {
			mTts.stopSpeaking();
		} else if (e.getSource() == jbtnPause) {
			DebugLog.Log( "click pause." );
			mTts.pauseSpeaking();
		} else if (e.getSource() == jbtnResume) {
			mTts.resumeSpeaking();
		} else if (e.getSource() == jbtnHome) {
			if (null != mTts) {
				mTts.stopSpeaking();
				mTts.destroy();
			}

			JFrame frame = MainView.getFrame();
			frame.getContentPane().remove(this);
			JPanel panel = ((MainView) frame).getMainJpanel();
			frame.getContentPane().add(panel);
			frame.getContentPane().validate();
			frame.getContentPane().repaint();
		}else if( jbtnSet.equals(e.getSource()) ){
			DebugLog.Log( "actionPerformed setting" );
			mSettingMenu.show( this, this.jbtnSet.getX(), this.jbtnSet.getY()+50 );
		}
		
		DebugLog.Log( "actionPerformed leave" );
	}

	private SynthesizerListener mSynListener = new SynthesizerListener() {

		@Override
		public void onSpeakBegin() {
		}

		@Override
		public void onBufferProgress(int progress, int beginPos, int endPos,
				String info) {
			DebugLog.Log("--onBufferProgress--progress:" + progress
					+ ",beginPos:" + beginPos + ",endPos:" + endPos);
		}

		@Override
		public void onSpeakPaused() {

		}

		@Override
		public void onSpeakResumed() {

		}

		@Override
		public void onSpeakProgress(int progress, int beginPos, int endPos) {
			DebugLog.Log("onSpeakProgress enter progress:" + progress
					+ ",beginPos:" + beginPos + ",endPos:" + endPos);

			updateText( mText.substring( beginPos, endPos+1 ) );
			
			DebugLog.Log( "onSpeakProgress leave" );
		}

		@Override
		public void onCompleted(SpeechError error) {
			DebugLog.Log( "onCompleted enter" );
			
			String text = mText;
			if (null != error){
				DebugLog.Log("onCompleted Code:" + error.getErrorCode());
				text = error.getErrorDescription(true);
			}
			
			updateText( text );
			
			DebugLog.Log( "onCompleted leave" );
		}

2.3.2 合成到文件

		//保存音频文件
		{
			Map<String, String> saveMap = new LinkedHashMap<String ,String>();
			saveMap.put( "1", "开" );
			saveMap.put( "0", "关" );
			
			this.addRadioMenu( "保存音频", SpeechConstant.TTS_AUDIO_PATH, saveMap, DefaultValue.SAVE, this.mRadioItemListener );
		}
		
	}

2.3.3 代理服务器设置方法

在createUtility接口的params参数中添加:

net_type=custom, proxy_ip=<host>, proxy_port=<port>
其中,<host>,<port>替换为实际的代理服务器地址和端口。

例如:SpeechUtility.createUtility(SpeechConstant.APPID + “=12345678” + “,” + “net_type=custom, proxy_ip=192.168.1.2, proxy_port=8080”); 注意:各参数间,以英文逗号分隔。

接口原型: public static SpeechUtility createUtility(java.lang.String params)

注意: 若在设置代理参数后,使用语音服务过程中,报错10204/10205/10212等网络异常错误时,请查阅以下内容,做出相关操作:

  • 讯飞语音SDK的通信协议使用的是标准HTTP1.1协议,其代理协议使用的是标准HTTP代理协议。
  • 代理服务器需要支持全双工多问多答方式,即 pipeline 模式。
  • 代理服务器不能对80端口做限制,不能对如下域名做拦截: hdns.openspeech.cn scs.openspeech.cn open.xf-yun.com dev.voicecloud.cn
  • 需要确保代理服务器只负责转发数据包,不能改变数据包的完整性和时序性。
  • 代理服务器在转发数据包时,不能在HTTP协议头部添加 IE6 标识头。

2.3.4 常用参数说明

参数 名称 说明
voice_name 合成发音人 合成所需发音人,对应发音人参数可在控制台"发音人授权管理"查看。
speed 语速 通过此参数,设置合成返回音频的语速。默认值:50,取值范围:[0,100]。
volume 音量 通过此参数,设置合成返回音频的音量。默认值:50,取值范围:[0,100]。
pitch 语调 通过此参数,设置合成返回音频的语调。默认值:50,取值范围:[0,100]。
sample_rate 采样率 音频的采样率是音频属性的其中一个,一般来说,采样率越高音频的质量越好,识别的匹配率越高,但上传带宽消耗也越大。 默认:16KHZ,取值{8KHZ,16KHZ}。
tts_audio_path 合成录音保存路径 通过此参数,可以在合成完成后在本地保存一个音频文件 。
engine_type 引擎类型 设置使用的引擎类型:在线、离线、混合。在线合成设置参数为:"cloud" 。

备注:以上均为SDK常用参数说明,更多详细参数请参考:MSC Java API 文档.

2.3.5 视频教程

概念原理

技术简介

发展历史

典型应用

3、常见问题

SDK是否支持并发操作?

答:SDK暂时不支持并发操作。

SDK是否支持本地语音能力?

答:Java平台暂时不支持本地能力。

Java sdk能否直接使用音频文件进行听写或识别?

答:可以。Sdk进行听写或识别的音频输入方式有两种,一种为通过实时录音方式,另一种为音频文件流写入方式;
音频流文件写入方式使用sdk的writeAudio接口,具体使用方法的代码示例详见SDK中MscInvisibleDemo示例demo。

Java sdk合成功能否可以只生成合成的音频而不播放声音吗?

答:可以,Java sdk 1014版本中新的API接口synthesizeToUri(无声合成)正为该功能而生的,具体使用方法的代码示例详见SDK中MscInvisibleDemo示例demo

如何设置语音云服务URL?

答:在createUtility接口中添加:server_url = http://YourDomainName/msp.do (YourDomainName是指语音云服务域名,请开发者自行替换) 例如:SpeechUtility.createUtility(SpeechConstant.APPID + "=12345678" + "," + "server_url = http://sdk.openspeech.cn/msp.do"); 注意:各参数间,以英文逗号分隔。 接口原型: public static SpeechUtility createUtility(java.lang.String params)

更多问题,请见论坛帖子:

SDK常见问题:Java SDK 常见问题解答