1. 程式人生 > 實用技巧 >如何使用華為機器學習服務和Kotlin實現語音合成

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

原作者:夢陽