@ -2,6 +2,7 @@ package cn.com.motse.iflytek_speech_demo;
import android.Manifest ;
import android.annotation.SuppressLint ;
import android.app.Activity ;
import android.content.Context ;
import android.content.pm.PackageManager ;
@ -24,12 +25,15 @@ import java.util.LinkedHashMap;
import java.util.Map ;
import com.iflytek.cloud.GrammarListener ;
import com.iflytek.cloud.InitListener ;
import com.iflytek.cloud.SpeechConstant ;
import com.iflytek.cloud.ErrorCode ;
import com.iflytek.cloud.SpeechError ;
import com.iflytek.cloud.SpeechEvent ;
import com.iflytek.cloud.SpeechRecognizer ;
import com.iflytek.cloud.SpeechSynthesizer ;
import com.iflytek.cloud.SpeechUtility ;
import com.iflytek.cloud.SynthesizerListener ;
import com.iflytek.cloud.VoiceWakeuper ;
import com.iflytek.cloud.WakeuperListener ;
import com.iflytek.cloud.WakeuperResult ;
@ -71,12 +75,19 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
private VoiceWakeuper mIvw ;
// 语音识别对象
private SpeechRecognizer mAsr ;
// 语音合成对象
private SpeechSynthesizer mTts ;
// -----唤醒识别参数-----
// 唤醒门限值 : 门限值越低越容易被唤醒 [0-3000]
private final int curThresh = 1450 ;
private final String mEngineType = SpeechConstant . TYPE_LOCAL ;
// 唤醒结果内容
private String resultString ;
// 识别结果内容
private String recoString ;
// -----语法参数-----
// 本地语法id
private String mLocalGrammarID ;
// 本地语法文件
@ -84,12 +95,17 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
// 本地语法构建路径
private String grmPath ;
// 设置门限值 : 门限值越低越容易被唤醒 [0-3000]
private final int curThresh = 1450 ;
// ------合成参数-----
// 默认本地发音人
public static String voicerLocal = " xiaoyan " ;
//缓冲进度
private int mPercentForBuffering = 0 ;
//播放进度
private int mPercentForPlaying = 0 ;
// -----语音识别对象参数-----
private final String mEngineType = SpeechConstant . TYPE_LOCAL ;
private final String resultType = " json " ;
private Toast mToast ;
/*
@ -160,14 +176,26 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
case " init " :
initSpeechUtility ( call , result ) ;
break ;
case " s tart" :
s tart( call , result ) ;
case " wakeupS tart" :
wakeupS tart( call , result ) ;
break ;
case " s top" :
s top( call , result ) ;
case " wakeupS top" :
wakeupS top( call , result ) ;
break ;
case " c ancel" :
c ancel( call , result ) ;
case " wakeupC ancel" :
wakeupC ancel( call , result ) ;
break ;
case " ttsStart " :
ttsStart ( call , result ) ;
break ;
case " ttsCancel " :
ttsCancel ( call , result ) ;
break ;
case " ttsPause " :
ttsPause ( call , result ) ;
break ;
case " ttsResume " :
ttsResume ( call , result ) ;
break ;
default :
result . notImplemented ( ) ;
@ -179,10 +207,18 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
channel . setMethodCallHandler ( null ) ;
// 退出释放连接
if ( null ! = mIvw ) {
mIvw . cancel ( ) ;
mIvw . destroy ( ) ;
}
if ( null ! = mAsr ) {
mAsr . cancel ( ) ;
mAsr . destroy ( ) ;
}
if ( null ! = mTts ) {
mTts . stopSpeaking ( ) ;
mTts . destroy ( ) ;
}
}
/*
@ -202,14 +238,15 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
// 注意: 此接口在非主进程调用会返回null对象, 如需在非主进程使用语音功能, 请增加参数: SpeechConstant.FORCE_LOGIN+"=true"
SpeechUtility . createUtility ( mActivity . get ( ) , SpeechConstant . APPID + '=' + appId ) ;
final ResultStateful resultStateful = ResultStateful . of ( result ) ;
Log . d ( TAG , " ResultStateful.of(result); ++++++++++++++ appId = " + appId ) ;
// 获取语法路径
grmPath = mActivity . get ( ) . getExternalFilesDir ( " msc " ) . getAbsolutePath ( ) + " /test " ;
// 2. 初始化唤醒对象
// InitListener参数用lambda语句简化
mIvw = VoiceWakeuper . createWakeuper ( mActivity . get ( ) , code - > {
Log . d ( TAG , " VoiceWakeuper init() code = " + code ) ;
if ( code = = ErrorCode . SUCCESS ) {
Log . d ( TAG , " VoiceWakeuper init() code = " + code ) ;
resultStateful . success ( 0 ) ;
} else {
Log . d ( " TAG " , " 唤醒对象初始化失败,错误码: " + code ) ;
@ -219,9 +256,8 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
// 3. 初始化识别对象
mAsr = SpeechRecognizer . createRecognizer ( mActivity . get ( ) , code - > {
Log . d ( TAG , " SpeechRecognizer init() code = " + code ) ;
if ( code = = ErrorCode . SUCCESS ) {
Log . d ( TAG , " SpeechRecognizer init() code = " + code ) ;
resultStateful . success ( 0 ) ;
} else {
Log . d ( " TAG " , " 识别对象初始化失败,错误码: " + code ) ;
@ -232,8 +268,32 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
// 4. 初始化语法文件
mLocalGrammar = readFile ( mActivity . get ( ) , " query.bnf " , " utf-8 " ) ;
// 5. 参数配置
setParam ( ) ;
// 5. 初始化合成对象
mTts = SpeechSynthesizer . createSynthesizer ( mActivity . get ( ) , code - > {
Log . d ( TAG , " SpeechSynthesizer init() code = " + code ) ;
if ( code = = ErrorCode . SUCCESS ) {
// 初始化成功, 之后可以调用startSpeaking方法
// 注: 有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,
// 正确的做法是将onCreate中的startSpeaking调用移至这里
resultStateful . success ( 0 ) ;
} else {
Log . d ( " TAG " , " 合成对象初始化失败,错误码: " + code ) ;
resultStateful . error ( " 合成对象初始化失败: " , " " + code , null ) ;
}
} ) ;
// 6. 参数配置
setTtsParam ( ) ;
setAsrParam ( ) ;
// 开始构建语法
int ret = 0 ;
ret = mAsr . buildGrammar ( " bnf " , mLocalGrammar , grammarListener ) ;
if ( ret ! = ErrorCode . SUCCESS ) {
Log . d ( TAG , " mAsr.buildGrammar语法构建失败,错误码: " + ret ) ;
Toast . makeText ( mActivity . get ( ) , " 语法构建失败,错误码: " + ret , Toast . LENGTH_SHORT ) . show ( ) ;
}
// 非空判断,防止因空指针使程序崩溃
mIvw = VoiceWakeuper . getWakeuper ( ) ;
@ -253,7 +313,7 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
* 示例demo默认设置第一个唤醒词, 建议开发者根据定制资源中唤醒词个数进行设置
*/
mIvw . setParameter ( SpeechConstant . IVW_THRESHOLD , " 0: " + curThresh ) ;
// 设置唤醒+识别模式
// 唤醒服务类型: 设置唤醒+识别模式
mIvw . setParameter ( SpeechConstant . IVW_SST , " oneshot " ) ;
// 设置返回结果格式
mIvw . setParameter ( SpeechConstant . RESULT_TYPE , " json " ) ;
@ -268,24 +328,17 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
mActivity . get ( ) . getExternalFilesDir ( " msc " ) . getAbsolutePath ( ) + " /ivw.wav " ) ;
mIvw . setParameter ( SpeechConstant . AUDIO_FORMAT , " wav " ) ;
// 开始构建 语法
int ret = 0 ;
ret = mAsr . buildGrammar ( " bnf " , mLocalGrammar , grammarListener ) ;
if ( ret ! = ErrorCode . SUCCESS ) {
Toast . makeText ( mActivity . get ( ) , " 语法构建失败,错误码: " + ret , Toast . LENGTH_SHORT ) . show ( ) ;
}
//
// 语法构建成功,则唤醒对象调用 语法
if ( ! TextUtils . isEmpty ( mLocalGrammarID ) ) {
// 设置本地识别资源
mIvw . setParameter ( ResourceUtil . ASR_RES_PATH , getResourcePath ( ) ) ;
// 设置语法构建路径
mIvw . setParameter ( ResourceUtil . GRM_BUILD_PATH , grmPath ) ;
// 设置本地识别使用语法id
mIvw . setParameter ( SpeechConstant . LOCAL_GRAMMAR ,
mLocalGrammarID ) ;
Log . d ( TAG , " mLocalGrammarID 287: " + mLocalGrammarID ) ;
mIvw. startListening( mWakeuperListener) ;
mIvw . setParameter ( SpeechConstant . LOCAL_GRAMMAR , mLocalGrammarID ) ;
// 启动唤醒监听
// mIvw. startListening( mWakeuperListener) ;
} else {
Toast . makeText ( mActivity . get ( ) , " 请先构建语法 " , Toast . LENGTH_SHORT ) . show ( ) ;
}
@ -298,9 +351,8 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
} ) ;
}
private void s tart( @NonNull MethodCall call , @NonNull Result result ) {
// 是否有视图的参数
// final Boolean haveView = call.argument("haveView");
private void wakeupS tart( @NonNull MethodCall call , @NonNull Result result ) {
if ( mActivity = = null ) {
Log . e ( TAG , " Ignored start, current activity is null. " ) ;
result . error ( " Ignored start, current activity is null. " , null , null ) ;
@ -308,8 +360,6 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
String [ ] permissions = {
Manifest . permission . RECORD_AUDIO ,
// Manifest.permission.ACCESS_NETWORK_STATE,
// Manifest.permission.INTERNET,
Manifest . permission . WRITE_EXTERNAL_STORAGE ,
Manifest . permission . READ_EXTERNAL_STORAGE
} ;
@ -326,33 +376,100 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
ActivityCompat . requestPermissions ( mActivity . get ( ) , toApplyList . toArray ( tmpList ) , REQUEST_CODE ) ;
result . error ( " request permissons. " , null , null ) ;
} else {
Log . d ( TAG , " int ret = mAsr.startListening(mRecognizerListener) 328 " ) ;
// 如果flutter层传入参数haveView
int ret = mAsr . startListening ( mRecognizerListener ) ;
Log . d ( TAG , " start WakeuperListener............ " ) ;
// 启动唤醒监听
int ret = mIvw . startListening ( mWakeuperListener ) ;
if ( ret ! = ErrorCode . SUCCESS ) {
result . error ( " start listen error " , " " + ret , null ) ;
result . error ( " start wakeup listen error " , " " + ret , null ) ;
} else {
result . success ( 0 ) ;
}
}
}
private void s top( @NonNull MethodCall call , @NonNull Result result ) {
if ( mAsr ! = null ) {
mAsr . stopListening ( ) ;
private void wakeupS top( @NonNull MethodCall call , @NonNull Result result ) {
if ( mIvw ! = null ) {
mIvw . stopListening ( ) ;
}
}
private void c ancel( @NonNull MethodCall call , @NonNull Result result ) {
if ( mAsr ! = null ) {
mAsr . cancel ( ) ;
private void wakeupC ancel( @NonNull MethodCall call , @NonNull Result result ) {
if ( mIvw ! = null ) {
mIvw . cancel ( ) ;
}
}
private void ttsStart ( @NonNull MethodCall call , @NonNull Result result ) {
String text = call . argument ( " ttsText " ) ;
if ( mActivity = = null ) {
Log . e ( TAG , " Ignored start, current activity is null. " ) ;
result . error ( " Ignored start, current activity is null. " , null , null ) ;
}
Log . d ( TAG , " start TtsListener............ " ) ;
Log . d ( TAG , " 我想要合成的文本: " + text ) ;
// 启动合成监听
int ret = mTts . startSpeaking ( text , mTtsListener ) ;
if ( ret ! = ErrorCode . SUCCESS ) {
result . error ( " start tts listen error " , " " + ret , null ) ;
} else {
result . success ( 0 ) ;
}
// String[] permissions = {
// Manifest.permission.RECORD_AUDIO,
// Manifest.permission.WRITE_EXTERNAL_STORAGE,
// Manifest.permission.READ_EXTERNAL_STORAGE
// };
//
// ArrayList<String> toApplyList = new ArrayList<String>();
// for (String perm :permissions){
// if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(mActivity.get(), perm)) {
// toApplyList.add(perm);
// }
// }
//
// String[] tmpList = new String[toApplyList.size()];
// if (!toApplyList.isEmpty()){
// ActivityCompat.requestPermissions(mActivity.get(), toApplyList.toArray(tmpList), REQUEST_CODE);
// result.error("request permissons.", null, null);
// } else {
// Log.d(TAG, "start TtsListener............");
//
// // 启动合成监听
// int ret = mTts.startSpeaking(text, mTtsListener);
// if (ret != ErrorCode.SUCCESS) {
// result.error("start tts listen error", ""+ret, null);
// } else {
// result.success(0);
// }
// }
}
private void ttsCancel ( @NonNull MethodCall call , @NonNull Result result ) {
if ( mTts ! = null ) {
mTts . stopSpeaking ( ) ;
}
}
private void ttsPause ( @NonNull MethodCall call , @NonNull Result result ) {
if ( mTts ! = null ) {
mTts . pauseSpeaking ( ) ;
}
}
private void ttsResume ( @NonNull MethodCall call , @NonNull Result result ) {
if ( mTts ! = null ) {
mTts . resumeSpeaking ( ) ;
}
}
/*
* 语音识别回调 ★★★★★
* */
private final RecognizerListener mRecognizerListener = new RecognizerListener( ) {
/* private final RecognizerListener mRecognizerListener = new RecognizerListener() {
@Override
public void onVolumeChanged(int volume, byte[] data) {
Log.d(TAG, "返回音频数据:"+ data.length);
@ -390,6 +507,7 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
@Override
public void onError(SpeechError speechError) {
Log.d(TAG, "++++++++++++SpeechError: " + speechError.getPlainDescription(true));
// 错误码: 10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
Map ret = new HashMap();
ret.put("error 395:", speechError.getPlainDescription(true));
@ -405,7 +523,7 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
// Log.d(TAG, "session id =" + sid);
// }
}
} ;
};*/
/*
* 语法构建回调
@ -424,7 +542,7 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
} ;
/*
* 唤醒回调
* 唤醒回调 ★★★★★
* */
private WakeuperListener mWakeuperListener = new WakeuperListener ( ) {
@ -452,18 +570,22 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
e . printStackTrace ( ) ;
}
// 结果返回给flutter层
//todo
// textView.setText(resultString);
channel . invokeMethod ( " onReceiveSpeechText " , resultString ) ;
}
@Override
public void onError ( SpeechError error ) {
// Log.d(TAG, "唤醒回调错误: " + error. getPlainDescription(true)) ;
Toast . makeText ( mActivity . get ( ) , " 唤醒回调错误: " + error . getPlainDescription ( true ) , Toast . LENGTH_SHORT ) . show ( ) ;
Log . d ( TAG , " 唤醒监听-----------------回调错误: " + error . getPlainDescription( true ) ) ;
// 错误码: 10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
Map ret = new HashMap ( ) ;
ret . put ( " 唤醒监听error: " , error . getPlainDescription ( true ) ) ;
channel . invokeMethod ( " onReceiveSpeechText " , ret ) ;
}
@Override
public void onBeginOfSpeech ( ) {
Log . d ( TAG , " 唤醒监听--------------开始说话 " ) ;
Toast . makeText ( mActivity . get ( ) , " 开始说话 " , Toast . LENGTH_SHORT ) . show ( ) ;
}
@ -483,38 +605,97 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
@Override
public void onVolumeChanged ( int volume ) {
// TODO Auto-generated method stub
Log . d ( TAG , " 唤醒监听--------------音量变化: " + volume ) ;
}
} ;
/*
* 合成回调
* */
private SynthesizerListener mTtsListener = new SynthesizerListener ( ) {
@Override
public void onSpeakBegin ( ) {
//showTip("开始播放");
Log . d ( TAG , " 开始播放: " + System . currentTimeMillis ( ) ) ;
}
@Override
public void onSpeakPaused ( ) {
showTip ( " 暂停播放 " ) ;
}
@Override
public void onSpeakResumed ( ) {
showTip ( " 继续播放 " ) ;
}
@SuppressLint ( " DefaultLocale " )
@Override
public void onBufferProgress ( int percent , int beginPos , int endPos , String info ) {
// 合成进度
mPercentForBuffering = percent ;
showTip ( String . format ( " 缓冲进度为%d%%,播放进度为%d%% " , mPercentForBuffering , mPercentForPlaying ) ) ;
}
@SuppressLint ( " DefaultLocale " )
@Override
public void onSpeakProgress ( int percent , int beginPos , int endPos ) {
// 播放进度
mPercentForPlaying = percent ;
showTip ( String . format ( " 缓冲进度为%d%%,播放进度为%d%% " , mPercentForBuffering , mPercentForPlaying ) ) ;
}
@Override
public void onCompleted ( SpeechError error ) {
if ( error = = null ) {
showTip ( " 播放完成 " ) ;
} else {
showTip ( error . getPlainDescription ( true ) ) ;
}
}
@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_AUDIO_URL);
Log.d(TAG, "session id =" + sid);
}*/
//实时音频流输出参考
/*if (SpeechEvent.EVENT_TTS_BUFFER == eventType) {
byte[] buf = obj.getByteArray(SpeechEvent.KEY_EVENT_TTS_BUFFER);
Log.e("MscSpeechLog", "buf is =" + buf);
}*/
}
} ;
/**
* 配置识别对象参数
*/
public void setParam ( ) {
public void setAsr Param ( ) {
// 清空参数
mAsr . setParameter ( SpeechConstant . PARAMS , null ) ;
// 离线听写设置: ENGINE_TYPE、RESULT_TYPE、ASR_RES_PATH、LANGUAGE、ACCENT、ASR_PTT、VAD_BOS、VAD_EOS
// 离线命令词识别设置: ENGINE_TYPE、RESULT_TYPE、ASR_THRESHOLD、GRM_BUILD_PATH、ASR_RES_PATH
// 设置听写引擎
mAsr . setParameter ( SpeechConstant . TEXT_ENCODING , " utf-8 " ) ;
mAsr . setParameter ( SpeechConstant . ENGINE_TYPE , mEngineType ) ;
// 设置返回结果格式
mAsr . setParameter ( SpeechConstant . RESULT_TYPE , resultType ) ;
mAsr . setParameter ( SpeechConstant . RESULT_TYPE , " json " ) ;
// 设置语法构建路径
mAsr . setParameter ( ResourceUtil . GRM_BUILD_PATH , grmPath ) ;
Log . d ( TAG , " grmPath 512: " + grmPath ) ;
// 设置资源路径
mAsr . setParameter ( ResourceUtil . ASR_RES_PATH , getResourcePath ( ) ) ;
Log . d ( TAG , " getResourcePath() 516: " + getResourcePath ( ) ) ;
//此处用于设置dialog中不显示错误码信息
//mIat.setParameter("view_tips_plain","false");
@ -530,7 +711,7 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
mAsr . setParameter ( SpeechConstant . VAD_EOS , " 2000 " ) ;
// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
mAsr . setParameter ( SpeechConstant . ASR_PTT , " 0 " ) ;
mAsr . setParameter ( SpeechConstant . ASR_PTT , " 1 " ) ;
Log . d ( TAG , " grmPath ++++++++: " + grmPath ) ;
@ -540,6 +721,33 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
//mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/iat.wav");
}
/*
* 配置合成对象参数
* */
public void setTtsParam ( ) {
// 清空参数
mTts . setParameter ( SpeechConstant . PARAMS , null ) ;
//设置使用本地引擎
mTts . setParameter ( SpeechConstant . ENGINE_TYPE , SpeechConstant . TYPE_LOCAL ) ;
//设置发音人资源路径
mTts . setParameter ( ResourceUtil . TTS_RES_PATH , getTtsResourcePath ( ) ) ;
//设置发音人
mTts . setParameter ( SpeechConstant . VOICE_NAME , voicerLocal ) ;
//设置合成语速
mTts . setParameter ( SpeechConstant . SPEED , " 50 " ) ;
//设置合成音调
mTts . setParameter ( SpeechConstant . PITCH , " 50 " ) ;
//设置合成音量
mTts . setParameter ( SpeechConstant . VOLUME , " 50 " ) ;
//设置播放器音频流类型
mTts . setParameter ( SpeechConstant . STREAM_TYPE , " 3 " ) ;
// 设置播放合成音频打断音乐播放, 默认为true
mTts . setParameter ( SpeechConstant . KEY_REQUEST_FOCUS , " true " ) ;
// 设置音频保存路径, 保存音频格式支持pcm、wav, 设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
mTts . setParameter ( SpeechConstant . AUDIO_FORMAT , " wav " ) ;
mTts . setParameter ( SpeechConstant . TTS_AUDIO_PATH , mActivity . get ( ) . getExternalFilesDir ( " msc " ) . getAbsolutePath ( ) + " /tts.wav " ) ;
}
/**
* 读取asset目录下文件
* @return content
@ -569,9 +777,24 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
// 识别通用资源
tempBuffer . append ( ResourceUtil . generateResourcePath ( mActivity . get ( ) ,
ResourceUtil . RESOURCE_TYPE . assets , " asr/common.jet " ) ) ;
Log . d ( TAG , " getResourcePath: " + ResourceUtil . RESOURCE_TYPE . assets + " asr/common.jet " ) ;
return tempBuffer . toString ( ) ;
}
/*
* 获取发音人资源路径
* */
private String getTtsResourcePath ( ) {
StringBuffer tempBuffer = new StringBuffer ( ) ;
String type = " tts " ;
//合成通用资源
tempBuffer . append ( ResourceUtil . generateResourcePath ( mActivity . get ( ) , ResourceUtil . RESOURCE_TYPE . assets , type + " /common.jet " ) ) ;
tempBuffer . append ( " ; " ) ;
//发音人资源
tempBuffer . append ( ResourceUtil . generateResourcePath ( mActivity . get ( ) , ResourceUtil . RESOURCE_TYPE . assets , type + " / " + voicerLocal + " .jet " ) ) ;
return tempBuffer . toString ( ) ;
}
/*
* 格式化输出结果
* */
@ -599,4 +822,17 @@ public class IflytekSpeechDemoPlugin implements FlutterPlugin, MethodCallHandler
return resultBuffer . toString ( ) ;
}
/*
* 屏幕打印结果
* */
private void showTip ( final String str ) {
mActivity . get ( ) . runOnUiThread ( ( ) - > {
if ( mToast ! = null ) {
mToast . cancel ( ) ;
}
mToast = Toast . makeText ( mActivity . get ( ) . getApplicationContext ( ) , str , Toast . LENGTH_SHORT ) ;
mToast . show ( ) ;
} ) ;
}
}