如何使用華為機器學習服務和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

原作者:夢陽


免責聲明!

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



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