diff --git a/app/build.gradle b/app/build.gradle index 760da51..101b57e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -101,7 +101,8 @@ dependencies { implementation files('libs\\shockman.jar')//指路机 implementation files('libs/signway.jar') //欣威视通 implementation files('libs\\sdkapi.jar') //Bv-3588 - implementation files('libs\\smdt.jar') //视美泰 + implementation files('libs\\smdt.jar') //视美泰 + implementation files('libs\\DUI-lite-SDK-for-Android-3.5.0-466a4c77.jar') //思必驰 testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' diff --git a/app/libs/DUI-lite-SDK-for-Android-3.5.0-466a4c77.jar b/app/libs/DUI-lite-SDK-for-Android-3.5.0-466a4c77.jar new file mode 100644 index 0000000..6f50de5 Binary files /dev/null and b/app/libs/DUI-lite-SDK-for-Android-3.5.0-466a4c77.jar differ diff --git a/app/libs/armeabi/libailog2.so b/app/libs/armeabi/libailog2.so new file mode 100644 index 0000000..27f2051 Binary files /dev/null and b/app/libs/armeabi/libailog2.so differ diff --git a/app/libs/armeabi/libduidns.so b/app/libs/armeabi/libduidns.so new file mode 100644 index 0000000..6abe214 Binary files /dev/null and b/app/libs/armeabi/libduidns.so differ diff --git a/app/libs/armeabi/libduiitn.so b/app/libs/armeabi/libduiitn.so new file mode 100644 index 0000000..1f8817f Binary files /dev/null and b/app/libs/armeabi/libduiitn.so differ diff --git a/app/libs/armeabi/libduiutils.so b/app/libs/armeabi/libduiutils.so new file mode 100644 index 0000000..c80757c Binary files /dev/null and b/app/libs/armeabi/libduiutils.so differ diff --git a/app/libs/armeabi/libliteca.so b/app/libs/armeabi/libliteca.so new file mode 100644 index 0000000..6b6874e Binary files /dev/null and b/app/libs/armeabi/libliteca.so differ diff --git a/app/libs/armeabi/libmp3.so b/app/libs/armeabi/libmp3.so new file mode 100644 index 0000000..809c961 Binary files /dev/null and b/app/libs/armeabi/libmp3.so differ diff --git a/app/libs/armeabi/libopusogg.so b/app/libs/armeabi/libopusogg.so new file mode 100644 index 0000000..31c5ed6 Binary files /dev/null and b/app/libs/armeabi/libopusogg.so differ diff --git a/app/libs/armeabi/libspeex.so b/app/libs/armeabi/libspeex.so new file mode 100644 index 0000000..647ebd4 Binary files /dev/null and b/app/libs/armeabi/libspeex.so differ diff --git a/app/libs/armeabi/libvad.so b/app/libs/armeabi/libvad.so new file mode 100644 index 0000000..d88be80 Binary files /dev/null and b/app/libs/armeabi/libvad.so differ diff --git a/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java b/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java index a9b7333..87b9cff 100644 --- a/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java +++ b/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java @@ -5,6 +5,7 @@ import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Debug; import android.os.Handler; @@ -26,18 +27,17 @@ import android.webkit.WebViewClient; import androidx.annotation.NonNull; import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.GridLayoutManager; - +import com.aispeech.AIError; +import com.aispeech.AIResult; +import com.aispeech.common.AIConstant; +import com.aispeech.common.JSONResultParser; +import com.aispeech.export.config.AICloudASRConfig; +import com.aispeech.export.engines2.AICloudASREngine; +import com.aispeech.export.intent.AICloudASRIntent; +import com.aispeech.export.listeners.AIASRListener; import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.android.arouter.launcher.ARouter; -import com.google.gson.Gson; -import com.iflytek.cloud.ErrorCode; -import com.iflytek.cloud.InitListener; -import com.iflytek.cloud.RecognizerListener; -import com.iflytek.cloud.RecognizerResult; -import com.iflytek.cloud.SpeechConstant; -import com.iflytek.cloud.SpeechError; -import com.iflytek.cloud.SpeechRecognizer; -import com.iflytek.cloud.SpeechUtility; + import com.shockman.sm.vendor.IHttp; import com.shockman.sm.vendor.SmUtils; import com.shockman.sm.vendor.TargetVo; @@ -49,6 +49,7 @@ import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.List; +import java.util.Locale; import java.util.Scanner; import java.util.concurrent.Executors; import java.util.regex.Matcher; @@ -78,6 +79,7 @@ import qianmu.container.util.KeyboardUtil; import qianmu.container.util.LoggerUtil; import qianmu.container.util.SignWayUtil; import qianmu.container.util.StringUtil; +import qianmu.container.util.TTSUtil; import qianmu.container.util.ToastUtils; import static qianmu.container.service.ContainerService.initFirstTime; @@ -93,20 +95,20 @@ public class WebViewActivity extends BaseActivity { static final int TYPE_START_SERVER = 4;//重新启动web服务 static final int TYPE_SHENG_HTML_MAG = 5;//返回接口请求值给h5 static String HtmlUrl = "http://127.0.0.1:8080/index.html";//webServer服务地址 - String vocMsg = "";//语音内容 - // 语音听写对象 - private SpeechRecognizer mIat; int time = 0; String interfaceRequestData=""; + // 语音听写对象 + private AICloudASREngine mEngine; + private AICloudASRIntent aiCloudASRIntent; + private TTSUtil ttsUtil; + private String oldString=""; Handler handler = new Handler() { @SuppressLint("HandlerLeak") @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); - switch (msg.what){ - case TYPE_REFURBISH_WEBVIEW://刷新webview try { binding.web.clearCache(true); @@ -115,12 +117,9 @@ public class WebViewActivity extends BaseActivity { }catch (Exception e){ } - - break; case TYPE_GO_SAVESCREEN://导视通知跳转屏保 - try { initFirstTime(); if (!ScreenSaverData.isProgramPlay()) return; @@ -142,13 +141,7 @@ public class WebViewActivity extends BaseActivity { removeMessages(TYPE_HINT_PASSWORD); } time++; - try { - - }catch (Exception e){ - - } break; - case TYPE_START_SERVER: removeMessages(TYPE_REFURBISH_WEBVIEW); sendEmptyMessageDelayed(TYPE_REFURBISH_WEBVIEW,2000); @@ -172,8 +165,11 @@ public class WebViewActivity extends BaseActivity { binding = DataBindingUtil.setContentView(this, R.layout.activity_webview); //设置密码 initPass(); - //初始化科大讯飞 - initKDXF(); + if("sbc".equals(Constant.TTSHome)){ + initASR(); + ttsUtil = new TTSUtil(); + ttsUtil.initTts(); + } } @Override @@ -192,36 +188,22 @@ public class WebViewActivity extends BaseActivity { webSettings.setLoadsImagesAutomatically(true); webSettings.setDefaultTextEncodingName("utf-8"); webSettings.setUserAgentString(""); - //加载web - currRoute = Constant.ROUTE_WEB_VIEW; - loadH5Url(getIntent().getBooleanExtra(Constant.KEY_LOAD_H5_URL, false)); - //加载语音 - initVoice(); - } + webSettings.setMediaPlaybackRequiresUserGesture(false); // 允许自动播放 - //初始化科大讯飞 - private void initKDXF(){ - try { - KdxfBean kdxf = H5Data.getKdxf(); - if(kdxf.getData()==null || kdxf.getData().getDeployType()==null || kdxf.getData().getDeployType().isEmpty() || kdxf.getData().getDeployType().toLowerCase().equals("saas")){ - SpeechUtility.createUtility(this, SpeechConstant.APPID +"=5c2055f8"); - }else { - SpeechUtility.createUtility(this, SpeechConstant.APPID + "=5c2055f8" + "," + "net_type=custom, proxy_ip="+kdxf.getData().getXfyunIp()+", proxy_port="+kdxf.getData().getXfyunPort()); - } - }catch (Throwable t) { - LoggerUtil.e("初始化语音", StringUtil.getThrowableStr(t)); + // 适配HTTPS/HTTP混合内容 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); } - } - //初始化语音 - private void initVoice(){ - mIat = SpeechRecognizer.createRecognizer(this, mInitListener); + //加载web + currRoute = Constant.ROUTE_WEB_VIEW; + loadH5Url(getIntent().getBooleanExtra(Constant.KEY_LOAD_H5_URL, false)); } @Override protected void setListener() { binding.web.setWebViewClient(new WebViewClient() { -// @Override + // @Override // public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { // Uri uri = request.getUrl(); // if (uri.toString().endsWith(".js")) { @@ -296,6 +278,7 @@ public class WebViewActivity extends BaseActivity { } binding.layoutPass.setVisibility(View.GONE); ARouter.getInstance().build(Constant.ROUTE_DEVICE_INFO).withBoolean(Constant.INPUT_PASSWORD, false).navigation(); + finish(); }else { binding.tvPass.setText(binding.tvPass.getText().toString()+position); } @@ -339,11 +322,6 @@ public class WebViewActivity extends BaseActivity { protected void onDestroy() { super.onDestroy(); LoggerUtil.e(TAG, "onDestroy()"); - if (mIat != null) { - // 退出时释放连接 - mIat.cancel(); - mIat.destroy(); - } } private void loadH5Url(boolean loadUrl) { @@ -408,28 +386,43 @@ public class WebViewActivity extends BaseActivity { // h5调用android:开始识别语音 @JavascriptInterface - public void startVoice() { - LoggerUtil.e(TAG,"JS调用了Android的方法:startVoice()"); - mIat.startListening(mRecognizerListener); + public void startRecord() { + LoggerUtil.e(TAG,"JS调用了Android的方法:startRecord()"); + if("sbc".equals(Constant.TTSHome)){ + ttsUtil.stopTTs(); + stopAsr(); + if(mEngine == null){ + LoggerUtil.d(TAG, "未初始化"); + initASR(); + } + mEngine.start(aiCloudASRIntent); + } } // h5调用android:结束识别语音 @JavascriptInterface - public void stopVoice() { + public void stopRecord() { LoggerUtil.e(TAG,"JS调用了Android的方法:stopVoice()"); - + if("sbc".equals(Constant.TTSHome)){ + stopAsr(); + } } // h5调用android:传入要播报语音 @JavascriptInterface - public void TTS(String content) { - LoggerUtil.e(TAG,"JS调用了Android的方法:TTS()"); - + public void startTTS(String content) { + LoggerUtil.e(TAG,"JS调用了Android的方法:startTTS()"); + if("sbc".equals(Constant.TTSHome)){ + ttsUtil.startTTs(content.toLowerCase(Locale.ENGLISH)); + } } // h5调用android:停止语音播报播报语音 @JavascriptInterface - public void TTSStop() { - LoggerUtil.e(TAG,"JS调用了Android的方法:TTSStop()"); + public void stopTTS() { + LoggerUtil.e(TAG,"JS调用了Android的方法:stopTTS()"); + if("sbc".equals(Constant.TTSHome)){ + ttsUtil.stopTTs(); + } } // h5调用android:新版指路机传入的数据 @@ -508,10 +501,15 @@ public class WebViewActivity extends BaseActivity { /** * android调用js:传送识别语音内容 * */ - public void voiceContent(String msg){ - if(binding.web!=null){ - binding.web.loadUrl(StringUtil.strSplice("javascript:voiceContent("+ msg +");")); - LoggerUtil.e(TAG,"android调用js方法:voiceContent(),语音内容:"+msg); + public void voiceContent(String msg) { + if (binding.web != null) { + LoggerUtil.e(TAG, "android调用js方法:giveAskText(),语音内容:" + msg); + runOnUiThread(new Runnable() { + @Override + public void run() { + binding.web.loadUrl(StringUtil.strSplice("javascript:window.giveAskText('" + msg + "');")); + } + }); } } @@ -521,97 +519,9 @@ public class WebViewActivity extends BaseActivity { public void getHandWriting(String msg){ if(binding.web!=null){ binding.web.loadUrl(StringUtil.strSplice("javascript:handWriting("+ msg +");")); -// LoggerUtil.e(TAG,"android调用js方法:getHandWriting(),接口请求数据:"+msg); } } - /** - * 初始化监听器。 - */ - private InitListener mInitListener = new InitListener() { - - @Override - public void onInit(int code) { - - LoggerUtil.e(TAG, "语音初始化"+"SpeechRecognizer init() code = " + code); - if (code == ErrorCode.SUCCESS) { - mIat.setParameter(SpeechConstant.CLOUD_GRAMMAR, null); //设置语法ID和 SUBJECT 为空,以免因之前有语法调用而设置了此参数;或直接清空所有参数,具体可参考 DEMO 的示例。 - mIat.setParameter(SpeechConstant.SUBJECT, null); - mIat.setParameter(SpeechConstant.RESULT_TYPE, "plain"); //设置返回结果格式,目前支持json,xml以及plain 三种格式,其中plain为纯听写文本内容 - mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //此处engineType为“cloud” - mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); //设置语音输入语言,zh_cn为简体中文 -// mIat.setParameter(SpeechConstant.LANGUAGE, "en_us"); //设置语音输入语言,zh_cn为简体中文 - mIat.setParameter(SpeechConstant.ACCENT, "mandarin"); //设置结果返回语言 - mIat.setParameter(SpeechConstant.VAD_BOS, "4000"); //取值范围{1000~10000} 设置语音前端点:静音超时时间,单位ms,即用户多长时间不说话则当做超时处理 - mIat.setParameter(SpeechConstant.VAD_EOS, "1000"); //自动停止录音,范围{0~10000} 设置语音后端点:后端点静音检测时间,单位ms,即用户停止说话多长时间内即认为不再输入, - mIat.setParameter(SpeechConstant.ASR_PTT, "0"); //设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点 - } - } - }; - - /** - * 听写监听器。 - */ - private RecognizerListener mRecognizerListener = new RecognizerListener() { - - @Override - public void onBeginOfSpeech() { - // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入 - Log.e(TAG,"开始说话"); - vocMsg=""; - } - - @Override - public void onError(SpeechError error) { - // Tips: - // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。 - LoggerUtil.e(TAG, "onError " + error.getPlainDescription(true)); - Vocbean vocbean = new Vocbean(); - vocbean.setCode(error.getErrorCode()+""); - vocbean.setMsg(""); - vocMsg=new Gson().toJson(vocbean); - voiceContent(vocMsg); - } - - @Override - public void onEndOfSpeech() { - // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入 - LoggerUtil.e(TAG,"结束说话"); - } - - @Override - public void onResult(RecognizerResult results, boolean isLast) { - Log.e(TAG, results.getResultString()); - - if(!results.getResultString().isEmpty()){ - Vocbean vocbean = new Vocbean(); - vocbean.setCode("200"); - vocbean.setMsg(results.getResultString()); - vocMsg= new Gson().toJson(vocbean); - voiceContent(vocMsg); - } - if (isLast) { - Log.d(TAG, "onResult 结束"); - } - - } - - @Override - public void onVolumeChanged(int volume, byte[] data) { -// Log.e(TAG,"当前正在说话,音量大小 = " + volume + " 返回音频数据 = " + data.length); - } - - @Override - public void onEvent(int eventType, int arg1, int arg2, Bundle obj) { - // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因 - // 若使用本地能力,会话id为null - // if (SpeechEvent.EVENT_SESSION_ID == eventType) { - // String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID); - // Log.d(TAG, "session id =" + sid); - // } - } - }; - /** * 调用手臂方法 * */ @@ -678,11 +588,131 @@ public class WebViewActivity extends BaseActivity { } break; - + case Constant.VOID_STOP: + // TTS播放完成 + //changeVideo("bg"); + break; case Constant.ACTION_UPDATE_PROG2://后台下发节目通知,重置导视倒计时。 LoggerUtil.e(TAG,"重启导视倒计时"); leaveScreenSave(); break; } } + + //-------- + private void initASR(){ + if(mEngine == null){ + AICloudASRConfig config = new AICloudASRConfig(); + config.setLocalVadEnable(true); + config.setVadResource("vad_aihome_v0.11.bin"); + mEngine = AICloudASREngine.createInstance(); + aiCloudASRIntent = new AICloudASRIntent(); + aiCloudASRIntent.setEnablePunctuation(true); + aiCloudASRIntent.setRealback(true);//打开实时反馈功能 + aiCloudASRIntent.setResourceType("aihome"); + aiCloudASRIntent.setEnableNumberConvert(true);//设置启用识别结果汉字数字转阿拉伯数字功能 + aiCloudASRIntent.setWaitingTimeout(30000); //设置等待识别结果超时时长,默认5000ms + aiCloudASRIntent.setNoSpeechTimeOut(10000); + aiCloudASRIntent.setPauseTime(2000); + mEngine.init(config, new AIASRListenerImpl()); + } + } + + private class AIASRListenerImpl implements AIASRListener { + + public void onError(AIError error) { + LoggerUtil.e("ASRInit: ",error.getMessage()); + // 在非主线程中需要调用 WebView 方法时 + runOnUiThread(new Runnable() { + @Override + public void run() { + binding.web.evaluateJavascript("javascript: window.youAskOver('');", null); + } + }); + stopAsr(); + } + + public void onResults(AIResult results) { + LoggerUtil.e("ASRInit: ", String.valueOf(results.isLast())); + if (results.getResultType() == AIConstant.AIENGINE_MESSAGE_TYPE_JSON) { + JSONResultParser parser = new JSONResultParser((String) results.getResultObject()); + if("".equals(parser.getVar()) && !"".equals(parser.getText())){ + oldString = StringUtil.strSplice(oldString,parser.getText()); + } + if(!"".equals(parser.getVar())){ + voiceContent( StringUtil.strSplice(oldString,parser.getVar())); + } + } + } + + @Override + public void onInit(int status) { + if (status == AIConstant.OPT_SUCCESS) { + LoggerUtil.e("ASRInit: ","初始化成功!"); + } else { + LoggerUtil.e("ASRInit: ","初始化失败!code:" + status); + } + } + + @Override + public void onBeginningOfSpeech() { + //本地vad打开时,才会执行 + oldString=""; + LoggerUtil.e("ASRInit: ","onBeginningOfSpeech"); + } + + @Override + public void onNotOneShot() { + //do nothing + LoggerUtil.e("ASRInit: ","onNotOneShot"); + } + + @Override + public void onEndOfSpeech() { + //本地vad打开时,才会执行 + stopAsr(); + runOnUiThread(new Runnable() { + @Override + public void run() { + binding.web.evaluateJavascript("javascript: window.youAskOver('');", null); + } + }); + LoggerUtil.e("ASRInit: ","onEndOfSpeech"); + } + + @Override + public void onReadyForSpeech() { + oldString=""; + LoggerUtil.e("ASRInit: ","onReadyForSpeech"); + } + + @Override + public void onResultDataReceived(byte[] buffer, int size, int wakeupType) { + LoggerUtil.e("ASRInit: ","onReadyForSpeech "+String.valueOf(size)); + } + + @Override + public void onRmsChanged(float rmsdB) { + LoggerUtil.e("ASRInit: ", "" + rmsdB); + } + + @Override + public void onResultDataReceived(byte[] buffer, int size) { + //do nothing + } + + @Override + public void onRawDataReceived(byte[] buffer, int size) { + //do nothing + LoggerUtil.e("ASRInit: ","onRawDataReceived "+String.valueOf(size)); + } + + } + + private void stopAsr(){ + if(mEngine != null){ + mEngine.cancel(); + mEngine.stop(); + } + } } diff --git a/app/src/main/java/qianmu/container/app/Constant.java b/app/src/main/java/qianmu/container/app/Constant.java index f1f337a..6064032 100644 --- a/app/src/main/java/qianmu/container/app/Constant.java +++ b/app/src/main/java/qianmu/container/app/Constant.java @@ -22,6 +22,7 @@ public class Constant { public static String screenType = "HDMI"; // 欣威视通3399设备为假关机 HDMI连接:可以用来判断是否为关机状态 LVDS连接:只能用定时关机时间来判断 public static boolean newGuide = false; // 指路机类型,true:新版指路机 false:老板指路机(流花) public static String mqttState = ""; // 屏幕连接方式 + public static String TTSHome=""; // sbc-思必驰 public static String androidBoardType = ""; //设备板子型号 无固定版 // public static String androidBoardType = "ys"; // 设备板子型号 ys(亿晟) 北京颐堤港定制touch // public static String androidBoardType = "xwst"; //设备板子型号 xwst(欣威视通3399) @@ -33,6 +34,7 @@ public class Constant { // public static String androidBoardType = "bv"; //设备板子型号 Bv-3588M // public static String androidBoardType = "smt"; //设备板子型号 视美泰 + public static final String VOID_STOP = "void_stop";// public static String whoActivity = ""; // 哪个activity页面 // 本地缓存地址 public static final String CACHE_PATH = StringUtil.strSplice(Environment.getExternalStorageDirectory().getPath(), diff --git a/app/src/main/java/qianmu/container/app/MyApplication.java b/app/src/main/java/qianmu/container/app/MyApplication.java index 77bd9bb..307cc31 100644 --- a/app/src/main/java/qianmu/container/app/MyApplication.java +++ b/app/src/main/java/qianmu/container/app/MyApplication.java @@ -15,7 +15,8 @@ import com.alibaba.android.arouter.launcher.ARouter; import com.jakewharton.processphoenix.ProcessPhoenix; import com.lztek.toolkit.Lztek; import com.lzy.okgo.OkGo; - +import com.aispeech.DUILiteConfig; +import com.aispeech.DUILiteSDK; import java.io.PrintWriter; import java.io.StringWriter; import java.security.KeyStore; @@ -88,6 +89,7 @@ public class MyApplication extends Application { if (Constant.androidBoardType.equals("smt")) { smdt = SmdtManagerNew.getInstance(this); } + //记录当前activity registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @@ -118,6 +120,32 @@ public class MyApplication extends Application { @Override public void onActivityDestroyed(Activity activity) { } }); + if("sbc".equals(Constant.TTSHome)){ // 思必驰语音 + initSbcSDK(); + } + } + // 思必驰授权 + private void initSbcSDK(){ + // 产品认证需设置 apiKey, productId, productKey, productSecret + DUILiteConfig config = new DUILiteConfig.Builder() + .setApiKey("d823edab41b8d823edab41b868ecc552") + .setProductId("279632533") + .setProductKey("ab73065d16e11bcfac026eee3db9f6cb") + .setProductSecret("85d9490c438099acc33be7676799399f").create(); + + DUILiteSDK.init(getApplicationContext()); + // SDK 授权 + DUILiteSDK.doAuth(getApplicationContext(), config, new DUILiteSDK.InitListener() { + @Override + public void success() { + LoggerUtil.d("DUILiteSDKInit: ", "授权成功! "); + } + + @Override + public void error(String errorCode,String errorInfo) { + LoggerUtil.d("DUILiteSDKInit: ", "授权失败, errorcode: "+errorCode+",errorInfo:"+errorInfo); + } + }); } public Lztek getLztek() { diff --git a/app/src/main/java/qianmu/container/util/TTSUtil.java b/app/src/main/java/qianmu/container/util/TTSUtil.java new file mode 100644 index 0000000..8aa702d --- /dev/null +++ b/app/src/main/java/qianmu/container/util/TTSUtil.java @@ -0,0 +1,117 @@ +package qianmu.container.util; + + + +import android.util.Log; + +import com.aispeech.AIError; +import com.aispeech.common.AIConstant; +import com.aispeech.export.config.AICloudTTSConfig; +import com.aispeech.export.engines2.AICloudTTSEngine; +import com.aispeech.export.intent.AICloudTTSIntent; +import com.aispeech.export.listeners.AITTSListener; + +import org.greenrobot.eventbus.EventBus; +import org.json.JSONArray; + +import qianmu.container.app.Constant; +import qianmu.container.entity.MessageEvent; + +public class TTSUtil { + private static String TAG = "TTS: "; + // 语音合成对象 + private AICloudTTSEngine mEngine; + private AICloudTTSIntent intent; + + + public void initTts(){ + mEngine = AICloudTTSEngine.createInstance(); + AICloudTTSConfig config = new AICloudTTSConfig(); + config.setUseCache(false); + mEngine.init(config, new AITTSListener() { + @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) { + Log.e(TAG, "onError: " + utteranceId + "," + error.toString()); + EventBus.getDefault().post(new MessageEvent(Constant.VOID_STOP)); + } + + @Override + public void onReady(String utteranceId) { + Log.e(TAG, "onReady: " + utteranceId); + } + + @Override + public void onCompletion(String utteranceId) { + LoggerUtil.e(TAG, "onCompletion: " + utteranceId); + EventBus.getDefault().post(new MessageEvent(Constant.VOID_STOP)); + } + + @Override + public void onProgress(int currentTime, int totalTime, boolean isRefTextTTSFinished) { + } + + @Override + public void onSynthesizeStart(String utteranceId) { + } + + @Override + public void onSynthesizeDataArrived(String utteranceId, byte[] audioData) { + } + + @Override + public void onSynthesizeFinish(String utteranceId) { + } + + @Override + public void onTimestampReceived(byte[] bytes, int i) { + } + + @Override + public void onPhonemesDataArrived(String s, String s1) { + } + + @Override + public void onHighInfoReceived(JSONArray textArray, int curIndex, int curDuration, int curStart) { + Log.d("onHighInfoReceived", "textArray = " + textArray + ", curText="+textArray.optString(curIndex)+",duration = " + curDuration + ", curStart = " + curStart); + } + }); + + intent = new AICloudTTSIntent(); + intent.setSpeaker("qianranfv5"); + intent.setVolume("100"); + intent.setSpeed("0.8"); + intent.setTextType("text"); + intent.setSpeakingStyle("happy"); + intent.setHighLightInfo(false); + } + + //开始听写 + public void startTTs(String texts){ + if (null == mEngine) { + LoggerUtil.d(TAG, "未初始化"); + initTts(); + } + mEngine.speak(intent, texts, "1024"); + } + + //停止听写 + public void stopTTs(){ + LoggerUtil.d(TAG, "手动暂停播放"); + mEngine.stop(); + } + + + +} + +