android 开发 W/TextToSpeech: speak failed: not bound to TTS engine

2024-01-20 16:12

本文主要是介绍android 开发 W/TextToSpeech: speak failed: not bound to TTS engine,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

笔者使用TTS(TextToSpeech)对于文本内容进行语音播报,控制台报错

android 开发 speak failed:not bound to TTS engine

详细问题

笔者核心代码:

import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.util.Log;
import android.view.View;import androidx.appcompat.app.AppCompatActivity;import com.google.android.material.floatingactionbutton.FloatingActionButton;import java.util.Locale;public class LoginActivity extends AppCompatActivity implements OnInitListener {private FloatingActionButton speakButton;private TextToSpeech textToSpeech;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);// 初始化TextToSpeech引擎textToSpeech = new TextToSpeech(this, this);// 找到按钮speakButton = findViewById(R.id.speakButton);// 设置按钮点击事件speakButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 在这里添加进行语音播报的代码speakOut("Your text to be spoken");}});}// 初始化TextToSpeech引擎的回调@Overridepublic void onInit(int status) {if (status == TextToSpeech.SUCCESS) {// 设置语音引擎的语言,例如英语int result = textToSpeech.setLanguage(Locale.ENGLISH);if (result == TextToSpeech.LANG_MISSING_DATA ||result == TextToSpeech.LANG_NOT_SUPPORTED) {Log.e("TTS", "Language is not supported.");}} else {Log.e("TTS", "Initialization failed.");}}// 进行语音播报的方法private void speakOut(String text) {textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, null);}// 在Activity销毁时释放TextToSpeech引擎@Overrideprotected void onDestroy() {if (textToSpeech != null) {textToSpeech.stop();textToSpeech.shutdown();}super.onDestroy();}
}

运行控制台报错内容:

W/TextToSpeech: speak failed: not bound to TTS engine

解决方案

步骤1、 在package\app\src\main\AndroidManifest.xml中配置如下内容:
具体操作如下图所示:
在这里插入图片描述
具体代码:

<queries><intent><action android:name="android.intent.action.TTS_SERVICE"/></intent>
</queries>

若进行英语播报,进行到此处问题即可解决。若是需要进行中文播报,需继续,进行步骤2的配置。

步骤2、修改上述代码:
尤其为onInit函数中代码内容:

	// 初始化TextToSpeech引擎的回调@Overridepublic void onInit(int status) {if (status == TextToSpeech.SUCCESS) {int result = textToSpeech.setLanguage(Locale.CHINESE);if (result == TextToSpeech.LANG_MISSING_DATA ||result == TextToSpeech.LANG_NOT_SUPPORTED) {Log.e("TTS", "不支持中文语音合成。");if (result == TextToSpeech.LANG_MISSING_DATA) {Log.e("TTS", "缺少中文语音数据,正在下载...");Intent installIntent = new Intent();installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);startActivity(installIntent);}} else {// 检查语音数据是否已下载if (textToSpeech.isLanguageAvailable(Locale.CHINESE) >= TextToSpeech.LANG_AVAILABLE) {Log.i("中文语音数据已完整下载");speakOut("打开该页面语音播报内容");paused = false; // 在初始化完成后将paused设置为false} else {Log.e("TTS", "中文语音数据未完整下载。");}}} else {Log.e("TTS", "TextToSpeech引擎初始化失败。");}}

完整代码:

import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import android.view.View;import androidx.appcompat.app.AppCompatActivity;import com.google.android.material.floatingactionbutton.FloatingActionButton;import java.util.Locale;
public class LoginActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {private FloatingActionButton speakButton;private TextToSpeech textToSpeech;private boolean paused = true; // Initialize paused to true@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);// 请求音频焦点AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);int result = audioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {Log.i("TTS", "Audio focus requested successfully.");} else {Log.e("TTS", "Failed to request audio focus.");}// 初始化TextToSpeech引擎textToSpeech = new TextToSpeech(this, this);// 找到按钮speakButton = findViewById(R.id.speakButton);// 设置按钮点击事件speakButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {System.out.println("点击按钮");// Do nothing if pausedif (paused) {return;}// 在这里添加进行语音播报的代码speakOut("点击按钮语音播报内容");}});}// 初始化TextToSpeech引擎的回调@Overridepublic void onInit(int status) {if (status == TextToSpeech.SUCCESS) {int result = textToSpeech.setLanguage(Locale.CHINESE);if (result == TextToSpeech.LANG_MISSING_DATA ||result == TextToSpeech.LANG_NOT_SUPPORTED) {Log.e("TTS", "不支持中文语音合成。");if (result == TextToSpeech.LANG_MISSING_DATA) {Log.e("TTS", "缺少中文语音数据,正在下载...");Intent installIntent = new Intent();installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);startActivity(installIntent);}} else {// 检查语音数据是否已下载if (textToSpeech.isLanguageAvailable(Locale.CHINESE) >= TextToSpeech.LANG_AVAILABLE) {Log.i("TTS", "中文语音数据已完整下载");speakOut("打开该页面语音播报内容");paused = false; // 在初始化完成后将paused设置为false} else {Log.e("TTS", "中文语音数据未完整下载。");}}} else {Log.e("TTS", "TextToSpeech引擎初始化失败。");}}// 进行语音播报的方法private void speakOut(String text) {textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, null);}// 在Activity销毁时释放TextToSpeech引擎@Overrideprotected void onDestroy() {if (textToSpeech != null) {textToSpeech.stop();textToSpeech.shutdown();}super.onDestroy();}
}

产生原因

按照官方文档要求,在Android11需要在manifest里声明TTS_SERVICE,以开启(英文)语音播报服务,而笔者的AndroidManifest.xml中缺少对TTS服务的配置。
(中文)语音数据未完整下载: 在笔者的代码中,由于涉及对中文语音播报服务。如果中文语音数据未完整下载,也将导致TTS引擎可能无法正确工作。

解决原因

具体来说,以下是问题解决的原因:

步骤1、通过在AndroidManifest.xml中添加TTS服务的查询,可以确保应用可以与TTS引擎正确通信。

步骤2.1、
中文语音数据未完整下载: 在onInit方法中,通过判断result是否等于TextToSpeech.LANG_MISSING_DATA来检测语音数据是否完整。如果数据不完整,会触发语音数据下载的操作。

if (result == TextToSpeech.LANG_MISSING_DATA) {Log.e("TTS", "缺少中文语音数据,正在下载...");Intent installIntent = new Intent();installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);startActivity(installIntent);
}

通过执行上述代码块,程序尝试在语音数据不完整时触发下载。

步骤2.2
设置语言为中文: 通过

textToSpeech.setLanguage(Locale.CHINESE)

将语音引擎的语言设置为中文。

int result = textToSpeech.setLanguage(Locale.CHINESE);

确保了TTS引擎使用中文语音数据进行合成。

步骤2.3
检查语音数据是否已完整下载: 通过检查语音数据是否已完整下载,以确保语音引擎能够正常使用。

if (textToSpeech.isLanguageAvailable(Locale.CHINESE) >= TextToSpeech.LANG_AVAILABLE) {Log.i("TTS", "中文语音数据已完整下载");speakOut("打开该页面语音播报内容");paused = false;
} else {Log.e("TTS", "中文语音数据未完整下载。");
}

这段代码会检查中文语音数据是否已完整下载,如果下载完成,则继续进行语音合成。

通过这些处理步骤,解决中文语音数据未完整下载的问题,使得TTS引擎能够正确初始化和使用。

总结

stackoverflow作为程序设计领域世界知名的问答网站,问答质量很高。但是该平台中国用户相对较少,对于中国用户可能会遇到的问题,该网站有时无法解决(譬如本文中所提及的中文语音数据下载相关内容)。这时,CSDN往往也可以作为一个不错的选择。

参加文献

speak failed:not bound to TTS engine解决方案
产生原因与解决原因部分内容 部分参考chatgpt

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
请添加图片描述

这篇关于android 开发 W/TextToSpeech: speak failed: not bound to TTS engine的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626574

相关文章

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要