文字转语音
从文本合成语音以立即播放或创建声音文件。即TextToSpeech(以下简称TTS)
TTS是语音合成应用的一种,它将储存于电脑中的文件,如帮助文件或者网页,转换成自然语音输出。
TTS不仅能帮助有视觉障碍的人阅读计算机上的信息,更能增加文本文档的可读性。现在的TTS应用包括语音驱动的邮件以及声音敏感系统,并常与声音识别程序一起使用。TextToSpeech必须再被实例化之后才能使用.实现TextToSpeech.OnInitListener方法来获取实例化结果的提醒。当你已经使用完TextToSpeech实例之后, 应该调用shutdown()方法来释放TextToSpeech所使用的本地资源。
官网简介
具体详情可以去参考 链接地址:TextToSpeech
项目前景
最近在项目应用到了语音播报功能
。由于近期业务中,物联网蓝牙连接设备过程中,光有toast
,客户感觉无感操作,故新增了语音播报功能。
语音播报功能应用场景也很多的,所以我们从其中找符合自己的就可。
项目实战
在这里我单独拉出来一个项目,供各位老板参考一下,共同学习!
当初在遇到语音播报的时候,不知道应用哪个好,开发周期比较紧张,所以引用了TextToSpeech
,研发简单、简便。
在研发过程中,遇到一个问题,第一次运行,语音播报正常。等活动页运行销毁后,第二次调起语音播报异常,无法播报的情况,这个问题已解决。
具体代码如下:
/**
* @author 拉莫帅
* @date 2022/8/15
* @address
* @Desc 语音播报监听开始、结束
*/
public interface SpeakListener {
void startSpeak(String text);
void stopSpeak();
}
/**
* @author 拉莫帅
* @date 2022/8/15
* @address
* @Desc 语音播报工具类
*/
public class SpeechUtils extends UtteranceProgressListener implements SpeakListener, TextToSpeech.OnUtteranceCompletedListener{
private Context mContext;
private static SpeechUtils singleton;
private TextToSpeech mTextToSpeech; // 系统语音播报类
private boolean isSuccess = true;
/**
* 单例模式
* @param context
* @return
*/
public static SpeechUtils getInstance(Context context) {
if (singleton == null) {
synchronized (SpeechUtils.class) {
if (singleton == null) {
singleton = new SpeechUtils(context);
}
}
}
return singleton;
}
private SpeechUtils(Context context) {
this.mContext = context.getApplicationContext();
mTextToSpeech = new TextToSpeech(mContext, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int i) {
//系统语音初始化成功
if (i == TextToSpeech.SUCCESS) {//操作成功
int result = mTextToSpeech.setLanguage(Locale.CHINA);
mTextToSpeech.setPitch(1.0f);// 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
mTextToSpeech.setSpeechRate(1.0f);
mTextToSpeech.setOnUtteranceProgressListener(SpeechUtils.this);
mTextToSpeech.setOnUtteranceCompletedListener(SpeechUtils.this);
// TextToSpeech.LANG_MISSING_DATA:表示语言的数据丢失
// TextToSpeech.LANG_NOT_SUPPORTED:不支持
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
//系统不支持中文播报
isSuccess = false;
}
}
}
});
}
/**
* 开始播报
* @param text
*/
@SuppressLint("NewApi")
@Override
public void startSpeak(String text) {
if (!isSuccess) {
Toast.makeText(mContext, "系统不支持中文播报", Toast.LENGTH_SHORT).show();
return;
}
if (mTextToSpeech != null) {
// QUEUE_ADD:该模式下会把新的语音任务放到语音任务之后,等前面的语音任务执行完了才会执行新的语音任务。
// QUEUE_FLUSH:该模式下在有新任务时候会清除当前语音任务,执行新的语音任务
mTextToSpeech.speak(text,
TextToSpeech.QUEUE_ADD, null, null);
}
}
/**
* 结束播报
*/
@Override
public void stopSpeak() {
if (mTextToSpeech != null) {
mTextToSpeech.stop();
}
}
/**
* 语音播报完成回调
* @param utteranceId
*/
@Override
public void onUtteranceCompleted(String utteranceId) {
}
@Override
public void onStart(String utteranceId) {
}
@Override
public void onDone(String utteranceId) {
}
@Override
public void onError(String utteranceId) {
}
}
/**
* @author 拉莫帅
* @date 2022/8/15
* @address
* @Desc 主功能(TTS)
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private SpeechUtils speechUtils;
private EditText editText;
private ImageView speakButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
/**
* 初始化控件
*/
private void initView() {
speechUtils = SpeechUtils.getInstance(MainActivity.this);
editText = findViewById(R.id.editText);
speakButton = findViewById(R.id.btn);
speakButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
String speakText = editText.getText().toString().trim();
boolean empty = StrUtils.isEmpty(speakText);
if (empty) {
//执行播报
speechUtils.startSpeak("请您输入要播报的内容");
Toast.makeText(MainActivity.this, "请您输入要播报的内容", Toast.LENGTH_SHORT).show();
return;
} else {
speechUtils.startSpeak(speakText);
Toast.makeText(MainActivity.this, speakText, Toast.LENGTH_SHORT).show();
}
break;
}
}
/**
* 销毁
*/
@Override
protected void onDestroy() {
super.onDestroy();
//结束播报
speechUtils.stopSpeak();
}
}
真机调试
语音播报,本人应用多版本真机进行了测试,目前没有发现什么问题,欢迎大家来补充!
真机分别:红米手机、华为手机、华为平板、华为鸿蒙系统手机、vivo手机,以上机型实测有效。
真机版本如下:
今天拿朋友的Android 4、7小米平板真机调试,系统不支持中文播放


结尾
欢迎各位老板光临寒舍,共同学习,留言探讨!
项目地址:Android 语音播报功能之项目实战