Android 實現(xiàn)云知聲版離線語音合成
簡介
科大訊飛:合成速度快,準(zhǔn)確度高,模型多。但問題也是相當(dāng)明顯,只有在線合成是免費的,離線則是一筆不小的開銷。
百度:是專門為他的導(dǎo)航做的一套,性能相對也還可以,但是他只支持離在線混合模式,默認(rèn)是在wifi情況下是使用在線模式,4g或無網(wǎng)絡(luò)情況下使用離線模式。
云知聲:則可以實現(xiàn)完全的離線合成模式,相比于前兩個,性能可能沒那沒完美,不過對合成的語音要求不高的應(yīng)用來說,可以考慮接入,缺點就是模型比較少。
在線合成和離線合成(合成速度)
在線合成必須將數(shù)據(jù)傳到第三方平臺,調(diào)用他們的服務(wù)接口進(jìn)行合成,這中間牽扯到網(wǎng)絡(luò)狀況,在網(wǎng)絡(luò)良好的情況下,合成速度和離線模式?jīng)]有太大的差別,但是有時候服務(wù)器也會來開個小差,無法保證網(wǎng)絡(luò)一直都是暢通無阻的。在線模式雖然不太穩(wěn)定,但是不需要把模型和合成底層代碼放在本地,離線合成雖然穩(wěn)定快速,但是apk體積增加的有點小夸張。
云知聲的解決辦法:把語音合成模型放在服務(wù)器后端,你要使用的時候下載到本地。
集成方法
注冊云知聲開發(fā)者,創(chuàng)建應(yīng)用,下載離線語音合成sdk,里面就兩個文件。
將這里面的所有東西都拷貝到你的項目的對應(yīng)的libs下(比如app目錄下的libs)
在app模塊的 build.gradle的defaultConfig括號下加上
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)用寫(非讀)用戶的外部存儲器 --> <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" />
為了方便使用我這里將云知聲語音合成做了進(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; /** * 云知聲離線語音封裝類 */ 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() { // 初始化語音合成對象 ittsControl = TTSFactory.createTTSControl(context, appKey); // 設(shè)置回調(diào)監(jiān)聽 ittsControl.setTTSListener(this); // 設(shè)置音頻流 ittsControl.setStreamType(AudioManager.STREAM_MUSIC); // 設(shè)置播報語速,播報語速,數(shù)值范圍 0.1~2.5 默認(rèn)為 1.0 ittsControl.setVoiceSpeed(2.5f); // 設(shè)置播報音高,調(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"); } /** * 語音合成錯誤回調(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é)
在集成的時候遇到過很多bug,比如模型文件放在不正確的地方會導(dǎo)致沒有聲音,模型文件不完整的時候回導(dǎo)致程序崩潰,發(fā)音不是預(yù)期的效果等等,還有一些參數(shù)的設(shè)置,具體參數(shù)還是得看官方的開發(fā)文檔。
到此這篇關(guān)于Android 實現(xiàn)云知聲版離線語音合成的文章就介紹到這了,更多相關(guān)Android 語音合成內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android系統(tǒng)自帶樣式 (android:theme)
Android系統(tǒng)中自帶樣式分享,需要的朋友可以參考下2013-01-012021最新Android筆試題總結(jié)美團Android崗職能要求
這篇文章主要介紹了2021最新Android筆試題總結(jié)以及美團Android崗職能要求,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08Android入門之使用eclipse進(jìn)行源碼開發(fā)的方法
這篇文章主要介紹了Android入門之使用eclipse進(jìn)行源碼開發(fā)的方法,較為詳細(xì)的分析了使用eclipse進(jìn)行Android源碼開發(fā)的具體步驟與相關(guān)注意事項,需要的朋友可以參考下2016-02-02Android貝塞爾曲線實現(xiàn)填充不規(guī)則圖形并隨手指運動
這篇文章主要為大家詳細(xì)介紹了Android貝塞爾曲線實現(xiàn)填充不規(guī)則圖形,并隨手指運動,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09android獲取監(jiān)聽SD Card狀態(tài)的方法
這篇文章主要介紹了android獲取監(jiān)聽SD Card狀態(tài)的方法,涉及Android實現(xiàn)SD Card監(jiān)聽的技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04Android仿微信菜單(Menu)(使用C#和Java分別實現(xiàn))
這篇文章主要介紹了Android仿微信菜單(Menu)(使用C#和Java分別實現(xiàn)),本文分別給出C#和Java版的運行效果及實現(xiàn)代碼,需要的朋友可以參考下2015-06-06Android Studio使用recyclerview實現(xiàn)展開和折疊功能(在之前的微信頁面基礎(chǔ)之上)
這篇文章主要介紹了Android Studio使用recyclerview實現(xiàn)展開和折疊(在之前的微信頁面基礎(chǔ)之上),本文通過截圖實例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2020-03-03