Android 實(shí)現(xiàn)云知聲版離線語(yǔ)音合成
簡(jiǎn)介
科大訊飛:合成速度快,準(zhǔn)確度高,模型多。但問題也是相當(dāng)明顯,只有在線合成是免費(fèi)的,離線則是一筆不小的開銷。
百度:是專門為他的導(dǎo)航做的一套,性能相對(duì)也還可以,但是他只支持離在線混合模式,默認(rèn)是在wifi情況下是使用在線模式,4g或無網(wǎng)絡(luò)情況下使用離線模式。
云知聲:則可以實(shí)現(xiàn)完全的離線合成模式,相比于前兩個(gè),性能可能沒那沒完美,不過對(duì)合成的語(yǔ)音要求不高的應(yīng)用來說,可以考慮接入,缺點(diǎn)就是模型比較少。
在線合成和離線合成(合成速度)
在線合成必須將數(shù)據(jù)傳到第三方平臺(tái),調(diào)用他們的服務(wù)接口進(jìn)行合成,這中間牽扯到網(wǎng)絡(luò)狀況,在網(wǎng)絡(luò)良好的情況下,合成速度和離線模式?jīng)]有太大的差別,但是有時(shí)候服務(wù)器也會(huì)來開個(gè)小差,無法保證網(wǎng)絡(luò)一直都是暢通無阻的。在線模式雖然不太穩(wěn)定,但是不需要把模型和合成底層代碼放在本地,離線合成雖然穩(wěn)定快速,但是apk體積增加的有點(diǎn)小夸張。
云知聲的解決辦法:把語(yǔ)音合成模型放在服務(wù)器后端,你要使用的時(shí)候下載到本地。
集成方法
注冊(cè)云知聲開發(fā)者,創(chuàng)建應(yīng)用,下載離線語(yǔ)音合成sdk,里面就兩個(gè)文件。

將這里面的所有東西都拷貝到你的項(xiàng)目的對(duì)應(yīng)的libs下(比如app目錄下的libs)

在app模塊的 build.gradle的defaultConfig括號(hào)下加上
ndk {
abiFilters 'armeabi'
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}截圖如下:

在AndroidManifest.xml設(shè)置所需要的權(quán)限
<!-- 網(wǎng)絡(luò)權(quán)限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- sd卡獲得寫的權(quán)限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 獲取網(wǎng)絡(luò)狀態(tài) -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 獲取WiFi狀態(tài) -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 改變網(wǎng)絡(luò)狀態(tài) -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!-- 改變WiFi狀態(tài) -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!--喚醒鎖定-->
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<!--清除應(yīng)用緩存-->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!--麥克風(fēng)權(quán)限組-->
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<!-- 允許應(yīng)用寫(非讀)用戶的外部存儲(chǔ)器 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--允許讀取電話的狀態(tài)-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--允許應(yīng)用讀取用戶的聯(lián)系人數(shù)據(jù)-->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!--允許使用電源鎖定管理以使進(jìn)程休眠或屏幕變暗-->
<uses-permission android:name="android.permission.WAKE_LOCK" />為了方便使用我這里將云知聲語(yǔ)音合成做了進(jìn)一步的封裝,以方便調(diào)用,以下是示例,方便大家進(jìn)行參考
import android.content.Context;
import android.media.AudioManager;
import android.util.Log;
import cn.yunzhisheng.tts.offline.TTSPlayerListener;
import cn.yunzhisheng.tts.offline.basic.ITTSControl;
import cn.yunzhisheng.tts.offline.basic.TTSFactory;
import cn.yunzhisheng.tts.offline.common.USCError;
/**
* 云知聲離線語(yǔ)音封裝類
*/
public class SpeechUtilOffline implements TTSPlayerListener {
public static final String TAG ="SpeechUtilOffline";
public static final String appKey = "_appKey_";
private ITTSControl ittsControl;
private Context context;
public SpeechUtilOffline(Context context) {
this.context = context;
init();
}
/**
* 初始化引擎
*/
private void init() {
// 初始化語(yǔ)音合成對(duì)象
ittsControl = TTSFactory.createTTSControl(context, appKey);
// 設(shè)置回調(diào)監(jiān)聽
ittsControl.setTTSListener(this);
// 設(shè)置音頻流
ittsControl.setStreamType(AudioManager.STREAM_MUSIC);
// 設(shè)置播報(bào)語(yǔ)速,播報(bào)語(yǔ)速,數(shù)值范圍 0.1~2.5 默認(rèn)為 1.0
ittsControl.setVoiceSpeed(2.5f);
// 設(shè)置播報(bào)音高,調(diào)節(jié)音高,數(shù)值范圍 0.9~1.1 默認(rèn)為 1.0
ittsControl.setVoicePitch(1.1f);
// 初始化合成引擎
ittsControl.init();
}
/**
* 停止播放
*/
public void stop(){
ittsControl.stop();
}
/**
* 播放
*/
public void play(String content) {
ittsControl.play(content);
}
/**
* 開始緩沖回調(diào)
*/
@Override
public void onBuffer() {
Log.i(TAG, "onBuffer");
}
/**
* 開始播放回調(diào)
*/
@Override
public void onPlayBegin() {
Log.i(TAG, "onPlayBegin");
}
/**
* 取消播放回調(diào)
*/
@Override
public void onCancel() {
Log.i(TAG, "onCancel");
}
/**
* 語(yǔ)音合成錯(cuò)誤回調(diào)
*/
@Override
public void onError(USCError uscError) {
Log.i(TAG, "onError");
}
/**
* 播放完成回調(diào)
*/
@Override
public void onPlayEnd() {
Log.i(TAG, "onPlayEnd");
ittsControl.stop();
}
/**
* 初始化成功回調(diào)
*/
@Override
public void onInitFinish() {
Log.i(TAG, "onInitFinish");
}
}使用方法
SpeechUtilOffline speechUtilOffline = new SpeechUtilOffline(this);
speechUtilOffline.play("此處是需要播放的文本內(nèi)容")總結(jié)
在集成的時(shí)候遇到過很多bug,比如模型文件放在不正確的地方會(huì)導(dǎo)致沒有聲音,模型文件不完整的時(shí)候回導(dǎo)致程序崩潰,發(fā)音不是預(yù)期的效果等等,還有一些參數(shù)的設(shè)置,具體參數(shù)還是得看官方的開發(fā)文檔。
到此這篇關(guān)于Android 實(shí)現(xiàn)云知聲版離線語(yǔ)音合成的文章就介紹到這了,更多相關(guān)Android 語(yǔ)音合成內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android系統(tǒng)自帶樣式 (android:theme)
Android系統(tǒng)中自帶樣式分享,需要的朋友可以參考下2013-01-01
2021最新Android筆試題總結(jié)美團(tuán)Android崗職能要求
這篇文章主要介紹了2021最新Android筆試題總結(jié)以及美團(tuán)Android崗職能要求,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Android入門之使用eclipse進(jìn)行源碼開發(fā)的方法
這篇文章主要介紹了Android入門之使用eclipse進(jìn)行源碼開發(fā)的方法,較為詳細(xì)的分析了使用eclipse進(jìn)行Android源碼開發(fā)的具體步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-02-02
Android 判斷ip地址合法實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 判斷ip地址合法實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-06-06
Android貝塞爾曲線實(shí)現(xiàn)填充不規(guī)則圖形并隨手指運(yùn)動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android貝塞爾曲線實(shí)現(xiàn)填充不規(guī)則圖形,并隨手指運(yùn)動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
android獲取監(jiān)聽SD Card狀態(tài)的方法
這篇文章主要介紹了android獲取監(jiān)聽SD Card狀態(tài)的方法,涉及Android實(shí)現(xiàn)SD Card監(jiān)聽的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
android實(shí)現(xiàn)可以滑動(dòng)的平滑曲線圖
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)可以滑動(dòng)的平滑曲線圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Android仿微信菜單(Menu)(使用C#和Java分別實(shí)現(xiàn))
這篇文章主要介紹了Android仿微信菜單(Menu)(使用C#和Java分別實(shí)現(xiàn)),本文分別給出C#和Java版的運(yùn)行效果及實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06
Android Studio使用recyclerview實(shí)現(xiàn)展開和折疊功能(在之前的微信頁(yè)面基礎(chǔ)之上)
這篇文章主要介紹了Android Studio使用recyclerview實(shí)現(xiàn)展開和折疊(在之前的微信頁(yè)面基礎(chǔ)之上),本文通過截圖實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2020-03-03

