Commit d1a8d11719d66d4c5f1c4dba9e88b62f222535c0

Authored by YangShuai
1 parent ed3b99c2

1 修改语音解析结果逻辑

gradle/wrapper/gradle-wrapper.jar 0 → 100644
No preview for this file type
gradle/wrapper/gradle-wrapper.properties 0 → 100644
  1 +#Mon Apr 12 13:40:02 CST 2021
  2 +distributionBase=GRADLE_USER_HOME
  3 +distributionPath=wrapper/dists
  4 +zipStoreBase=GRADLE_USER_HOME
  5 +zipStorePath=wrapper/dists
  6 +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
... ...
smartAssistant/src/main/java/com/ys/yslibrary/bean/Answer.java
... ... @@ -4,9 +4,20 @@ package com.ys.yslibrary.bean;
4 4 * 技能处理返回结果,包含展示内容,合成内容和回调
5 5 */
6 6 public class Answer {
  7 + public static final int TYPE_WEATHER = 1001;
  8 + public static final int TYPE_UNKNOWN = 1002;
7 9 private String mAnswer;
8 10 private String mTTSContent;
9 11 private Runnable mAnswerCallback;
  12 + private int answerType;
  13 +
  14 + public int getAnswerType() {
  15 + return answerType;
  16 + }
  17 +
  18 + public void setAnswerType(int answerType) {
  19 + this.answerType = answerType;
  20 + }
10 21  
11 22 public Answer(String answer, String ttsContent, Runnable answerCallback) {
12 23 mAnswer = answer;
... ... @@ -31,7 +42,9 @@ public class Answer {
31 42 return mAnswer;
32 43 }
33 44  
34   - public String getTTSContent() { return mTTSContent; }
  45 + public String getTTSContent() {
  46 + return mTTSContent;
  47 + }
35 48  
36 49 public Runnable getAnswerCallback() {
37 50 return mAnswerCallback;
... ...
smartAssistant/src/main/java/com/ys/yslibrary/bean/ChatMessageHandler.java
1 1 package com.ys.yslibrary.bean;
2 2  
3 3 import android.text.TextUtils;
  4 +import android.util.Log;
4 5  
5 6 import com.ys.yslibrary.bean.player.PlayerHandler;
6 7  
... ... @@ -30,6 +31,9 @@ public class ChatMessageHandler {
30 31 static {
31 32 // handlerMap.put("telephone", TelephoneHandler.class);
32 33 handlerMap.put("weather", WeatherHandler.class);
  34 + handlerMap.put(MsgConstant.TYPE_UNKNOWN, UnknownHandler.class);
  35 + //历史上的今天
  36 + handlerMap.put("LEIQIAO.historyToday", UnknownHandler.class);
33 37 // handlerMap.put("cookbook", CookBookHandler.class);
34 38 // handlerMap.put("stock", StockHandler.class);
35 39 // handlerMap.put("mapU", MapHandler.class);
... ... @@ -62,15 +66,19 @@ public class ChatMessageHandler {
62 66 private SemanticResult mSemanticResult;
63 67 private IntentHandler mHandler;
64 68  
  69 + public void reset(){
  70 + mSemanticResult=null;
  71 + }
65 72  
66   - public String getFormatMessage(RawMessage message) {
  73 + public Answer getFormatMessage(RawMessage message) {
67 74 this.mMessage = message;
68 75 if (mMessage.fromType == RawMessage.FromType.USER) {
69 76 //用户消息
70 77 if (mMessage.msgType == RawMessage.MsgType.TEXT) {
71   - return new String(mMessage.msgData);
  78 +// return new String(mMessage.msgData);
  79 + return new Answer(new String(mMessage.msgData));
72 80 } else {
73   - return "";
  81 + return null;
74 82 }
75 83 } else {
76 84 initHandler();
... ... @@ -89,9 +97,9 @@ public class ChatMessageHandler {
89 97 if (!TextUtils.isEmpty(answer.getTTSContent())) {
90 98 latestTTSAnswer = answer;
91 99 }
92   - return answer.getAnswer();
  100 + return answer;
93 101 } else {
94   - return "错误";
  102 + return null;
95 103 }
96 104 }
97 105 }
... ... @@ -108,7 +116,7 @@ public class ChatMessageHandler {
108 116 //根据语义结果的service查找对应的IntentHandler,并实例化
109 117 Class handlerClass = handlerMap.get(mSemanticResult.service);
110 118 if (handlerClass == null) {
111   - handlerClass = PlayerHandler.class;
  119 + handlerClass = UnknownHandler.class;
112 120 }
113 121 try {
114 122 Constructor constructor = handlerClass.getConstructor();
... ... @@ -134,7 +142,7 @@ public class ChatMessageHandler {
134 142 semanticResult = new JSONObject(new String(mMessage.msgData));
135 143 mSemanticResult.rc = semanticResult.optInt("rc");
136 144 if (mSemanticResult.rc == 4) {
137   -// mSemanticResult.service = Constant.SERVICE_UNKNOWN;
  145 + mSemanticResult.service = MsgConstant.TYPE_UNKNOWN;
138 146 } else if (mSemanticResult.rc == 1) {
139 147 mSemanticResult.service = semanticResult.optString("service");
140 148 mSemanticResult.answer = "语义错误";
... ... @@ -177,7 +185,7 @@ public class ChatMessageHandler {
177 185 }
178 186 } catch (JSONException e) {
179 187 mSemanticResult.rc = 4;
180   -// mSemanticResult.service = Constant.SERVICE_UNKNOWN;
  188 + mSemanticResult.service = MsgConstant.TYPE_UNKNOWN;
181 189 }
182 190 }
183 191 }
... ...
smartAssistant/src/main/java/com/ys/yslibrary/bean/MsgConstant.java 0 → 100644
  1 +package com.ys.yslibrary.bean;
  2 +
  3 +public class MsgConstant {
  4 + public static final String TYPE_UNKNOWN="unknown";
  5 +}
... ...
smartAssistant/src/main/java/com/ys/yslibrary/bean/UnknownHandler.java 0 → 100644
  1 +package com.ys.yslibrary.bean;
  2 +
  3 +import org.json.JSONArray;
  4 +import org.json.JSONObject;
  5 +
  6 +public class UnknownHandler extends IntentHandler {
  7 + @Override
  8 + public Answer getFormatContent(SemanticResult result) {
  9 + Answer answer = new Answer(result.answer);
  10 + answer.setAnswerType(Answer.TYPE_UNKNOWN);
  11 + return answer;
  12 + }
  13 +}
... ...
smartAssistant/src/main/java/com/ys/yslibrary/bean/WeatherHandler.java
... ... @@ -14,25 +14,30 @@ public class WeatherHandler extends IntentHandler {
14 14  
15 15 @Override
16 16 public Answer getFormatContent(SemanticResult result) {
  17 + Answer answer = null;
17 18 if (notified) {
18   - return new Answer(result.answer);
  19 + answer = new Answer(result.answer);
  20 + answer.setAnswerType(Answer.TYPE_WEATHER);
  21 + return answer;
19 22 } else {
20   - StringBuilder answer = new StringBuilder(result.answer);
  23 + StringBuilder builder = new StringBuilder(result.answer);
21 24 JSONArray slots = result.semantic.optJSONArray("slots");
22 25 for (int index = 0; index < slots.length(); index++) {
23 26 JSONObject item = slots.optJSONObject(index);
24   - if (item.optString("name").contains("location")) {
  27 + if (item != null && item.optString("name") != null && item.optString("name").contains("location")) {
25 28 // 问法意图中不包含具体的城市名,提示可使用定位让城市信息更准确
26 29 if (item.optString("value").contains("CURRENT_CITY")) {
27   - answer.append(NEWLINE);
28   - answer.append(NEWLINE);
29   - answer.append("<a href=\"use_loc\">使用定位让天气信息更准确</a>");
  30 + builder.append(NEWLINE);
  31 + builder.append(NEWLINE);
  32 + builder.append("<a href=\"use_loc\">使用定位让天气信息更准确</a>");
30 33 notified = true;
31 34 break;
32 35 }
33 36 }
34 37 }
35   - return new Answer(answer.toString(), result.answer);
  38 + answer = new Answer(result.answer, result.answer);
  39 + answer.setAnswerType(Answer.TYPE_WEATHER);
  40 + return answer;
36 41 }
37 42 }
38 43  
... ...
smartAssistant/src/main/java/com/ys/yslibrary/ui/AssistantActivity.java
1 1 package com.ys.yslibrary.ui;
2 2  
3 3  
4   -import android.app.Dialog;
5   -import android.os.Handler;
6   -import android.os.Message;
7 4 import android.util.Log;
8 5 import android.view.View;
9 6 import android.view.ViewGroup;
... ... @@ -12,11 +9,9 @@ import android.view.animation.AnimationUtils;
12 9 import android.view.animation.LayoutAnimationController;
13 10 import android.widget.HorizontalScrollView;
14 11  
15   -import androidx.annotation.NonNull;
16   -import androidx.recyclerview.widget.LinearLayoutManager;
17   -import androidx.recyclerview.widget.RecyclerView;
18 12  
19 13 import com.ys.yslibrary.aiui.AIUIWrapper;
  14 +import com.ys.yslibrary.bean.Answer;
20 15 import com.ys.yslibrary.bean.AssistantContentBean;
21 16 import com.ys.yslibrary.bean.ChatMessageHandler;
22 17 import com.ys.yslibrary.callback.OnVoiceIdentifyResultListener;
... ... @@ -27,20 +22,12 @@ import com.ys.yslibrary.ui.adapter.AssistantAdapter;
27 22 import com.ys.yslibrary.ui.custom.AssistantViewAdapter;
28 23 import com.ys.yslibrary.viewmodel.VoiceViewModel;
29 24  
30   -import java.util.ArrayList;
31   -import java.util.HashMap;
32   -import java.util.HashSet;
33   -import java.util.Hashtable;
34   -import java.util.List;
35   -import java.util.concurrent.Callable;
36   -import java.util.concurrent.ConcurrentHashMap;
37 25  
38 26 public class AssistantActivity extends BaseActivity {
39 27 private VoiceViewModel mVoiceViewModel;
40 28 private ActivityXiaojiaAssistantBinding binding;
41 29 private ChatMessageHandler messageHandler;
42   - private AssistantAdapter assistantAdapter;
43   - private List<AssistantContentBean> list;
  30 + private AssistantViewAdapter viewAdapter;
44 31  
45 32 @Override
46 33 protected int getBindingLayoutId() {
... ... @@ -55,19 +42,17 @@ public class AssistantActivity extends BaseActivity {
55 42 @Override
56 43 protected void init() {
57 44 this.binding = (ActivityXiaojiaAssistantBinding) getBaseBinding();
58   - this.list = new ArrayList<>();
59   - assistantAdapter = new AssistantAdapter(this, list);
60 45  
61 46 // binding.rv.setLayoutManager(new LinearLayoutManager(this));
62 47 // binding.rv.setAdapter(assistantAdapter);
63 48  
64 49 getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
65 50 messageHandler = new ChatMessageHandler();
66   -// AIUIWrapper.getInstance().startRecordAudio();
  51 + AIUIWrapper.getInstance().startRecordAudio();
67 52 AssistantContentBean assistantContentBean = new AssistantContentBean(AssistantContentBean.TYPE_WEATHER);
68   - assistantContentBean.setWeather("天气好");
69   - AssistantViewAdapter viewAdapter = new AssistantViewAdapter(this, assistantContentBean);
  53 + viewAdapter = new AssistantViewAdapter(this, assistantContentBean);
70 54  
  55 + binding.assistantView.setVisibility(View.GONE);
71 56 binding.assistantView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(this, R.anim.layout_animation_fall_down));
72 57 binding.assistantView.setAdapter(viewAdapter);
73 58 binding.assistantView.setOnClickBlankBgListener(new View.OnClickListener() {
... ... @@ -76,15 +61,15 @@ public class AssistantActivity extends BaseActivity {
76 61 finish();
77 62 }
78 63 });
79   - new Handler().postDelayed(new Runnable() {
80   - @Override
81   - public void run() {
82   - AssistantContentBean assistantContentBean = new AssistantContentBean(AssistantContentBean.TYPE_DIALOGUE);
83   - assistantContentBean.setDialogue("修奥对话");
84   - viewAdapter.setChangeData(assistantContentBean);
85   - viewAdapter.notifyAllChange();
86   - }
87   - }, 3000);
  64 +// new Handler().postDelayed(new Runnable() {
  65 +// @Override
  66 +// public void run() {
  67 +// AssistantContentBean assistantContentBean = new AssistantContentBean(AssistantContentBean.TYPE_DIALOGUE);
  68 +// assistantContentBean.setDialogue("修奥对话");
  69 +// viewAdapter.setChangeData(assistantContentBean);
  70 +// viewAdapter.notifyAllChange();
  71 +// }
  72 +// }, 3000);
88 73  
89 74 // list.add(assistantContentBean);
90 75 //// assistantAdapter.notifyItemInserted(0);
... ... @@ -98,40 +83,47 @@ public class AssistantActivity extends BaseActivity {
98 83 // binding.rv.scheduleLayoutAnimation();
99 84 // }
100 85 // }, 3000);
101   -// AIUIWrapper.getInstance().setVoiceIdentifyResultListener(new OnVoiceIdentifyResultListener() {
102   -// @Override
103   -// public void onResult(boolean isIATResult, RawMessage rawMessage) {
104   -// if (rawMessage != null) {
105   -// if (rawMessage.isFromUser()) {
106   -// binding.rv.setVisibility(View.INVISIBLE);
107   -// binding.tvMsg.setText(isIATResult ? rawMessage.cacheContent : String.valueOf(rawMessage.msgData));
108   -// if (!isIATResult) {
109   -// Log.e("TAG", "onResult: " + new String(rawMessage.msgData));
110   -// }
111   -// //滑动到最后一位
112   -// binding.hscroll.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
113   -// } else {
114   -// binding.rv.setVisibility(View.VISIBLE);
115   -// //非用户说的
116   -// String result = messageHandler.getFormatMessage(rawMessage);
117   -// list.clear();
118   -// Animation animation = AnimationUtils.loadAnimation(AssistantActivity.this, R.anim.anim_bottom);
119   -// //得到一个LayoutAnimationController对象;
120   -// LayoutAnimationController lac = new LayoutAnimationController(animation);
121   -// binding.rv.setLayoutAnimation(lac);
122   -//
123   -// AssistantContentBean assistantContentBean = new AssistantContentBean(AssistantContentBean.TYPE_WEATHER);
124   -// assistantContentBean.setWeather(result);
125   -// list.add(assistantContentBean);
126   -// assistantAdapter.notifyDataSetChanged();
127   -// binding.rv.scheduleLayoutAnimation();
128   -// }
129   -//
130   -// } else {
131   -// binding.tvMsg.setText("什么也没说");
132   -// }
133   -// }
134   -// });
  86 + binding.assistantView.setVisibility(View.INVISIBLE);
  87 + AIUIWrapper.getInstance().setVoiceIdentifyResultListener(new OnVoiceIdentifyResultListener() {
  88 + @Override
  89 + public void onResult(boolean isIATResult, RawMessage rawMessage) {
  90 + if (rawMessage != null) {
  91 + if (rawMessage.isFromUser()) {
  92 +
  93 + binding.tvMsg.setText(isIATResult ? rawMessage.cacheContent : String.valueOf(rawMessage.msgData));
  94 + if (!isIATResult) {
  95 + Log.e("TAG", "onResult: " + new String(rawMessage.msgData));
  96 + }
  97 + //滑动到最后一位
  98 + binding.hscroll.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
  99 + } else {
  100 + binding.assistantView.setVisibility(View.VISIBLE);
  101 + //非用户说的
  102 + Answer result = messageHandler.getFormatMessage(rawMessage);
  103 + AssistantContentBean assistantContentBean = new AssistantContentBean(AssistantContentBean.TYPE_WEATHER);
  104 + assistantContentBean.setWeather(result.getAnswer());
  105 + viewAdapter.setChangeData(assistantContentBean);
  106 + viewAdapter.notifyAllChange();
  107 + }
  108 +
  109 + } else {
  110 + binding.tvMsg.setText("什么也没说");
  111 + }
  112 + }
  113 + });
  114 +
  115 + binding.tvMsg.setOnClickListener(new View.OnClickListener() {
  116 + @Override
  117 + public void onClick(View v) {
  118 + reSpeak();
  119 + }
  120 + });
  121 + }
  122 +
  123 + private void reSpeak() {
  124 + messageHandler.reset();
  125 + AIUIWrapper.getInstance().startRecordAudio();
  126 + binding.tvMsg.setText("倾听中...");
135 127 }
136 128  
137 129 @Override
... ...
smartAssistant/src/main/res/layout/activity_xiaojia_assistant.xml
... ... @@ -11,6 +11,7 @@
11 11 android:layout_height="match_parent"
12 12 android:background="@android:color/transparent">
13 13  
  14 +
14 15 <com.ys.yslibrary.ui.custom.AssistantView
15 16 android:id="@+id/assistant_view"
16 17 android:layout_width="match_parent"
... ... @@ -18,6 +19,7 @@
18 19 app:layout_constraintBottom_toTopOf="@id/iv_icon"
19 20 app:layout_constraintTop_toTopOf="parent" />
20 21  
  22 +
21 23 <ImageView
22 24 android:id="@+id/iv_icon"
23 25 android:layout_width="20dp"
... ...