[Fix]解决语音合成crash问题

原因:线程安全导致资源相关的String数组部分元素被置为null,而语音合成SDK遍历该String数组时没有判断元素是否为null,直接调用AssetManager.open()触发空指针异常而SDK只捕获了IO异常,导致Crash
This commit is contained in:
chenfufeng
2022-03-21 18:53:33 +08:00
committed by renwj
parent 1d28536cc5
commit 0dfd050e23

View File

@@ -18,13 +18,13 @@ import com.aispeech.export.config.AuthConfig;
import com.aispeech.export.config.EchoConfig; import com.aispeech.export.config.EchoConfig;
import com.aispeech.export.engines.AILocalTTSEngine; import com.aispeech.export.engines.AILocalTTSEngine;
import com.aispeech.export.intent.AILocalTTSIntent; import com.aispeech.export.intent.AILocalTTSIntent;
import com.aispeech.export.listeners.AILocalTTSListener;
import com.aispeech.export.listeners.AITTSListener; import com.aispeech.export.listeners.AITTSListener;
import com.aispeech.lite.AuthType; import com.aispeech.lite.AuthType;
import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.android.arouter.facade.annotation.Route;
import com.mogo.cloud.commons.BuildConfig; import com.mogo.cloud.commons.BuildConfig;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.ThreadUtils;
import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils;
import com.mogo.tts.base.IMogoTTS; import com.mogo.tts.base.IMogoTTS;
import com.mogo.tts.base.IMogoTTSCallback; import com.mogo.tts.base.IMogoTTSCallback;
@@ -59,27 +59,29 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList
private boolean mInitReady = true; private boolean mInitReady = true;
private Context mContext; private Context mContext;
public synchronized void release() { public void release() {
CallerLogger.INSTANCE.d(TAG, "release"); CallerLogger.INSTANCE.d(TAG, "release");
if (mCmdMap != null && !mCmdMap.isEmpty() && mVoiceClient != null) { ThreadUtils.runOnUiThread(() -> {
for (String cmd : mCmdMap.keySet()) { if (mCmdMap != null && !mCmdMap.isEmpty() && mVoiceClient != null) {
try { for (String cmd : mCmdMap.keySet()) {
mVoiceClient.unRegisterCustomWakeupCmd(cmd); try {
} catch (Exception e) { mVoiceClient.unRegisterCustomWakeupCmd(cmd);
e.printStackTrace(); } catch (Exception e) {
e.printStackTrace();
}
} }
} }
} mQAndAMap.clear();
mQAndAMap.clear(); mVoiceClient.release();
mVoiceClient.release(); if (mEngine != null) {
if (mEngine != null) { mEngine.destroy();
mEngine.destroy(); mEngine = null;
mEngine = null; }
} mHasAuth = false;
mHasAuth = false; mSpeakVoiceMap.clear();
mSpeakVoiceMap.clear(); mCacheUnWakeupCommands.clear();
mCacheUnWakeupCommands.clear(); mContext = null;
mContext = null; });
} }
private VoiceClient mVoiceClient; private VoiceClient mVoiceClient;
@@ -147,8 +149,10 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList
@Override @Override
public void success() { public void success() {
CallerLogger.INSTANCE.d(TAG, "授权成功"); CallerLogger.INSTANCE.d(TAG, "授权成功");
mHasAuth = true; ThreadUtils.runOnUiThread(() -> {
initTtsEngine(); mHasAuth = true;
initTtsEngine();
});
} }
@Override @Override
@@ -251,7 +255,7 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList
if (!mCmdMap.containsKey(cmd)) { if (!mCmdMap.containsKey(cmd)) {
return; return;
} }
CallerLogger.INSTANCE.d(TAG, "received command : " + cmd); CallerLogger.INSTANCE.d(TAG, "received command : " + cmd);
Iterator<IMogoTTSCallback> iterator = null; Iterator<IMogoTTSCallback> iterator = null;
try { try {
@@ -447,7 +451,7 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList
mVoiceClient.registerCustomWakeupCmd(cmd, cmdWords); mVoiceClient.registerCustomWakeupCmd(cmd, cmdWords);
mCacheUnWakeupCommands.remove(cmd); mCacheUnWakeupCommands.remove(cmd);
} }
CallerLogger.INSTANCE.i(TAG, "cache un wakeup command2. " + cmd); CallerLogger.INSTANCE.i(TAG, "cache un wakeup command2. " + cmd);
mCacheUnWakeupCommands.put(cmd, cmdWords); mCacheUnWakeupCommands.put(cmd, cmdWords);
} }
@@ -463,7 +467,7 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList
mVoiceClient.registerCustomWakeupCmd(cmd, cmdWords); mVoiceClient.registerCustomWakeupCmd(cmd, cmdWords);
mCacheUnWakeupCommands.remove(cmd); mCacheUnWakeupCommands.remove(cmd);
} }
CallerLogger.INSTANCE.i(TAG, "cache un wakeup command. " + cmd); CallerLogger.INSTANCE.i(TAG, "cache un wakeup command. " + cmd);
mCacheUnWakeupCommands.put(cmd, cmdWords); mCacheUnWakeupCommands.put(cmd, cmdWords);
} }
@@ -514,7 +518,7 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList
* @param status window_start_cancel 0 - 结束, 1 - 显示, 2 - 未激活调试进入 * @param status window_start_cancel 0 - 结束, 1 - 显示, 2 - 未激活调试进入
*/ */
public static void startAssistant(Context context, int status) { public static void startAssistant(Context context, int status) {
CallerLogger.INSTANCE.w(TAG, "startAssistant status = " + status); CallerLogger.INSTANCE.w(TAG, "startAssistant status = " + status);
final Intent intent = new Intent(); final Intent intent = new Intent();
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);