Android訊飛語音合成

開通賬戶

訊飛開發(fā)者平臺上注冊申請賬戶,并且創(chuàng)建自己的應用晚伙,為自己的應用添加語音合成服務

SDK下載以及導入

  1. 根據選擇的服務豪硅,下載官方的SDK
  2. 將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();
    }
}

趕緊試一下吧

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蒸其,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子库快,更是在濱河造成了極大的恐慌摸袁,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件义屏,死亡現場離奇詭異靠汁,居然都是意外死亡,警方通過查閱死者的電腦和手機闽铐,發(fā)現死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門蝶怔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兄墅,你說我怎么就攤上這事踢星。” “怎么了隙咸?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵斩狱,是天一觀的道長。 經常有香客問我扎瓶,道長,這世上最難降的妖魔是什么泌枪? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任概荷,我火速辦了婚禮,結果婚禮上碌燕,老公的妹妹穿的比我還像新娘误证。我一直安慰自己,他們只是感情好修壕,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布愈捅。 她就那樣靜靜地躺著,像睡著了一般慈鸠。 火紅的嫁衣襯著肌膚如雪蓝谨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天青团,我揣著相機與錄音譬巫,去河邊找鬼。 笑死督笆,一個胖子當著我的面吹牛芦昔,可吹牛的內容都是我干的。 我是一名探鬼主播娃肿,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼咕缎,長吁一口氣:“原來是場噩夢啊……” “哼珠十!你這毒婦竟也來了?” 一聲冷哼從身側響起凭豪,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤焙蹭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后墅诡,有當地人在樹林里發(fā)現了一具尸體壳嚎,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年末早,在試婚紗的時候發(fā)現自己被綠了烟馅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡然磷,死狀恐怖郑趁,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情姿搜,我是刑警寧澤寡润,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站舅柜,受9級特大地震影響梭纹,放射性物質發(fā)生泄漏。R本人自食惡果不足惜致份,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一变抽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氮块,春花似錦绍载、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蝠引,卻和暖如春阳谍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背立肘。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工边坤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谅年。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓茧痒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親融蹂。 傳聞我的和親對象是個殘疾皇子旺订,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容