開通賬戶
在訊飛開發(fā)者平臺上注冊申請賬戶,并且創(chuàng)建自己的應用晚伙,為自己的應用添加語音合成服務
SDK下載以及導入
- 根據選擇的服務豪硅,下載官方的SDK
- 將Sample項目中的Msc.jar以及Sunflower.jar放到目錄libs下值桩,將資源文件arm64-v8a等文件夾(里面是libmsc.so)放到jniLibs文件夾下
添加權限說明
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
創(chuàng)建MyApplication文件
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//初始化sdk,appid是你創(chuàng)建應用時删窒,科大訊飛給的唯一的id
SpeechUtility.createUtility(MyApplication.this,"appid="+你的APPID);
SpeakerUtil.init(this);
}
}
在AndroidManifest.Xml文件中配置自己的MyApplication
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
···
###創(chuàng)建自己的語音助手類
public class SpeakerUtil {
// 語音合成對象
private static SpeechSynthesizer speechSynthesizer;
// 語記安裝助手類
private static ApkInstaller apkInstaller;
/**
*
* 引擎類型:
* 1. 如果是SpeechConstant.TYPE_CLOUD,代表是采用云端語音合成
* 2. 如果是SpeechConstant.TYPE_LOCAL,代表是采用本地語音合成裂垦,需要下載一個訊飛語音助手
*
*/
private static final String mEngineType = SpeechConstant.TYPE_CLOUD;
//發(fā)音人
private static final String voiceName = "xiaoyan";
/**
* 初始化工作
*
* @param context the context
*/
public static void init(Context context) {
if (speechSynthesizer != null) {
speechSynthesizer.resumeSpeaking();
return;
}
// 初始化合成對象
speechSynthesizer = SpeechSynthesizer.createSynthesizer(context,
mTtsInitListener);
}
/**
* 調用此函數,合成語音
*
* @param activity the activity
* @param text the text
*/
public static void startSpeaking(Activity activity, String text) {
init(activity);
int code = speechSynthesizer.startSpeaking(text, null);
if (code != ErrorCode.SUCCESS) {
if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) {
// 未安裝則跳轉到提示安裝頁面
if (apkInstaller == null) {
apkInstaller = new ApkInstaller();
}
apkInstaller.install(activity);
} else {
Log.e("SpeechSynthesizer", "======語音合成失敗 code=" + code);
}
}
}
/**
*
* 初始化回調監(jiān)聽
*
**/
private static InitListener mTtsInitListener = new InitListener() {
@Override
public void onInit(int code) {
if (code != ErrorCode.SUCCESS) {
Log.e("SpeechSynthesizer", "======初始化失敗,錯誤碼 code=" + code);
} else {
setParam();
}
}
};
/**
*
* 設置云端參數
*
* */
private static void setParam(){
// 清空參數
speechSynthesizer.setParameter(SpeechConstant.PARAMS, null);
// 根據合成引擎設置相應參數
if(mEngineType.equals(SpeechConstant.TYPE_CLOUD)) {
speechSynthesizer.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
// 設置在線合成發(fā)音人
speechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, voiceName);
//設置合成語速
speechSynthesizer.setParameter(SpeechConstant.SPEED, "30");//mSharedPreferences.getString("speed_preference", "50")
//設置合成音調
speechSynthesizer.setParameter(SpeechConstant.PITCH, "50");//mSharedPreferences.getString("pitch_preference", "50")
//設置合成音量
speechSynthesizer.setParameter(SpeechConstant.VOLUME, "50");//mSharedPreferences.getString("volume_preference", "50")
}else {
speechSynthesizer.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);
// 設置本地合成發(fā)音人 voicer為空肌索,默認通過語記界面指定發(fā)音人蕉拢。
speechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, "");
//本地合成不設置語速、音調诚亚、音量晕换,默認使用語記設置,開發(fā)者如需自定義參數,請參考在線合成參數設置
}
//設置播放器音頻流類型
speechSynthesizer.setParameter(SpeechConstant.STREAM_TYPE,"3");// mSharedPreferences.getString("stream_preference", "3")
// 設置播放合成音頻打斷音樂播放站宗,默認為true
speechSynthesizer.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");
// 設置音頻保存路徑闸准,保存音頻格式支持pcm、wav梢灭,設置路徑為sd卡請注意WRITE_EXTERNAL_STORAGE權限
// 注:AUDIO_FORMAT參數語記需要更新版本才能生效
speechSynthesizer.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
speechSynthesizer.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/tts.wav");
}
/**
* 銷毀掉第一個
*/
public static void onDestroy() {
if (speechSynthesizer == null)
return;
speechSynthesizer.stopSpeaking();
// 退出時釋放連接
speechSynthesizer.destroy();
}
本地語音合成和云端語音合成
本地語音合成需要下載訊飛語記才可以用夷家,云端合成不需要
可通過如下變量設置成自己需要的方式
注:云端語音不是很清晰
private static final String mEngineType = SpeechConstant.TYPE_CLOUD;
調用方法
public class MainActivity extends AppCompatActivity {
private TextView btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (TextView)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SpeakerUtil.startSpeaking(MainActivity.this, "歡迎您");
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
SpeakerUtil.onDestroy();
}
}
趕緊試一下吧