与语音听写相反,语音合成是将一段文字转换为语音,可根据需要合成出不同音色、语速和语调的声音,让机器像人一样开口说话。
语音合成详细的接口介绍及说明请参考: MSC Java API 文档, 在集成过程中如有疑问,可登录讯飞开放平台论坛,查找答案或与其他开发者交流。
*** 小语种及少数民族方言 ***:暂不支持,敬请期待!
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为在线语音合成能力代码示例。
进入讯飞开放平台主页https://www.ai-tj.cn/或者对应的产品页,点击右上角登陆或者注册按钮,完成登陆操作。
进入控制台“我的应用”列表页,点击左上角“创建新应用”,并填写相关应用信息,未认证用户只允许创建1个应用;个人实名认证用户可创建5个应用,企业实名认证用户可创建20个应用,若创建更多应用用户可选择企业实名认证。
创建完应用之后,在当前应用选择“在线语音合成”,然后在控制台点击购买服务量,跳转至官网产品价格页可领取免费交互量或者购买套餐交互量,发音人可在下方授权管理一栏点击购买和试用。
购买完成后,在“控制台”的对应的应用上,进入在线语音合成一栏,选择Java sdk下载。若为WEBAPI,可以直接点开技术文档查看接口文档,另外在服务的产品页“在线语音合成”服务管理中,可以查看密钥,请牢记WEBAPI唯一标识appid和合成服务访问秘钥secret_key和apikey!
对于Java版SDK,通过如下配置,可以将SDK中的内容导入至工程。下载开发包组件完成后,将开发包组件中的jar文件放置于“<工程路径>/lib”中。进入Eclipse,在选项栏中进入Project -> Properties,在左边选择“Java Build Path”,右边的tab中选择“Libraries”,可见如下界面:移除报错的旧版jar包,点击右边的“Add JARs”,并将刚刚添加到工程里的开发包组件添加,点击“OK”,即完成了开发包组件的添加,之后需配置好config.properties文件,项目无报错即可运行转写服务demo。
《SDK目录结构一览》
bin:
lib:
msc:
res:
src:
libmsc32库文件
libmsc64库文件
msc32.dll
msc64.dll
在Eclipse中建立你的Java工程。
将开发工具包中lib目录下的Msc.jar复制到新建工程的lib目录中(如下图所示)。
在Eclipse中选中工程,通过工具栏Project->Properties->Java Build Path->Libraries->Add JARS或ADD External JARS引入Msc.jar(如下图所示)。
在你需要使用MSC服务的文件中导入相应的类,如。
import com.iflytek.cloud.speech.SpeechSynthesizer;;
创建用户语音配置对象后才可以使用语音服务,建议在程序入口处调用。
关于初始化时指定库名,或报加载库失败的解决办法,请参考《MSC Reference Manual》中,关于SpeechUtility类,以及SpeechConstant类的说明。
// 将“XXXXXXXX”替换成您申请的APPID
SpeechUtility.createUtility( SpeechConstant.APPID +"=XXXXXXXX ");
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" );
}
//保存音频文件
{
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 );
}
}
在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 标识头。
参数 | 名称 | 说明 |
---|---|---|
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 文档.
答:SDK暂时不支持并发操作。
答:Java平台暂时不支持本地能力。
答:可以。Sdk进行听写或识别的音频输入方式有两种,一种为通过实时录音方式,另一种为音频文件流写入方式;
音频流文件写入方式使用sdk的writeAudio接口,具体使用方法的代码示例详见SDK中MscInvisibleDemo示例demo。
答:可以,Java sdk 1014版本中新的API接口synthesizeToUri(无声合成)正为该功能而生的,具体使用方法的代码示例详见SDK中MscInvisibleDemo示例demo
答:在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 常见问题解答