訊飛離線語音合成(離線資源包)


訊飛離線語音合成(離線資源包)

訊飛的語音合成有三種方式

  1. 在線語音合成(免費)

  2. 離線使用語記語音合成(免費,需要本地裝一個語記App並且下載離線資源)

  3. 使用訊飛離線語音包(付費)

這里使用離線資源包實現離線語音合成,因為正式版是要付費的,所以這里使用試用的離線包(35天試用期、3個裝機量)。

效果圖

P1

源碼

下載地址(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下創建這兩個目錄

P2

初始化

在清單文件中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、庫、離線資源。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM