package com.xunfei; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.media.AudioManager; import android.os.Bundle; import android.os.Environment; import android.widget.Toast; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.iflytek.cloud.ErrorCode; import com.iflytek.cloud.InitListener; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechError; import com.iflytek.cloud.SpeechRecognizer; import com.iflytek.cloud.SpeechSynthesizer; import com.iflytek.cloud.SpeechUtility; import com.iflytek.cloud.SynthesizerListener; import com.iflytek.cloud.util.ResourceUtil; /** * Created by haoxinlei on 2018/3/20. */ public class XunFeiMoudle extends ReactContextBaseJavaModule { private static SpeechSynthesizer mTts; private static Context mContext; private ReactContext rctContext; public XunFeiMoudle(final ReactApplicationContext reactContext) { super(reactContext); rctContext = reactContext; } @Override public String getName() { return "XunFeiAndroid"; } public static void init(final Context context) { mContext = context; SpeechUtility.createUtility(context, SpeechConstant.APPID + "=" + getMetaData("XUNFEI_ID")); mTts = getSpeechSynthesizer(context); } public static SpeechSynthesizer getSpeechSynthesizer(final Context context){ return SpeechSynthesizer.createSynthesizer(context, new InitListener() { @Override public void onInit(int i) { if (i != ErrorCode.SUCCESS) { Toast.makeText(context, "语音播报初始化失败", Toast.LENGTH_SHORT).show(); } else { setParam(); } } }); } private static void setParam() { // 清空参数 mTts.setParameter(SpeechConstant.PARAMS, null); //设置合成 //设置使用本地引擎 mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL); //设置发音人资源路径 mTts.setParameter(ResourceUtil.TTS_RES_PATH, getResourcePath()); //设置合成语速 mTts.setParameter(SpeechConstant.SPEED, "50"); //设置合成音调 mTts.setParameter(SpeechConstant.PITCH, "50"); //设置合成音量 mTts.setParameter(SpeechConstant.VOLUME, "50"); //设置播放器音频流类型 mTts.setParameter(SpeechConstant.STREAM_TYPE, String.valueOf(AudioManager.STREAM_MUSIC)); // 设置播放合成音频打断音乐播放,默认为true mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true"); // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限 // 注:AUDIO_FORMAT参数语记需要更新版本才能生效 mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav"); mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/tts.wav"); } //获取发音人资源路径 private static String getResourcePath() { StringBuffer tempBuffer = new StringBuffer(); //合成通用资源 tempBuffer.append(ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "tts/common.jet")); tempBuffer.append(";"); //发音人资源 tempBuffer.append(ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "tts/" + "xiaoyan.jet")); return tempBuffer.toString(); } public static String getMetaData(String key) { try { ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo(mContext.getPackageName(), PackageManager.GET_META_DATA); return applicationInfo.metaData.getString(key); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return ""; } @ReactMethod public void textToSpeech(final String text) { if (mTts!=null){ mTts.startSpeaking(text, null); }else { mTts = getSpeechSynthesizer(mContext); mTts.startSpeaking(text,null); } } }