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
函数。