模擬器不支援朗讀中文,只能在實體裝置測試。
直接看程式碼
strings.xml
<resources> <string name="app_name">TextToSpeechDemo</string> <string name="textspeech">Android 提供內容豐富的應用程式架構,可讓您在 Java 語言環境中建置適用於行動裝置的新穎應用程式和遊戲。 With her nine-to-five job, Sally sometimes has to run personal during the lunch break, such as going to the bank or mailing letters.(A) affairs (B) errands (C) belongings (D) connections</string> <string name="textspeech1">With her nine-to-five job, Sally sometimes has to run personal during the lunch break, such as going to the bank or mailing letters.(A) affairs (B) errands (C) belongings (D) connections</string> </resources>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" android:paddingLeft="20dp" android:paddingRight="20dp" tools:context=".MainActivity"> <EditText android:id="@+id/et" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/textspeech" android:background="@drawable/edit_text_style" android:hint="請輸入要朗讀的文字" android:paddingBottom="10dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="10dp" /> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginVertical="10dp" android:elevation="0dp" android:paddingHorizontal="30dp" android:text="開始朗讀" /> </LinearLayout>
MainActivity.kt
import android.os.Bundle import android.speech.tts.TextToSpeech import android.speech.tts.TextToSpeech.OnInitListener import android.support.v7.app.AppCompatActivity import android.util.Log import android.view.View import android.widget.Button import android.widget.EditText import android.widget.Toast import java.util.* class MainActivity : AppCompatActivity() { private var tts: TextToSpeech? = null private var btn: Button? = null private var editText: EditText? = null public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) btn = findViewById<view>(R.id.btn) as Button editText = findViewById<view>(R.id.et) as EditText tts = TextToSpeech(applicationContext, OnInitListener { status -> if (status == TextToSpeech.SUCCESS) { val ttsLang = tts!!.setLanguage(Locale.TRADITIONAL_CHINESE) if (ttsLang == TextToSpeech.LANG_MISSING_DATA || ttsLang == TextToSpeech.LANG_NOT_SUPPORTED) { Log.e("TTS", "The Language is not supported!") } else { Log.i("TTS", "Language Supported.") } Log.i("TTS", "Initialization success.") } else { Toast.makeText(applicationContext, "TTS Initialization failed!", Toast.LENGTH_SHORT).show() } }) btn!!.setOnClickListener { val data = editText!!.text.toString() Log.i("TTS", "button clicked: $data") tts!!.setPitch(1F) // 語調(1 為正常;0.5 為低一倍;2 為高一倍) tts!!.setSpeechRate(1F) // 速度(1 為正常;0.5 為慢一倍;2 為快一倍) val speechStatus = tts!!.speak(data, TextToSpeech.QUEUE_FLUSH, null) if (speechStatus == TextToSpeech.ERROR) { Log.e("TTS", "Error in converting Text to Speech!") } } } public override fun onDestroy() { super.onDestroy() if (tts!= null) { tts!!.stop() tts!!.shutdown() } } }
測後要點:
* 降低語調 tts!!.setPitch(0.5F), 聽起來有點鴨嗓,降至 0.1F,像重感冒的鴨嗓,並不會因降低語調而變成男聲。
* 以老人家的 Zenfone 3 為測試手機,Locale 不論設成 CHINA, CHINESE, TAIWAN, TRADITIONAL_CHINESE, SIMPLIFIED_CHINESE, 都是同樣的聲音語調。
* 由於大陸是漢語拼音,所以當設為 Locale.CHINESE(/TAIWAN/TRADITIONAL_CHINESE/SIMPLIFIED_CHINESE),而且要朗讀的文字中混雜有英文時,Google 小姐會將英文單字轉換為中文發音唸出。
* 但若設為 Locale.CHINA,就不會將英文單字轉為中文發音,雖然腔調怪怪的,但仍能聽得出是英文。
* 若設為英文語系:Locale.ENGLISH(/US/UK),遇到中, 英文混合,某些機種的 Google 小姐會直接略過中文,只唸英文;而有的機種則是洋腔說中文。
相關筆記 ----
【Kotlin】微軟的 文字轉換語音(Text To Speach, TTS)
沒有留言:
張貼留言