Android文本转语音功能全解析
立即解锁
发布时间: 2025-08-26 01:05:18 阅读量: 2 订阅数: 7 


深入解析Android 3开发与实践
# Android文本转语音功能全解析
## 1. 文本转语音基础介绍
Android 1.6及更高版本配备了名为Pico的多语言语音合成引擎,它能让任何Android应用以匹配语言的口音朗读文本。文本转语音软件使用户无需看屏幕就能与应用交互,这对移动平台尤为重要。
### 1.1 体验文本转语音设置
在模拟器或设备(Android SDK 1.6及以上)中,可按以下步骤体验:
1. 进入主设置界面。
2. 选择“语音输入与输出”,再选“文本转语音设置”(具体选项可能因Android版本而异)。
3. 点击“聆听示例”,会听到“这是使用Pico进行英语语音合成的示例”。
在设置中,可更改语音语言和语速。语言选项既能翻译示例文本,又能改变语音口音,但示例文本始终是“这是语音合成的示例”。需注意,文本转语音功能仅涉及语音部分,文本翻译需借助其他组件,如Google翻译。语速值从“非常慢”到“非常快”。同时,要留意“始终使用我的设置”选项,若在系统设置中开启,可能会影响应用的预期行为。
从Android 2.2开始,除Pico外还能使用其他文本转语音(TTS)引擎。尽管有多个TTS引擎,但设备上只有一个TTS服务,且该服务由所有活动共享。TTS服务会跟踪所需的TTS引擎,并在执行任务时使用。
### 1.2 创建简单文本转语音应用
以下是创建简单文本转语音应用的步骤:
1. 创建新的Android项目,使用以下XML和Java代码。
```xml
<?xml version="1.0" encoding="utf-8"?>
<!-- This file is /res/layout/main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText android:id="@+id/wordsToSpeak"
android:hint="Type words to speak here"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Button android:id="@+id/speak"
android:text="Speak"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick=”doSpeak”
android:enabled="false" />
</LinearLayout>
```
```java
// This file is MainActivity.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity implements OnInitListener {
private EditText words = null;
private Button speakBtn = null;
private static final int REQ_TTS_STATUS_CHECK = 0;
private static final String TAG = "TTS Demo";
private TextToSpeech mTts;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
words = (EditText)findViewById(R.id.wordsToSpeak);
speakBtn = (Button)findViewById(R.id.speak);
// Check to be sure that TTS exists and is okay to use
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);
}
public void doSpeak(View view) {
mTts.speak(words.getText().toString(),
TextToSpeech.QUEUE_ADD, null);
}
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == REQ_TTS_STATUS_CHECK) {
switch (resultCode) {
case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:
// TTS is up and running
mTts = new TextToSpeech(this, this);
Log.v(TAG, "Pico is installed okay");
break;
case TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:
case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:
case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:
// missing data, install it
Log.v(TAG, "Need language stuff: " + resultCode);
Intent installIntent = new Intent();
installIntent.setAction(
TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
break;
case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:
default:
Log.e(TAG, "Got a failure. TTS not available");
}
}
else {
// Got something else
}
}
public void onInit(int status) {
// Now that the TTS engine is ready, we enable the button
if( status == TextToSpeech.SUCCESS) {
speakBtn.setEnabled(true);
}
}
@Override
public void onPause()
{
super.onPause();
// if we're losing focus, stop talking
if( mTts != null)
mTts.stop();
}
@Override
public void onDestroy()
{
super.onDestroy();
mTts.shutdown();
}
}
```
此应用的用户界面包含一个EditText视图用于输入要朗读的文本,以及一个按钮用于触发朗读。按钮的`doSpeak()`方法会获取EditText中的文本,并使用`speak()`方法将其加入TTS服务队列。在`onCreate()`方法末尾,会发起一个Intent请求,检查TTS引擎是否正常。在`onActivityResult()`中处理响应,若返回`CHECK_VOICE_DATA_PASS`,则实例化`TextToSpeech`对象。在`onInit()`方法中,若TTS引擎初始化成功,会启用按钮。同时,在`onPause()`中调用`stop()`方法停止朗读,在`onDestroy()`中调用`shutdown()`方法释放资源。
### 1.3 使用话语跟踪语音进度
TTS引擎在朗读完一段文本(即一个话语)后,可在应用中触发回调。可通过以下步骤实现:
1. 确保`MainActivity`实现`OnUtteranceCompletedListener`接口。
2. 修改`doSpeak()`方法,为每个话语添加唯一ID。
3. 修改`onInit()`方法,注册话语完成回调。
4. 提供`onUtteranceCompleted()`回调方法。
以下是修改后的代码:
```java
// Add these imports
import java.util.HashMap;
import java.util.StringTokenizer;
import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener;
// Change MainActivity
public class MainActivity extends Activity implements OnInitListener,
OnUtteranceCompletedListener {
// Add these private fields
private int uttCount = 0;
private int lastUtterance = -1;
private HashMap<String, String> params = new HashMap<String, String>();
// Modify onInit
public void onInit(int status) {
// Now that the TTS engine is ready, we enable the button
if( status == TextToSpeech.SUCCESS) {
speakBtn.setEnabled(true);
mTts.setOnUtteranceCompletedListener(this);
}
}
/
```
0
0
复制全文
相关推荐










