소스 검색

<新增一种TTS方式语音播报,需要提前预装讯飞tts apk并设置为默认引擎,试过google tts需要联网下载中文语音包,并且播放效果不是很好。目前只是增加了这一功能,由enableTTS来控制是否开启,目前是关闭的>

weizhengliang 4 년 전
부모
커밋
dec068b8b6

+ 1 - 1
.gitignore

@@ -9,7 +9,7 @@
 .externalNativeBuild
 ### Android template
 # Built application files
-*.apk
+app/*.apk
 *.ap_
 
 # Files for the ART/Dalvik VM

+ 3 - 0
app/src/main/java/com/wdkl/callingmainnurse/MyApplication.java

@@ -12,6 +12,7 @@ import com.wdkl.callingmainnurse.entity.AllDoctorHostEntity;
 import com.wdkl.callingmainnurse.entity.UdpEntity;
 import com.wdkl.callingmainnurse.service.APPService;
 import com.wdkl.callingmainnurse.util.ScreenExtinguishUtil;
+import com.wdkl.callingmainnurse.util.SpeechUtil;
 import com.wdkl.callingmainnurse.util.UdpHelper;
 import com.wdkl.callingmainnurse.util.anrfcutil.AnrFcExceptionUtil;
 import com.zhy.http.okhttp.OkHttpUtils;
@@ -117,6 +118,7 @@ public class MyApplication extends Application {
         Intent bindIntent = new Intent(this, APPService.class);
         bindService(bindIntent, connection, BIND_AUTO_CREATE);
 
+        SpeechUtil.getInstance().init(getApplicationContext());
 
     }
 
@@ -155,5 +157,6 @@ public class MyApplication extends Application {
     public void onTerminate() { // 程序终止 (Waderson 20180123)
         super.onTerminate();
         //unbindService(connection);
+        SpeechUtil.getInstance().release();
     }
 }

+ 130 - 10
app/src/main/java/com/wdkl/callingmainnurse/ui/fragment/CallingBedFragment.java

@@ -49,6 +49,7 @@ import com.wdkl.callingmainnurse.util.LogUtil;
 import com.wdkl.callingmainnurse.util.PalyPhonetics;
 import com.wdkl.callingmainnurse.util.SharedPreferencesUtil;
 import com.wdkl.callingmainnurse.util.SipUtil.SipHelperUtil;
+import com.wdkl.callingmainnurse.util.SpeechUtil;
 import com.wdkl.callingmainnurse.util.StringUtils;
 import com.wdkl.callingmainnurse.util.ToastUtil;
 import com.wdkl.callingmainnurse.util.UIUtils;
@@ -425,6 +426,8 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
 
     public static CallingBedFragment mCallingBedFragment;
 
+    private boolean enableTTS = false;
+
     private CallATimeoutThread callATimeoutThread;
     private List<CallListEntity> callListEntityList;
     private boolean threadBool = true;//30秒无人接听线程
@@ -517,7 +520,9 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
         serialPortUtil.setOnDataReceiveListener(this, this);
         setVolumePA(false);
         setPowerLed("1");
-        startPalyPhonetics();
+        if (!enableTTS) {
+            startPalyPhonetics();
+        }
     }
 
     @Override
@@ -669,6 +674,9 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
             if (null != loopVoice) {
                 loopVoice.setPalyDismiss(true);
             }
+            if (enableTTS) {
+                SpeechUtil.getInstance().stopSpeak();
+            }
         } else {
             for (int i=0; i<PalyPhonetics.speakEntityList.size(); i++) {//将播报列表也删除该元素 两种实体格式不一样,所以要用循环
                 if(PalyPhonetics.speakEntityList.get(i).equals(deleteEntity)) {
@@ -716,6 +724,9 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
             if (null != loopVoice) {
                 loopVoice.setPalyDismiss(true);
             }
+            if (enableTTS) {
+                SpeechUtil.getInstance().stopSpeak();
+            }
         } else {
             for (int i=0; i<PalyPhonetics.speakEntityList.size(); i++) {//将播报列表也删除该元素 两种实体格式不一样,所以要用循环
                 if(PalyPhonetics.speakEntityList.get(i).equals(deleteEntity)) {
@@ -1011,6 +1022,9 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
                 if (null != loopVoice) {
                     loopVoice.setPalyDismiss(true);
                 }
+                if (enableTTS) {
+                    SpeechUtil.getInstance().stopSpeak();
+                }
                 //String sipAddress = callingEntity.getSipAddress();
                 String sipAddress = callingEntity.getSipAddress();
                 if (StringUtils.notEmpty(sipAddress)) {
@@ -1024,7 +1038,12 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
                 }
             } else {
                 if (null != loopingUdpentity && loopingUdpentity.equals(callingEntity)) {
-                    loopVoice.setPalyDismiss(true);
+                    if (null != loopVoice) {
+                        loopVoice.setPalyDismiss(true);
+                    }
+                }
+                if (enableTTS) {
+                    SpeechUtil.getInstance().stopSpeak();
                 }
                 endCall();
                 Constants.DoctorMachineCallStatus = Constants.STANDBY;
@@ -1053,6 +1072,9 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
                     if (null != loopVoice) {
                         loopVoice.setPalyDismiss(true);
                     }
+                    if (enableTTS) {
+                        SpeechUtil.getInstance().stopSpeak();
+                    }
                     if (StringUtils.notEmpty(sipAddress)) {
                         LogUtil.d("sipAddress", "Call==sipAddress==" + sipAddress);
                         LogUtil.d("sipAddress", "Call==deviceMAC==" + sickBedInfo.getDeviceMAC());
@@ -1164,6 +1186,9 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
         if (vRightCallInfo.getVisibility() == View.VISIBLE && sickBedInfo.equals(sickbedInformationList.get(position))) {
             if (null == sickBedInfo || !StringUtils.listNotEmpty(sickbedInformationList)) return;
             if (filterSipToast()) {
+                if (enableTTS) {
+                    SpeechUtil.getInstance().stopSpeak();
+                }
                 if (Constants.CALL_STATE.equals(Constants.STANDBY)) {
                     String sipAddress = sickBedInfo.getSipID();
                     if (StringUtils.notEmpty(sipAddress)) {
@@ -1251,6 +1276,9 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
         if (vRightCallListInfo.getVisibility() == View.VISIBLE && callItemChooseEntity.equals(MyApplication.callEntityList.get(position))) {
             if (null == callItemChooseEntity) return;
             if (filterSipToast() && !MyApplication.callEntityList.get(position).getType().equals(Constants.WSHROOM_CALL) && !MyApplication.callEntityList.get(position).getType().equals(Constants.ROOMHELP_CALL)) {
+                if (enableTTS) {
+                    SpeechUtil.getInstance().stopSpeak();
+                }
                 if (Constants.CALL_STATE.equals(Constants.STANDBY)) {
                     String sipAddress = callItemChooseEntity.getSipAddress();
                     if (StringUtils.notEmpty(sipAddress)) {
@@ -1330,6 +1358,9 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
                                         if (null != loopVoice) {
                                             loopVoice.setPalyDismiss(true);
                                         }
+                                        if (enableTTS) {
+                                            SpeechUtil.getInstance().stopSpeak();
+                                        }
                                     } else {
                                         if (PalyPhonetics.speakEntityList.contains(callingEntity)) {//将播报列表也删除该元素
                                             PalyPhonetics.speakEntityList.remove(callingEntity);
@@ -1399,6 +1430,10 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
                     //正在呼叫;将播报音量为0
                     if (null != loopVoice) {
                         loopVoice.setVolumes(0f);
+                        loopVoice.setPalyDismiss(true);
+                    }
+                    if (enableTTS) {
+                        SpeechUtil.getInstance().stopSpeak();
                     }
                     //安卓端接通电话,通知点阵屏,但要排除固定列表
                     if (!callBed) {
@@ -1448,8 +1483,15 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
                     case "call_4"://增援呼叫护士主机
                     case "call_6": //门口机呼叫护士主机
                         if (isMySelfMachine(nurseHostID)) {//只有属于自己管的机器才能加进列表
-                            if (!PalyPhonetics.speakEntityList.contains(udpEntity) && Constants.CALL_STATE.equals(Constants.STANDBY)) {
-                                addPhonetics(udpEntity); //在此加入列表队列 Waderson  20171101
+                            if (enableTTS) {
+                                //使用TTS播报
+                                if (Constants.CALL_STATE.equals(Constants.STANDBY)) {
+                                    startSpeak(udpEntity);
+                                }
+                            } else {
+                                if (!PalyPhonetics.speakEntityList.contains(udpEntity) && Constants.CALL_STATE.equals(Constants.STANDBY)) {
+                                    addPhonetics(udpEntity); //在此加入列表队列 Waderson  20171101
+                                }
                             }
                             if (!MyApplication.callEntityList.contains(udpEntity)) {
                                 if (isHaveThisWSHtype(udpEntity)) return;
@@ -1466,8 +1508,15 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
                         break;
                     case "call_12": //总控制室呼叫护士主机
                         if (isMySelfMachine(nurseHostID)) {
-                            if (!PalyPhonetics.speakEntityList.contains(udpEntity) && Constants.CALL_STATE.equals(Constants.STANDBY)) {
-                                addPhonetics(udpEntity);
+                            if (enableTTS) {
+                                //使用TTS播报
+                                if (Constants.CALL_STATE.equals(Constants.STANDBY)) {
+                                    startSpeak(udpEntity);
+                                }
+                            } else {
+                                if (!PalyPhonetics.speakEntityList.contains(udpEntity) && Constants.CALL_STATE.equals(Constants.STANDBY)) {
+                                    addPhonetics(udpEntity);
+                                }
                             }
                             if (!MyApplication.callEntityList.contains(udpEntity)) {
                                 MyApplication.callEntityList.add(udpEntity);
@@ -1485,8 +1534,15 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
                     case "call_14": //医生主机呼叫护士主机
                         Log.e("qqqq","nurseHostID "+nurseHostID);
                         if (isMySelfMachine(nurseHostID)) {
-                            if (!PalyPhonetics.speakEntityList.contains(udpEntity) && Constants.CALL_STATE.equals(Constants.STANDBY)) {
-                                addPhonetics(udpEntity);
+                            if (enableTTS) {
+                                //使用TTS播报
+                                if (Constants.CALL_STATE.equals(Constants.STANDBY)) {
+                                    startSpeak(udpEntity);
+                                }
+                            } else {
+                                if (!PalyPhonetics.speakEntityList.contains(udpEntity) && Constants.CALL_STATE.equals(Constants.STANDBY)) {
+                                    addPhonetics(udpEntity);
+                                }
                             }
                             if (!MyApplication.callEntityList.contains(udpEntity)) {
                                 MyApplication.callEntityList.add(udpEntity);
@@ -1658,6 +1714,12 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
         if (null != deleteUdpEntity) {
             String roomNumber = deleteUdpEntity.getRoomNumber();
             if (StringUtils.notEmpty(roomNumber)) {
+                //if (null != loopVoice) {
+                //    loopVoice.setPalyDismiss(true);
+                //}
+                if (enableTTS) {
+                    SpeechUtil.getInstance().stopSpeak();
+                }
                 for (int i = 0; i < PalyPhonetics.speakEntityList.size(); i++) {
                     if (roomNumber.equals(PalyPhonetics.speakEntityList.get(i).getRoomNumber())) {
                         if (null != loopingUdpentity && loopingUdpentity.equals(PalyPhonetics.speakEntityList.get(i))) {
@@ -1726,6 +1788,48 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
 //                VoiceManagerUtil.setCallVoice(getActivity(), StringUtils.parseInt(systemInfoEntity.getNightSipVol()) );
             }
         }
+        SpeechUtil.getInstance().setSpeechLoopCount(speakLooping);
+    }
+
+    //语音播报
+    private void startSpeak(UdpEntity entity) {
+        loopingUdpentity = entity;
+        showUrgentWindow(entity);
+        String type = entity.getType();
+        String rnb = entity.getRoomNumber();
+        String bnb = entity.getBedNumber();
+        String text = "";
+        switch (type) {
+            case DOOR_CALL: //门口机
+                text = rnb + "房门口机呼叫";
+                SpeechUtil.getInstance().newSpeech(text);
+                break;
+            case Constants.MAIN_CALL://主机
+                text = rnb + "号主机呼叫";
+                SpeechUtil.getInstance().newSpeech(text);
+                break;
+            case Constants.SON_CALL://床位
+            case Constants.TRADITION_CALL://传统床位
+                text = rnb + "房" + bnb + "床呼叫";
+                SpeechUtil.getInstance().newSpeech(text);
+                break;
+            case Constants.ROOMHELP_CALL://请求增援
+                text = rnb + "房" + bnb + "床请求增援";
+                SpeechUtil.getInstance().newSpeech(text);
+                break;
+            case Constants.WSHROOM_CALL://卫生间
+                text = rnb + "房卫生间请求增援";
+                SpeechUtil.getInstance().newSpeech(text);
+                break;
+            case Constants.MANAGER_CALL://总控机
+                text = "总控制室呼叫";
+                SpeechUtil.getInstance().newSpeech(text);
+                break;
+            case Constants.DOCTOR_CALL://医生主机
+                text = "医生主机呼叫";
+                SpeechUtil.getInstance().newSpeech(text);
+                break;
+        }
     }
 
     /**
@@ -1765,6 +1869,9 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
                         if (null != loopVoice) {
                             loopVoice.setPalyDismiss(true);
                         }
+                        if (enableTTS) {
+                            SpeechUtil.getInstance().stopSpeak();
+                        }
                     } else {
                         if (PalyPhonetics.speakEntityList.contains(udpEntity)) {//将播报列表也删除该元素
                             LogUtil.d("sendTransferForSon", "-----2222----");
@@ -1799,6 +1906,9 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
                         if (null != loopVoice) {
                             loopVoice.setPalyDismiss(true);
                         }
+                        if (enableTTS) {
+                            SpeechUtil.getInstance().stopSpeak();
+                        }
                     } else {
                         if (PalyPhonetics.speakEntityList.contains(callEntityList.get(i))) {//将播报列表也删除该元素
                             PalyPhonetics.speakEntityList.remove(udpEntity);
@@ -2185,7 +2295,12 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
                                 } else {
                                     //结束通话将当前呼叫对象语音关闭; 减少由于SIP结束回调的延时而出现重叠(之前是写在SIP结束回调的;在连续狂打电话的情况下效果重叠不行)
                                     if (null != loopingUdpentity && loopingUdpentity.equals(callingEntity)) {
-                                        loopVoice.setPalyDismiss(true);
+                                        if (null != loopVoice) {
+                                            loopVoice.setPalyDismiss(true);
+                                        }
+                                    }
+                                    if (enableTTS) {
+                                        SpeechUtil.getInstance().stopSpeak();
                                     }
                                     endCall(); //否则就挂断电话!
                                 }
@@ -2206,7 +2321,12 @@ public class CallingBedFragment extends BaseFragment implements SicknessBedAdapt
                         setCallVoice(0);//0为外喇叭 1为 手柄
                         if (handTelephone) {
                             if (null != loopingUdpentity && loopingUdpentity.equals(callingEntity)) {
-                                loopVoice.setPalyDismiss(true);
+                                if (null != loopVoice) {
+                                    loopVoice.setPalyDismiss(true);
+                                }
+                            }
+                            if (enableTTS) {
+                                SpeechUtil.getInstance().stopSpeak();
                             }
                             endCall(); //挂断电话!
                         }

+ 105 - 0
app/src/main/java/com/wdkl/callingmainnurse/util/SpeechUtil.java

@@ -0,0 +1,105 @@
+package com.wdkl.callingmainnurse.util;
+
+import android.content.Context;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.UtteranceProgressListener;
+
+import java.util.Locale;
+
+public class SpeechUtil {
+    private static final String TAG = "SpeechUtil";
+
+    private TextToSpeech textToSpeech;
+    private static SpeechUtil speech;
+    private int speakIndex = 0;
+    private int loopCount = 2;
+    private String speechText;
+    private boolean isStop = true;
+
+    public static SpeechUtil getInstance() {
+        if (speech == null) {
+            synchronized (SpeechUtil.class) {
+                if (speech == null) {
+                    speech = new SpeechUtil();
+                }
+            }
+        }
+        return speech;
+    }
+
+    public void init(Context context) {
+        textToSpeech = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
+            @Override
+            public void onInit(int status) {
+                if (status == TextToSpeech.SUCCESS) {
+                    int supported = textToSpeech.setLanguage(Locale.CHINESE);
+                    if ((supported != TextToSpeech.LANG_AVAILABLE) && (supported != TextToSpeech.LANG_COUNTRY_AVAILABLE)) {
+                        ToastUtil.showToast("当前不支持中文!");
+                    } else {
+                        LogUtil.d(TAG, "onInit: 支持中文");
+                    }
+                    LogUtil.d(TAG, "onInit: TTS引擎初始化成功");
+                } else {
+                    LogUtil.d(TAG, "onInit: TTS引擎初始化失败");
+                }
+            }
+        });
+        textToSpeech.setSpeechRate(0.5f);
+    }
+
+    public void newSpeech(String text) {
+        LogUtil.d(TAG, "start speech: " + text);
+        if (loopCount > 0) {
+            stopSpeak();
+            speechText = text;
+            speakIndex = 0;
+            speak();
+            isStop = false;
+        }
+    }
+
+    public void speak() {
+        textToSpeech.speak(speechText, TextToSpeech.QUEUE_FLUSH, null, "uniqueId");
+        textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
+            @Override
+            public void onStart(String utteranceId) {
+                //LogUtil.d(TAG, "speak onStart..." + utteranceId);
+            }
+
+            @Override
+            public void onDone(String utteranceId) {
+                speakIndex++;
+                //LogUtil.d(TAG, "speak onDone...index: " + speakIndex + ", loop: " + loopCount);
+                if (speakIndex < loopCount && !isStop) {
+                    speak();
+                }
+            }
+
+            @Override
+            public void onError(String utteranceId) {
+                //LogUtil.d(TAG, "speak onError..." + utteranceId);
+            }
+        });
+    }
+
+    public void stopSpeak() {
+        if (textToSpeech.isSpeaking()) {
+            isStop = true;
+            textToSpeech.stop();
+            LogUtil.d(TAG, "stop speak");
+        }
+    }
+
+    public void setSpeechLoopCount(int count) {
+        loopCount = count;
+    }
+
+    public void release() {
+        if (textToSpeech != null) {
+            textToSpeech.stop();
+            textToSpeech.shutdown();
+            textToSpeech = null;
+        }
+    }
+
+}

BIN
tts/iFlytek.apk