1. 程式人生 > >集成Android免費語音合成功能(在線、離線、離在線融合)

集成Android免費語音合成功能(在線、離線、離在線融合)

com nvi sid 審核 contacts lai 音量 ant demo

集成Android免費語音合成功能(在線、離線、離在線融合),有這一篇文章就夠了(離線)
集成Android免費語音合成功能(在線、離線、離在線融合),有這一篇文章就夠了(離在線融合)

轉眼間,大半年沒寫文章了,沒什麽理由,就是人變懶了。囧~
看標題,其實大家都被騙了,有這一篇文章還不夠,我其實是打算分3篇文章來寫的,如果合在一章裏面就太長了,不過現在這個標題黨橫行的網絡世界,我也被汙染了,哈。
那麽為什麽要分3篇文章來講呢?看標題也能猜到了,就是在線、離線、離在線融合這3種語音合成方式,我將分別使用科大訊飛、雲知聲、百度語音來實現Android的語音合成。至於有什麽優缺點,大家可以自行百度,這裏就不再贅言了,好吧,不說廢話了,我怕有人會打我,哈哈~
首先,這一篇先寫用科大訊飛實現的在線語音合成吧,是免費的,它的離線是要錢的,有需求的可以自己到它們官網去看看。
打開訊飛開放平臺

註冊、登錄開發者賬號


進入控制臺,創建新應用

開通在線語音合成服務


下載SDK


下載完SDK後,解壓壓縮包sample-->SpeechDemo

打開SpeechDemo-->libs文件夾,復制jar包和.so文件到你的項目裏面,然後sync一下


做完以上準備工作,就可以開始擼代碼了
首先,AndroidManifest.xml申請權限(6.0需要動態申請權限,礙於篇幅,請自行百度)
[html] view plain copy
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android. www.chuangyed.com permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android www.wmyl15.com/ permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android. www.senta77.com /permission.READ_PHONE_STATE" />
<uses-permission android:name="android. www.xucaizxyl.com/ permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android. www.lieqibiji.com/ permission.READ_CONTACTS" />
<uses-permission android:name="android. www.dejiaylsmile.cn permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android. www.6788878.cn/ permission.WRITE_SETTINGS" />
<uses-permission android:name="android. www.caihonyule.com permission.READ_EXTERNAL_STORAGE" />
然後,新建MyApplication.Java文件,初始化語音合成SDK,APPID可在訊飛平臺-->我的應用查看,也可查看下載的SDK壓縮包名字後綴

[java] view plain copy
package com.cyf.ttsdemo;

import android.app.Application;

import com.iflytek.cloud.SpeechUtility;

/**
* Created by As on 2017/8/7.
*/

public class MyApplication extends Application{

@Override
public void onCreate() {
super.onCreate();
SpeechUtility.createUtility(this, "appid=5987d170");
}
}
最後記得在AndroidManifest.xml註冊該Application


為了可以全局調用語音合成功能,我封裝成了一個工具類,大家可以直接復制過去用
[java] view plain copy
package com.cyf.ttsdemo.utils;

import android.os.Bundle;
import android.os.Environment;
import android.util.Log;

import com.cyf.ttsdemo.MyApplication;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechEvent;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SynthesizerListener;

/**
* Created by As on 2017/8/7.
*/

public class TTSUtils implements InitListener, SynthesizerListener {

private static final String TAG = "TTSUtils";
private static volatile TTSUtils instance = null;
private boolean isInitSuccess = false;
private SpeechSynthesizer mTts;

private TTSUtils() {
}

public static TTSUtils getInstance() {
if (instance == null) {
synchronized (TTSUtils.class) {
if (instance == null) {
instance = new TTSUtils();
}
}
}
return instance;
}

public void init() {
// 初始化合成對象
mTts = SpeechSynthesizer.createSynthesizer(www.qinlinyule.cn/ MyApplication.getContext(), this);
// 清空參數
mTts.setParameter(SpeechConstant.PARAMS, null);
// 設置在線合成引擎
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
// 設置在線合成發音人
mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");
// 設置合成語速
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權限
// 註:AUDIO_FORMAT參數語記需要更新版本才能生效
mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/tts.wav");
}

public void speak(String msg) {
if (isInitSuccess){
if (mTts.isSpeaking()) {
stop();
}
mTts.startSpeaking(msg, this);
}else {
init();
}
}

public void pause() {
mTts.pauseSpeaking();
}

public void resume() {
mTts.resumeSpeaking();
}

public void stop() {
mTts.stopSpeaking();
}

public void release() {
if (null != mTts) {
mTts.stopSpeaking();
// 退出時釋放連接
mTts.destroy();
}
}

@Override
public void onInit(int code) {
Log.d(TAG, "InitListener init() code = " + code);
if (code == ErrorCode.SUCCESS) {
isInitSuccess = true;
}
}

@Override
public void onSpeakBegin() {
// 開始播放
}

@Override
public void onBufferProgress(int percent, int beginPos, int endPos,
String info) {
// 合成進度
}

@Override
public void onSpeakPaused() {
// 暫停播放
}

@Override
public void onSpeakResumed() {
// 繼續播放
}

@Override
public void onSpeakProgress(int percent, int beginPos, int endPos) {
// 播放進度
}

@Override
public void onCompleted(SpeechError speechError) {
if (speechError != null) {
Log.d(TAG, "onCompleted: " + speechError.getPlainDescription(true));
}
}

@Override
public void onEvent(int eventType, int i1, int i2, Bundle bundle) {
//以下代碼用於獲取與雲端的會話id,當業務出錯時將會話id提供給技術支持人員,可用於查詢會話日誌,定位出錯原因
if (SpeechEvent.EVENT_SESSION_ID == eventType) {
String sid = bundle.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
Log.d(TAG, "session id =" + sid);
}
}
}<strong>
</strong>
要使用這個工具類,那麽就要改造一下前面的MyApplication.java文件了
[java] view plain copy
package com.cyf.ttsdemo;

import android.app.Application;
import android.content.Context;

import com.cyf.ttsdemo.utils.TTSUtils;
import com.iflytek.cloud.Setting;
import com.iflytek.cloud.SpeechUtility;

/**
* Created by As on 2017/8/7.
*/

public class MyApplication extends Application {

private static Context context;

@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
SpeechUtility.createUtility(this, "appid=5987d170");
// 以下語句用於設置日誌開關(默認開啟),設置成false時關閉語音雲SDK日誌打印
Setting.setShowLog(false);
TTSUtils.getInstance().init();
}

public static Context getContext() {
return context;
}
}
好的,這樣就大功告成了,在需要進行語音合成的地方調用TTSUtils.getInstance().speak("xxx")即可

最後,我們需要到訊飛開放平臺進行上傳應用審核,不然使用的語音合成功能每天是有次數限制的。

當應用審核通過之後,就可以免費無限制的使用在線語音合成功能啦。

集成Android免費語音合成功能(在線、離線、離在線融合)