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
问题 笔者使用TTS(TextToSpeech)对于文本内容进行语音播报,控制台报错 android 开发 speak failed:not bound to TTS engine详细问题 笔者核心代码: import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.speech.tts.…...

Java代码审计Shiro反序列化DNS利用链CC利用链AES动态调试
目录 0x00 前言 0x01 Java原生反序列化介绍 0x02 安全问题1:重写toString方法(打印对象时触发) 0x03 安全问题2:重写readObject(反序列化时触发) 0x04 测试URLDNS链 0x05 Shiro550生成RememberMe Coo…...
【MySQL】临时变量用法
力扣题 1、题目地址 2388. 将表中的空值更改为前一个值 2、模拟表 表:CoffeeShop Column NameTypeidintdrinkvarchar id 是该表的主键(具有唯一值的列)。该表中的每一行都显示了订单 id 和所点饮料的名称。一些饮料行为 null。 3、要求…...
Flask框架小程序后端分离开发学习笔记《4》向服务器端发送模拟请求-爬虫
Flask框架小程序后端分离开发学习笔记《4》向服务器端发送模拟请求-爬虫 Flask是使用python的后端,由于小程序需要后端开发,遂学习一下后端开发。 下面代码,是一个比较老的版本了,可以借鉴一下。 import socket import ssldef p…...
Android在系统界面上添加窗口
WindowManager.addView()是Android中的一个方法,用于在屏幕上添加一个窗口。它允许你在应用程序的上下文之外创建一个窗口,并将其显示在其他应用程序或系统界面上。 新建一个自定义View用于显示 class MyView JvmOverloads constructor(context: Contex…...

【正点原子STM32】STM32原理图设计(芯片手册和数据手册、常见引脚类型、最小系统和IO分配)
一、学会查看数据手册 获取芯片数据手册数据手册内容概要芯片的基本参数(STM32F103ZET6为例)正点原子开发板对应的主控型号和封装STM32F103ZET6引脚分布常见的STM32引脚类型下载接口 二、最小系统 电源电路复位电路BOOT启动电路晶振电路下载调试电路串…...
低代码自动化平台| 游戏规则改变者
自动化测试对于软件开发公司起着非常重要的作用。它在公司及其客户之间建立了对优质产品的信任。此外,它还使软件开发人员更加自信,因为他们可以在其他模块上工作,而不必担心应用程序的任何现有功能是否存在错误。在软件测试中融入自动化是必…...

【分享】MathWorks中国汽车年会:“软件定义汽车”
从软件赋能到软件定义,汽车行业不仅需要解决诸如错误发现滞后带来的高昂代价、功能融合所需的跨学科知识、功能安全与实施成本之间的权衡等老问题,也面临着新的挑战:软件复杂度的不断提升、利用数据驱动创造价值、人工智能的引入和实现、数字…...

RNN:Long Short-term Memory(中)
目录 1 LSTM 的简图 2 LSTM 的整体结构 2.1 结构图 2.2 流程图 3 举个例子 3.1 简单看看 3.2 代入 LSTM 4 Original Network v.s. LSTM 5 细看 LSTM 原视频:李宏毅 2020:Recurrent Neural Network (Part I) 1 LSTM 的简图 LSTM 实际…...

C# .NET读取Excel文件并将数据导出到DataTable、数据库及文本
Excel文件是存储表格数据的普遍格式,因此能够高效地读取和提取信息对于我们来说至关重要。C#语言借助.NET Framework和各种库的广泛功能,能够进行高效的数据操作。利用C#读取Excel文件并将数据写入数据库和DataTable,或者将数据用于其他目的&…...

移动云助力智慧交通数智化升级
智慧交通是在整个交通运输领域充分利用物联网、空间感知、云计算、移动互联网等新一代信息技术,综合运用交通科学、系统方法、人工智能、知识挖掘等理论与工具,以全面感知、深度融合、主动服务、科学决策为目标,推动交通运输更安全、更高效、…...
【Vue技巧】vue 阻止a链接跳转事件的两种方法
ChatGPT4.0国内站点,支持设计稿转代码:https://www.atalk-ai.com/ 在Vue中,如果你想阻止<a>链接的默认跳转事件,你可以使用click.prevent或者click配合.prevent修饰符。这样做可以阻止链接的默认行为,即不会跳转…...

006.Oracle事务处理
我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…...

成功解决VScode进入到内置函数中调试
主要有两个关键步骤, 第一步 将launch.json中的"justMyCode"设为false 可通过使用ctrlshiftP搜索lauch.json找到次文件 如果找不到的话,可点击debug按钮,然后找到点击create a launch.json file创建 创建得到的launch.json如下&am…...

29、WEB攻防——通用漏洞SQL注入增删改查盲注延迟布尔报错
文章目录 盲注增删改查 盲注 概念:在注入过程中,获取的数据不能回显至前端页面,此时我们需要利用一些方法进行判断或尝试,这个过程被称为盲注。 解决:常规的联合查询注入不行的情况。 分类: 基于布尔的SQ…...
【设计模式 行为型】策略模式
它允许在运行时根据需要选择算法的行为。该模式通过将算法封装成独立的类,使得它们可以相互替换,而不影响使用算法的客户端代码。 策略模式主要包含以下角色: 环境(Context):环境对象持有一个策略对象的引…...

JVM:双亲委派机制类加载器
JVM:双亲委派机制 1. 例子2. 类加载器总结3. 类加载过程4. 双亲委派模型的执行流程:5. 双亲委派模型的好处 1. 例子 Java运行时环境有一个java.lang包,里面有一个ClassLoader类 我们自定义一个String类在java.lang包下,下面的…...
从入门到精通:ThinkPHP6异步请求的全面解析!
在ThinkPHP6中使用异步请求 在Web应用程序的开发中,经常会需要使用异步请求。异步请求能够在后台执行而不干扰页面的其他操作,提高了用户的体验。而在ThinkPHP6框架中,也提供了方便的异步请求方式,本文将详细介绍如何在ThinkPHP6…...
C++写csv文件
C写csv文件 其中有一个点需要注意,csv芬里尔之间要用逗号隔开 p_str_filename "D:\\1.csv"; int writelog(string p_str_filename, double p_double[]) {SYSTEMTIME timeCur;GetLocalTime(&timeCur);char t_logbuffer[1024] { 0 };sprintf(t_logbu…...
将Matlab图窗中的可视化保存为背景透明的矢量图
将matlab绘制的结果复制为矢量图时,去除背景的操作如下: 先打开/绘制图形窗口(不要关闭)在命令行终端输入axis off关闭坐标系继续在命令行终端分别输入: ax gca; copygraphics(ax,ContentType,vector,BackgroundColor,none); 此时ÿ…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...