###### tags: `Android` `Kotlin` # TextToSpeech 本文紀錄著如何使用 ==TextToSpeech== TextToSpeech 是 Android 在 API 4 提供的文本朗讀套件,能將指定文字轉換成語音並朗讀 而且還能將文本對應的音頻錄製成檔案並儲存 ## 檢查語音模型 有些手機預設可能沒有安裝其他語言的語音模型 此時要進行檢查,並帶使用者前往設定的地方下載語音模型 ```kotlin= private fun isLanguageAvailable(locale: Locale): Boolean { val status = speaker.isLanguageAvailable(locale) val isAvailable = !(status == TextToSpeech.LANG_MISSING_DATA || status == TextToSpeech.LANG_NOT_SUPPORTED) if (!isAvailable) { val installIntent = Intent() installIntent.action = TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA startActivity(installIntent) } return isAvailable } ``` https://stackoverflow.com/questions/5913188/missing-languages-in-tts-android ## 顯示語音資料 ```kotlin= private fun showInfo() { if (!::speaker.isInitialized) return //語音引擎資訊 speaker.engines.forEach { Log.e("engine", "name:${it.name}, label:${it.label}") } //目前語音資訊 Log.e("voice", "name:${speaker.voice.name}, " + "language:${speaker.voice.locale.language}, " + "country: ${speaker.voice.locale.country}") } ``` ## 使用方式 ```kotlin= private lateinit var speaker: TextToSpeech private fun speakText(text: String, language: String) { if (::speaker.isInitialized) speaker.speak(text, TextToSpeech.QUEUE_FLUSH,null, "0") else { speaker = TextToSpeech(this, TextToSpeech.OnInitListener { when (it) { TextToSpeech.SUCCESS -> { val locale = with(language) { when { contains("en") -> Locale.US else -> Locale.TRADITIONAL_CHINESE } } //檢查裝置是否有該語言的語音資料 if (!isLanguageAvailable(locale)) return@OnInitListener //設定朗讀語言 speaker.language = locale //設定語速 speaker.setSpeechRate(0.8f) //若正在念其他的內容,就直接刷掉 speaker.speak(text, TextToSpeech.QUEUE_FLUSH,null, "0") //顯示語音資訊 showInfo() } TextToSpeech.ERROR -> { Toast.makeText(this, "無法進行語音播放,請確保網路連線正常", Toast.LENGTH_SHORT).show() } } }) } } private fun isLanguageAvailable(locale: Locale): Boolean { val status = speaker.isLanguageAvailable(locale) val isAvailable = !(status == TextToSpeech.LANG_MISSING_DATA || status == TextToSpeech.LANG_NOT_SUPPORTED) if (!isAvailable) { val installIntent = Intent() installIntent.action = TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA startActivity(installIntent) } return isAvailable } private fun showInfo() { if (!::speaker.isInitialized) return //語音引擎資訊 speaker.engines.forEach { Log.e("engine", "name:${it.name}, label:${it.label}") } //目前語音資訊 Log.e("voice", "name:${speaker.voice.name}, " + "language:${speaker.voice.locale.language}, " + "country: ${speaker.voice.locale.country}") } override fun onDestroy() { if (::speaker.isInitialized) { speaker.stop() //停止朗讀 speaker.shutdown() //回收 } super.onDestroy() } ``` ## 參考文章 [Android 自動朗讀(TTS)實現](https://blog.csdn.net/tracydragonlxy/article/details/78200382) [官方文件](https://developer.android.com/reference/android/speech/tts/TextToSpeech) [官方部落格介紹](https://android-developers.googleblog.com/2009/09/introduction-to-text-to-speech-in.html?m=1) [Android TextToSpeech 使用指南](https://enderhoshi.github.io/2019/11/25/Android%20TextToSpeech%20%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/) ## 未完成項目 - 音頻轉檔案儲存