標籤:語音合成 訊飛 android studio 離線包
訊飛離線語音合成(離線資源套件)
訊飛的語音合成有三種方式
-
線上語音合成(免費)
-
離線使用語記語音合成(免費,需要本地裝一個語記App並且下載離線資源)
-
使用訊飛離線語音包(付費)
這裡使用離線資源套件實現離線語音合成,因為正式版是要付費的,所以這裡使用試用的離線包(35天試用期、3個裝機量)。
源碼
(Android Studio工程):http://download.csdn.net/detail/q4878802/9063779
開通服務,下載SDK
之前已經介紹過,地址:http://blog.csdn.net/q4878802/article/details/47762169#t8
將SDK裡提供的jar包、so庫、離線資源都拷貝到我們的工程(Android Studio工程)
建立的工程預設可能沒有jniLibs和assets目錄,我們要自己在main下建立這兩個目錄
初始化
在資訊清單檔中application標籤下添加name屬性
android:name=".InitApplication"
初始化
package com.example.kongqw.kqwspeechcompounddemo;import android.app.Application;import android.widget.Toast;import com.iflytek.cloud.SpeechConstant;import com.iflytek.cloud.SpeechUtility;/** * Created by kongqw on 2015/8/29. */public class InitApplication extends Application { @Override public void onCreate() { Toast.makeText(this, "InitApplication", Toast.LENGTH_LONG).show(); // 應用程式入口處調用,避免手機記憶體過小,殺死後台進程後通過曆史intent進入Activity造成SpeechUtility對象為null // 如在Application中調用初始化,需要在Mainifest中註冊該Applicaiton // 注意:此介面在非主進程調用會返回null對象,如需在非主進程使用語音功能,請增加參數:SpeechConstant.FORCE_LOGIN+"=true" // 參數間使用“,”分隔。 // 設定你申請的應用appid StringBuffer param = new StringBuffer(); param.append("appid=55d33f09"); param.append(","); param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC); // param.append(","); // param.append(SpeechConstant.FORCE_LOGIN + "=true"); SpeechUtility.createUtility(InitApplication.this, param.toString()); super.onCreate(); }}
語音合成工具類
package com.example.kongqw.kqwspeechcompounddemo.engine;import com.iflytek.cloud.ErrorCode;import com.iflytek.cloud.InitListener;import com.iflytek.cloud.SpeechConstant;import com.iflytek.cloud.SpeechError;import com.iflytek.cloud.SpeechSynthesizer;import com.iflytek.cloud.SynthesizerListener;import com.iflytek.cloud.util.ResourceUtil;import com.iflytek.cloud.util.ResourceUtil.RESOURCE_TYPE;import android.content.Context;import android.os.Bundle;import android.util.Log;import android.widget.Toast;/** * 語音合成器 * * @author kongqw */public class KqwSpeechSynthesizer { // Log標籤 private static final String TAG = "KqwSpeechSynthesizer"; private Context mContext; // 語音合成對象 private SpeechSynthesizer mTts; public KqwSpeechSynthesizer(Context context) { mContext = context; // 初始化合成對象 mTts = SpeechSynthesizer.createSynthesizer(context, new InitListener() { @Override public void onInit(int code) { Log.d(TAG, "InitListener init() code = " + code); if (code != ErrorCode.SUCCESS) { Toast.makeText(mContext, "初始化失敗,錯誤碼:" + code, Toast.LENGTH_SHORT).show(); } } }); } /** * 開始語音合成 * * @param text */ public void start(String text) { // 設定參數 setParam(); int code = mTts.startSpeaking(text, mTtsListener); if (code != ErrorCode.SUCCESS) { Toast.makeText(mContext, "語音合成失敗,錯誤碼: " + code, Toast.LENGTH_SHORT).show(); } } /** * 合成回調監聽。 */ private SynthesizerListener mTtsListener = new SynthesizerListener() { @Override public void onSpeakBegin() { Log.i(TAG, "開始合成"); } @Override public void onSpeakPaused() { Log.i(TAG, "暫停合成"); } @Override public void onSpeakResumed() { Log.i(TAG, "繼續合成"); } @Override public void onBufferProgress(int percent, int beginPos, int endPos, String info) { Log.i(TAG, "傳衝進度 :" + percent); } @Override public void onSpeakProgress(int percent, int beginPos, int endPos) { Log.i(TAG, "合成進度 : " + percent); } @Override public void onCompleted(SpeechError error) { if (error == null) { Log.i(TAG, "合成完成"); } else if (error != null) { Log.i(TAG, "error : " + error.toString()); } } @Override public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) { // TODO Auto-generated method stub } }; /** * 參數設定 * * @return */ private 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.VOICE_NAME, "xiaoyan"); // 設定語速 mTts.setParameter(SpeechConstant.SPEED, "50"); // 設定音調 mTts.setParameter(SpeechConstant.PITCH, "50"); // 設定音量 mTts.setParameter(SpeechConstant.VOLUME, "50"); // 設定播放器音頻流類型 mTts.setParameter(SpeechConstant.STREAM_TYPE, "3"); } // 擷取發音人資源路徑 private String getResourcePath() { StringBuffer tempBuffer = new StringBuffer(); // 合成通用資源 tempBuffer.append(ResourceUtil.generateResourcePath(mContext, RESOURCE_TYPE.assets, "tts/common.jet")); tempBuffer.append(";"); // 發音人資源 tempBuffer.append(ResourceUtil.generateResourcePath(mContext, RESOURCE_TYPE.assets, "tts/xiaoyan.jet")); return tempBuffer.toString(); }}
測試類別
package com.example.kongqw.kqwspeechcompounddemo;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.Toast;import com.example.kongqw.kqwspeechcompounddemo.engine.KqwSpeechSynthesizer;public class MainActivity extends Activity { private EditText mEtText; private KqwSpeechSynthesizer mKqwSpeechSynthesizer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEtText = (EditText) findViewById(R.id.et_text); // 初始化語音合成對象 mKqwSpeechSynthesizer = new KqwSpeechSynthesizer(this); } /** * 開始合成 * * @param view */ public void start(View view) { Toast.makeText(this, "開始合成 : " + mEtText.getText().toString().trim(), Toast.LENGTH_SHORT).show(); mKqwSpeechSynthesizer.start(mEtText.getText().toString().trim()); }}
XML頁面配置
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <EditText android:id="@+id/et_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="語音合成的內容" android:textSize="20dp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/et_text" android:gravity="center" android:onClick="start" android:text="語音合成" android:textSize="20dp" /></RelativeLayout>
說明
因為我用的是離線資源套件,試用期是有35天並且只有3個裝機量,所以如果直接使用我的demo可能會有問題,如果要自己再建立一個工程,千萬不要忘記替換APPID、庫、離線資源。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。所有文章,任何一個技術點,無論是原創還是轉載,都是在程式中使用過或者Demo測試過才發表!博主QQ:4878802。
訊飛離線語音合成(離線資源套件)