TTSManager.java
3.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package com.ys.yslibrary;
import android.text.TextUtils;
import android.util.Log;
import com.iflytek.aiui.AIUIConstant;
import com.iflytek.aiui.AIUIMessage;
import com.ys.yslibrary.aiui.AIUIWrapper;
/**
* TTS管理
* <p>
* TTS使用语义后合成和主动语音合成结合(二者的介绍可以参见接入文档中语音合成一节的介绍)
* <p>
* 主动语义合成主要使用在一些需要本地构造合成内容的情况,比如和本地播放列表相关的上一首,下一首,当前播放的歌曲名等操作
* 需要结合播放列表的当前播放项构造最终的合成内容。
* <p>
* 因为语义后合成的音频是云端根据语义的answer结果生成的,所以判断是否需要本地合成的条件是 最终处理结果的合成内容和下发
* 的语义结果的answer的值是否相同。如果不同,则需要调用主动语音合成,如果相同则直接播放和语义结果一同下发的语义后合成结果。
*/
public class TTSManager {
private boolean mTTSEnable = false;
//TTS结束回调
private Runnable mTTSCallback;
private final String TAG = getClass().getName();
/**
* 开始合成
*
* @param text 合成文本
* @param onComplete 合成完成回调
*/
public void startTTS(String text, Runnable onComplete, boolean resume) {
if (!resume) {
sendMessage(new AIUIMessage(AIUIConstant.CMD_TTS, AIUIConstant.PAUSE, 0, null, null));
Log.d("start tts %s", text);
} else {
Log.d("resume tts %s", text);
}
if (!mTTSEnable || TextUtils.isEmpty(text)) {
if (onComplete != null) {
onComplete.run();
}
return;
}
mTTSCallback = onComplete;
if (!resume) {
Log.d("start TTS %s", text);
String tag = "@" + System.currentTimeMillis();
StringBuffer params = new StringBuffer(); //构建合成参数
params.append("vcn=x2_xiaojuan"); //合成发音人
params.append(",speed=50"); //合成速度
params.append(",pitch=50"); //合成音调
params.append(",volume=50"); //合成音量
params.append(",ent=x_tts"); //合成音量
params.append(",tag=" + tag); //合成tag,方便追踪合成结束,暂未实现
AIUIMessage startTts = new AIUIMessage(AIUIConstant.CMD_TTS, AIUIConstant.START, 0,
params.toString(), text.getBytes());
sendMessage(startTts);
}
}
/**
* 暂停合成
*/
public void pauseTTS() {
Log.d(TAG, "Pause TTS");
sendMessage(new AIUIMessage(AIUIConstant.CMD_TTS, AIUIConstant.PAUSE, 0, null, null));
}
/**
* 停止合成播放
*/
public void stopTTS() {
Log.d(TAG, "Stop TTS");
sendMessage(new AIUIMessage(AIUIConstant.CMD_TTS, AIUIConstant.CANCEL, 0, "", null));
}
private void sendMessage(AIUIMessage message) {
AIUIWrapper.getInstance().sendMessage(message);
}
}