如何使用華為機器學習服務和Kotlin實現語音合成
1. 引言
你曾遇到過這種情況嗎?一本小說太長,要花很長時間閱讀,但如果有app能自動為你閱讀,就會省時很多。因此,將文字轉換成語音的工具應運而生。華為機器學習服務(HUAWEI ML Kit)具備語音合成(Text To Speech, TTS)功能,能讓app快速實現從文字到語音的轉換。TTS可以將文字轉換成人聲。這也可以通過預設方法實現,但這些方法不能提供自然或真實的聲音。TTS服務全球通用,利用深度神經網路對文字進行處理,從而創造出自然的聲音,同時也支援多種音色,以增強人聲效果。TTS使用了雲服務,字元數限制在500個以內,並使用UTF-8編碼。
目前支援的音色如下:
- 英文-男聲
- 英文-女聲
- 中文-男聲
- 中文-女聲
- 英文+中文-男聲
- 英文+中文-女聲
2. 結果展示
視訊展示了使用該服務後得到的結果。
視訊連結:https://developer.huawei.com/consumer/cn/forum/topicview?fid=18&tid=0201314285827100291
3.整合步驟
步驟1: 在Android Studio中新建專案。
步驟2: 在app.gradle檔案中新增依賴。
implementation 'com.huawei.hms:ml-computer-voice-tts:1.0.4.300'
步驟3: 在app.gradle檔案頂部新增AppGallery Connect外掛。
apply plugin: 'com.huawei.agconnect'
步驟4: 在Activity中建立回撥。
var callback: MLTtsCallback = object : MLTtsCallback { override fun onError(taskId: String, err: MLTtsError) { } override fun onWarn(taskId: String, warn: MLTtsWarn) { } override fun onRangeStart(taskId: String, start: Int, end: Int) { } override fun onEvent(taskId: String, eventName: Int, bundle: Bundle?) { if (eventName == MLTtsConstants.EVENT_PLAY_STOP) { val isStop = bundle?.getBoolean(MLTtsConstants.EVENT_PLAY_STOP_INTERRUPTED) } } }
詳情如下:
共有4種回撥方法:
- OnError():提示使用者發生什麼錯誤,並通過華為分析服務(HUAWEI Analytics Kit)傳送分析資料到控制檯以進一步驗證。
- OnWarn():如果出現頻寬不足之類的警告,回撥將在這裡出現。
- OnRangeStart():返回當前播放的片段與文字的對映。
- OnEvent():當發生新事件時呼叫,例如,當音訊暫停時,您可以在bundle中獲得EVENT_PLAY_STOP_INTERRUPTED引數。
如果MLTtsConstants.EVENT_PLAY_STOP的值是false,則音訊播放無誤。
如果MLTtsConstants.EVENT_PLAY_STOP的值是true,則音訊會出現中斷。
步驟5: 物件初始化。
mlConfigs = MLTtsConfig()
.setLanguage(MLTtsConstants.TTS_EN_US)
.setPerson(MLTtsConstants.TTS_SPEAKER_FEMALE_EN)
.setSpeed(1.0f)
.setVolume(1.0f)
mlTtsEngine = MLTtsEngine(mlConfigs)
mlTtsEngine.setTtsCallback(callback)
詳情如下:
有兩種方法可用於建立TTS引擎。
我們通過MLTtsConfig物件使用自定義的TTS引擎:
- 通過MLTtsConstants.TTS_EN_US將語言設定為英文,也可以通過MLTtsConstants.TTS_ZH_HANS將語言設定為中文。
- 設定人聲。
英文女聲:MLTtsConstantsTTS_SPEAKER_FEMALE_EN
英文男聲:MLTtsConstants.TTS_SPEAKER_MALE_EN
中文女聲:MLTtsConstants.TTS_SPEAKER_FEMALE_ZH
中文男聲:MLTtsConstants.TTS_SPEAKER_MALE_ZH - 設定語速,範圍:0.2-1.8,1.0表示1倍語速。
- 設定音量,範圍:0.2-1.8,1.0表示1倍音量。
- 建立MLTtsEngine物件,並提供上述MLTtsConfig物件。
- 將上述建立的callback物件放入MLTtsEngine。
步驟6: 在Activity中新增以下方法,當用戶單擊按鈕時呼叫。
private fun startTtsService() {
val id = mlTtsEngine.speak(sourceText,MLTtsEngine.QUEUE_APPEND)
}
詳情如下:
sourceText為使用者輸入的文字。
- 當需要佇列系統時,使用MLTtsEngine.QUEUE_APPENDED。當TTS的第一次操作完成,緊接著進行下一次操作。
- 如果只需處理當前操作,使用MLTtsEngine.QUEUE_FLUSH。
- 通過onPause(),終止MLTtsEngine。
override fun onPause() {
super.onPause()
mlTtsEngine.stop()
}
- 通過onDestroy(),釋放MLTtsEngine佔用的資源。
override fun onDestroy() {
super.onDestroy()
mlTtsEngine.shutdown()
}
4.常見問題
問:TTS服務只支援在華為裝置上使用嗎?
答:是的。
問:需要上網才能使用TTS服務嗎?
答:是的,使用雲服務必須連線網際網路。
5.結束語
我們尚且在研究的初級階段。華為ML Kit提供的TTS服務適用於以下場景:新聞閱讀、有聲小說、股票資訊播報、語音導航、視訊配音。
希望您喜歡這篇文章,也希望您可以分享使用該服務時的意見或建議。
你可以在Github下載原始碼。
Github連結:https://github.com/HMS-Core/hms-ml-demo/tree/master/TTSSampleKotlin
原文連結:https://developer.huawei.com/consumer/cn/forum/topicview?fid=18&tid=0201314285827100291
原作者:夢陽