Android文字转语音(TTS)
时间:2020-02-23 14:29:20 来源:igfitidea点击:
在本教程中,我们将在Android应用程序中讨论和实现"文字转语音"功能。
我们将创建一个Android应用程序,说出在EditText中输入的文本。
Android文字转语音也称为Android TTS。
Android文字转语音
顾名思义,TextToSpeech用于从文本字符串中合成语音。
您可以设置自己选择的语言。
您可以从自定义文件中设置音高,速度以及自己的语音。
首先需要初始化TextToSpeech。
为此,您需要实现TextToSpeech.OnInitListener接口并覆盖方法onInit。
例:
TextToSpeech tts = new TextToSpeech(this, this);
完成此操作后,将触发onInit。
使用这种方法,我们检查功能是否在我们的设备上可用。
@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) {
Toast.makeText(getApplicationContext(), "Language 不支持", Toast.LENGTH_SHORT).show();
} else {
//Disable the button if any.
}
} else {
Toast.makeText(getApplicationContext(), "Init failed", Toast.LENGTH_SHORT).show();
}
}
文字怎么说?
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, null);
第一个参数是要说的文字。
第二个参数定义刷新先前的输入,以便开始清理。
或者,我们可以使用QUEUE_ADD将当前文本添加到语音中。
第三个参数是传递的包。
第四是"发话ID"字符串。
OnUtteranceProgressListener用于侦听tts事件:开始,完成,错误。
在这种情况下,我们可以检索已传递的语音包发声字符串。
必须在调用语音方法之前定义OnUtteranceProgressListener。
要更改音调和速度,我们可以执行以下操作:
tts.setPitch(2f); tts.setSpeechRate(2f);
" addSpeech"方法用于添加自定义语音,而不是使用Android的默认语音。
演讲结束后,您需要停止TTS实例,以便使用tts.shutdown()方法释放资源。
让我们进入在应用程序中实现TextToSpeech的业务端。
文字转语音Android代码
下面给出了activity_main.xml布局的代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/enterYouText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:text="Welcome to theitroad.local"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="SPEAK TEXT"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/enterYouText"
<Button
android:id="@+id/btnChangePitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="Change Pitch"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnChangeSpeed"
<Button
android:id="@+id/btnChangeSpeed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="Change Speed"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button"
</android.support.constraint.ConstraintLayout>
MainActivity.java的代码如下:
package com.theitroad.androidtexttospeech;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Locale;
public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
Button button, btnChangePitch, btnChangeSpeed;
EditText editText;
private TextToSpeech tts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tts = new TextToSpeech(this, this);
button = findViewById(R.id.button);
btnChangePitch = findViewById(R.id.btnChangePitch);
btnChangeSpeed = findViewById(R.id.btnChangeSpeed);
editText = findViewById(R.id.enterYouText);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
speakOut();
}
});
btnChangePitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tts.setPitch(0.2f);
}
});
btnChangeSpeed.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tts.setSpeechRate(2f);
}
});
}
@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) {
Toast.makeText(getApplicationContext(), "Language 不支持", Toast.LENGTH_SHORT).show();
} else {
button.setEnabled(true);
}
} else {
Toast.makeText(getApplicationContext(), "Init failed", Toast.LENGTH_SHORT).show();
}
}
private void speakOut() {
tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String s) {
final String keyword = s;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Started" + keyword, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onDone(String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Done ", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onError(String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Error ", Toast.LENGTH_SHORT).show();
}
});
}
});
Bundle params = new Bundle();
params.putString(TextToSpeech.Engine.KEY_PA内存_UTTERANCE_ID, "");
String text = editText.getText().toString();
tts.speak(text, TextToSpeech.QUEUE_FLUSH, params, "Dummy String");
}
@Override
public void onDestroy() {
if (tts != null) {
tts.stop();
tts.shutdown();
}
super.onDestroy();
}
}
tts侦听器在单独的线程上运行。
因此,要从它们执行任何UI动作,我们需要使用runOnUiThread函数。

