上回分解,拍立知其中一個功能就是利用文字轉成語音再播放出來,這期寫一下如何使用。
(在開始之前,強烈建議仔細閱讀 百度語音-語音合成-SDK開發文檔 能減少90%開發時候遇到的問題。 )
(結合官方demo閱讀效果更佳 )
首先,從百度ai上download下百度tts的sdk包(http://ai.baidu.com/sdk)。
下載解壓後是個完整的工程,裏面已經有幾個完整的demo了,而且介紹也是十分的詳細,操作之前可以都嘗試一下有什麼效果。
SynthActivity: 合成demo。含在線和離線,沒有純離線功能。 根據網絡狀況優先走在線,在線時訪問服務器失敗後轉爲離線。
MiniActivity:精簡版合成。
SaveFileActivity :保存合成後的音頻。
接下來先看一下我的項目文件,control、listener、util三個文件夾可以在 百度tts語音合成示例中找到,移植過來這邊,還有一個MainHandlerConstant文件。(根據你們的實際要求適當增減,這個是以我的示例爲例)
三個Activity就是主要的工程文件,MainActivity是進入界面後的處理,startActivity是進入的旋轉頁面,ViewActiviy作爲主界面的跳轉。
接下來介紹MainActivity裏面實現功能,首先從頁面看起,頁面佈局如下:
百度tts語音合成用武之地就在語音播放這裏。
我們看一下百度tts語音合成MainActivity位於的設計:
一、首先定義必要的調用信息:
protected String appId = "你的百度appId";
protected String appKey = "你的百度appKey ";
protected String secretKey = "你的百度secretKey";
private TtsMode ttsMode = TtsMode.ONLINE;//設置TTS模式,這是僅在線
protected SpeechSynthesizer mSpeechSynthesizer;//初始化SpeechSynthesizer
String Speck_TEXT="尚未有識別項目,請識別後點擊。";//這個是保存Text顯示的內容
private Button mSpeak;//這些控件可以自行定義,還有一些就不全部展示
private Button mStop;
private TextView mShowText;
二、精簡其函數(這裏我只用了在線的模式,所以大部分代碼可以裁剪)
這個初始化的initTTs函數(在onCreate裏面初始化一下),好像音量(男/女)、聲音、語速這些,在https://ai.baidu.com/docs#/TTS-Android-SDK/top下有詳細的變量解釋。
private void initTTs() {
LoggerProxy.printable(true);
SpeechSynthesizerListener listener = new UiMessageListener(mainHandler);
// 1. 獲取實例
mSpeechSynthesizer = SpeechSynthesizer.getInstance();
mSpeechSynthesizer.setContext(this);
// 2. 設置listener
mSpeechSynthesizer.setSpeechSynthesizerListener(listener);
// 3. 設置appId,appKey.secretKey
int result = mSpeechSynthesizer.setAppId(appId);
checkResult(result, "setAppId");
result = mSpeechSynthesizer.setApiKey(appKey, secretKey);
checkResult(result, "setApiKey");
mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "3");
// 設置合成的音量,0-9 ,默認 5
mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "9");
// 設置合成的語速,0-9 ,默認 5
mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "3");
// 設置合成的語調,0-9 ,默認 5
mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");
mSpeechSynthesizer.setAudioStreamType(AudioManager.MODE_IN_CALL);
Map<String, String> params = new HashMap<>();
InitConfig initConfig = new InitConfig(appId, appKey, secretKey, ttsMode, params, listener);
result = mSpeechSynthesizer.initTts(ttsMode);
checkResult(result, "initTts");
}
一個speak(),一個stop()定義事件。
private void speak() {
if (mSpeechSynthesizer == null) {
print("[ERROR], 初始化失敗");
return;
}
mShowText.setText("");
mShowText.setText(Speck_TEXT);
Toast.makeText(getApplicationContext(),"正在連接播放...請稍等",Toast.LENGTH_LONG).show();
int result = mSpeechSynthesizer.speak("播放開始"+Speck_TEXT+"語音播放播放完成");//speak 在這
checkResult(result, "speak");//獲取錯誤代碼
}
private void stop() {
print("停止播放!");//停止合成引擎
int result = mSpeechSynthesizer.stop();
checkResult(result, "stop");
}
initView()在於監聽是否有onClick, checkResult這個是回傳結果,如果有錯誤會回傳錯誤代碼。
// 下面是UI部分
private void initView() {
mSpeak = (Button) this.findViewById(R.id.start);
mStop = (Button) this.findViewById(R.id.pause);
mShowText = (TextView) this.findViewById(R.id.showText);
View.OnClickListener listener = new View.OnClickListener() {
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.start:
speak();
break;
case R.id.pause:
stop();
break;
default:
break;
}
}
};
mSpeak.setOnClickListener(listener);
mStop.setOnClickListener(listener);
mainHandler = new Handler() {
// @param msg
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.obj != null) {
//print(msg.obj.toString());//調試作用
}
}
};
}
private void print(String message) {
Log.i(TAG, message);
mShowText.append(message + "\n");
}
@Override
protected void onDestroy() {
if (mSpeechSynthesizer != null) {
mSpeechSynthesizer.stop();
mSpeechSynthesizer.release();
mSpeechSynthesizer = null;
print("釋放資源成功");
}
super.onDestroy();
}
private void checkResult(int result, String method) {
if (result != 0) {
print("error code :" + result + " method:" + method + ", 錯誤碼文檔:http://yuyin.baidu.com/docs/tts/122 ");
}
System.out.println("錯誤參數:"+result);
if(result == -15 )
{
Toast.makeText(getApplicationContext(),"語音請求超時,請重新點擊播放或切換網絡環境。",Toast.LENGTH_LONG).show();
}
}
下面就是一個對於權限的獲取,後面調用相機應用也需要某些權限,所以這裏申請。
private void initPermission() {
String[] permissions = {
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.MODIFY_AUDIO_SETTINGS,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.WRITE_SETTINGS,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.CHANGE_WIFI_STATE
};
ArrayList<String> toApplyList = new ArrayList<String>();
for (String perm : permissions) {
if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) {
toApplyList.add(perm);
// 進入到這裏代表沒有權限.
}
}
String[] tmpList = new String[toApplyList.size()];
if (!toApplyList.isEmpty()) {
ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123);
}
}
對應的, AndroidManifest.xml也要做權限的註冊。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
以上就是百度tts語音合成使用在MainActivity中的簡單調用,通過修改Speck_TEXT修改播放內容。
播放是函數speak()方法,做處理的是函數下這句
mSpeechSynthesizer.speak("播放開始"+Speck_TEXT+"語音播放播放完成")
下一節,介紹相機功能的調用和百度圖像識別功能的調用。