Android 提供了 TextToSpeech
(TTS)API,允许开发者将文本转换为语音。以下是对 Android TTS 文本转语音功能的详细介绍,包括基本用法、配置、事件处理和一些高级功能。
基本用法
-
添加权限: 在
AndroidManifest.xml
文件中添加网络权限(如果需要在线合成服务):<uses-permission android:name="android.permission.INTERNET"/>
-
初始化 TextToSpeech: 创建一个
TextToSpeech
对象并在OnInitListener
中处理初始化结果。import android.content.Context; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.util.Log; public class TtsUtil implements TextToSpeech.OnInitListener { private static final String TAG = "TtsUtil"; private TextToSpeech tts; private boolean initialized = false; public void init(Context context) { tts = new TextToSpeech(context, this); } @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { int result = tts.setLanguage(Locale.US); if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { Log.e(TAG, "This Language is not supported"); } else { initialized = true; Log.i(TAG, "Initialization successful"); } } else { Log.e(TAG, "Initialization Failed!"); } } public void shutdown() { if (tts != null) { tts.stop(); tts.shutdown(); tts = null; initialized = false; Log.i(TAG, "TTS shut down successfully"); } } public void speak(String text) { if (initialized && tts != null) { tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, null); } else { Log.w(TAG, "TTS is not initialized yet."); } } }
-
使用 TtsUtil 类: 在 Activity 中使用
TtsUtil
类进行文本转语音。package com.hellom.trp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import com.hellom.trp.utils.TtsUtil; public class MainActivity extends AppCompatActivity { private TtsUtil ttsUtil; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ttsUtil = new TtsUtil(); ttsUtil.init(this); Button playButton = findViewById(R.id.playButton); playButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ttsUtil.speak("Hello, World!"); } }); } @Override protected void onDestroy() { super.onDestroy(); ttsUtil.shutdown(); } }
配置
-
设置语言:
int result = tts.setLanguage(Locale.US); if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { Log.e(TAG, "This Language is not supported"); } else { initialized = true; Log.i(TAG, "Initialization successful"); }
-
设置音调和速度:
tts.setPitch(1.0f); // Default pitch is 1.0 tts.setSpeechRate(1.0f); // Default speech rate is 1.0
事件处理
- 播放完成回调: 实现
OnUtteranceCompletedListener
接口来处理播放完成事件。
注意:
初始化失败-1
权限问题
在Android 11中,TTS功能需要使用ACCESSIBILITY_SERVICE
权限。这是因为TTS可以读取屏幕上的文本,因此需要确保它不会滥用用户数据。如果没有这个权限,TTS的初始化过程可能会失败。为了解决这个问题,可以在AndroidManifest.xml
文件中添加以下代码:
<uses-permission android:name="android.permission.ACCESSIBILITY_SERVICE"/>
软件包可见性问题
在Android 11中,由于软件包可见性限制,可能会导致TTS初始化失败。解决这个问题的方法是在AndroidManifest.xml
文件中增加<queries>
标签,指定TTS服务的action:
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE"/>
</intent>
</queries>