在线情感tts
1. 概述
随着语音合成技术的进步,一个有情感的声音,可以让车主感受有温度的语音交互。
思必驰在线情感tts已对外开放,支持的情感如下:
情感 | 芊芊(hqqiaf) | 楚楚(chuxif) |
---|---|---|
中性 | √ | √ |
开心 | √ | √ |
难过 | √ | - |
致歉 | √ | - |
惊讶 | - | - |
愤怒 | - | - |
恐惧 | - | - |
关心 | - | - |
喜爱 | - | - |
2. API说明
2.1 初始化
初始化引擎并实现 AITTSListener 回调接口,监听引擎合成和播报的状态。
AICloudTTSEngine mEngine = AICloudTTSEngine.createInstance();
mEngine.init(new AICloudTTSConfig.Builder()
.setUseStopCallback(true) //设置是否在stop之后回调 onSpeechFinish ,默认是true 回调
.setUseCache(false)
.build(),
new AIEmotionTTSListener(){
@Override
public void onInit(int status) {
Log.d(TAG, "onInit()");
if (status == AIConstant.OPT_SUCCESS) {
Log.i(Tag, "初始化成功!");
} else {
Log.i(Tag, "初始化失败!");
}
}
@Override
public void onError(String utteranceId, AIError error) {
// tip.setText("onError: "+utteranceId+","+error.toString());
Log.e(TAG, "onError: " + utteranceId + "," + error.toString());
}
@Override
public void onReady(String utteranceId) {
Log.e(TAG, "onReady: " + utteranceId);
}
@Override
public void onCompletion(String utteranceId) {
Log.e(TAG, "onCompletion: " + utteranceId);
tip.setText("播报完毕!");
}
@Override
public void onProgress(int currentTime, int totalTime, boolean isRefTextTTSFinished) {
Log.e(TAG, "onProgress: " + currentTime);
showTip("当前:" + currentTime + "ms, 总计:" + totalTime + "ms, 可信度:" + isRefTextTTSFinished);
}
@Override
public void onSynthesizeStart(String utteranceId) {
// 子线程
Log.d(TAG, "onSynthesizeStart: " + utteranceId);
}
@Override
public void onSynthesizeDataArrived(String utteranceId, byte[] audioData) {
// 子线程
// mp3 音频数据,audioData.length 为 0 说明合成结束
Log.d(TAG, "onSynthesizeDataArrived: " + utteranceId + " " + audioData.length);
}
@Override
public void onSynthesizeFinish(String utteranceId) {
// 子线程
Log.d(TAG, "onSynthesizeFinish: " + utteranceId);
tip.post(new Runnable() {
@Override
public void run() {
tip.setText("合成完成");
}
});
}
@Override
public void onEmotion(String emotion) {
Log.d(TAG, "onEmotion() called with: emotion = [" + emotion + "]");
}
});
输入 | 输出 |
---|---|
AICloudTTSConfig | 初始化、合成、播放状态 |
AITTSListener | 音频数据、播放音频 |
2.2 开始合成
构建引擎启动参数,并调用合成方法:
AICloudTTSIntent cloudTTSIntent = new AICloudTTSIntent();
cloudTTSIntent.setTextType("text");
cloudTTSIntent.setServer("https://tts.dui.ai/facade/runtime/v3/synthesize");//访问云端合成服务器地址,默认为该地址
cloudTTSIntent.setRealBack(true);//设置是否实时反馈,默认为实时反馈为true
cloudTTSIntent.setSpeed(1.0f);//设置语速
cloudTTSIntent.setAudioType(AIConstant.TTS_AUDIO_TYPE_MP3);//设置合成音频类型,默认为mp3
cloudTTSIntent.setMp3Quality(AIConstant.TTS_MP3_QUALITY_HIGH);//设置云端合成mp3码率,支持low和high,默认为low
cloudTTSIntent.setSampleRate(24000);
cloudTTSIntent.setEmotion("default") //中性:default 难过:sad 开心:happy 致歉:sorry
cloudTTSIntent.setSpeaker("hqqiaf");
mEngine.synthesize(content.getText().toString(), "1025",cloudTTSIntent);
输入 | 输出 |
---|---|
text | - |
utteranceId | - |
AICloudTTSIntent | 见初始化回调合成的音频数据 |
更多启动参数如下:
方法名 | 取值 | 说明 | 默认值 |
---|---|---|---|
setServer | url | 设置请求地址,情感必须:https://tts.dui.ai/facade/runtime/v3/synthesize | DEFAULT_CLOUD_TTS_SERVER |
setSampleRate(int sampleRate) | 16000、24000 | 设置采样率,情感必须24000 | 16000 |
setMp3Quality(String mp3Quality) | low、high | 设置音频质量,情感必须为high | low |
setAudioType(String audioType) | mp3、wav、pcm、wav.alaw、opus | 音频格式 | mp3 |
setEmotion(String emotion) | default、happy、sorry、sad | 指定情感合成 | 为空,不启用情感,普通tts合成 |
setSpeed(float speed) | (0.5,2] | 设置语速(0.5表示语速快,2.0表示语速慢) | 1 |
setPitchChange(String pitchChange) | (-60,60] | 设置语调 | 0 |
setVolume(int volume) | (1,100] | 设置音量(1表示音量小,100表示音量大) | 50 |
setSpeaker(String speaker) | 请参考发音人列表 | 设置发音人 | zhilingf |
setSaveAudioPath(String saveAudioPath) | 音频路径 | 保存音频 | 不设置默认不保存 |
setRealBack(boolean realBack) | true、false | 设置是否实时反馈 | true |
2.3 开始播放
调用speak方法合成并播放,需要指定音频通道(其他参数同合成):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
cloudTTSIntent.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
} else {
cloudTTSIntent.setStreamType(AudioManager.STREAM_MUSIC);//设置合成音播放的音频流,默认为音乐流
}
mEngine.speak(content.getText().toString(), "1025",cloudTTSIntent);
开发者需要区分speak与synthesize接口的区别:
synthesize,仅合成接口
speak,合成后,内部会创建播放器播放合成音频数据
2.4 停止合成
mEngine.stop()
2.5 暂停播放
mEngine.pause();
2.6 恢复播放
mEngine.resume();
2.7 销毁引擎
mEngine.release();