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); 此时ÿ…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
