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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git rev-parse v406 ‘v4.0.4‘^{} master什么意思?

git rev-parse 是一个 Git 命令&#xff0c;用于解析出 git 对象&#xff08;如分支、标签、提交等&#xff09;的完整 SHA-1 哈希值。这个命令对于理解 git 中各种引用的内部表示非常有用。 让我们一步步分析 git rev-parse v406 v4.0.4^{} master 这条命令&#xff1a; v406…

[嵌入式软件][入门篇][仿真平台] STM32F103实现LED、按键

上一篇&#xff1a;[嵌入式软件][入门篇] 搭建在线仿真平台(STM32) 文章目录 一、点亮LED灯(1) 简介(2) 示例代码(3) 仿真效果&#xff08;闪烁&#xff09; 二、按键检测(1) 简介1. 按键原理2. 检测按键端口3. 消抖 (2) 示例代码1 &#xff08;按下点亮&#xff0c;松开熄灭&a…

微信小程序海报插件Painter 2.0(canvas画图)使用并保存图片到相册案例

一、下载与引入 Painter通过 json 数据形式&#xff0c;来进行动态渲染并绘制出图片。 Painter 的优势 功能全&#xff0c;支持文本、图片、矩形、qrcode 类型的 view 绘制布局全&#xff0c;支持多种布局方式&#xff0c;如 align&#xff08;对齐方式&#xff09;、rotate&…

一个简单的Web程序(详解创建一个Flask项目后自带的一个简单的Web程序)

程序代码截图如下&#xff1a; 1.应用初始化 在创建 Flask 程序时&#xff0c;通常需要先创建一个应用实例进行应用初始化。 from flask import Flask # 应用的初始化 app Flask(__name__) 上述代码中&#xff0c;使用 Flask 类创建了一个应用实例 app。 __name__ 参数用…

理解 Stable Diffusion、模型检查点(ckpt)和变分自编码器(VAE)

前言 在探索深度学习和人工智能领域的旅途中&#xff0c;理解Stable Diffusion、模型检查点(ckpt)以及变分自编码器(VAE)之间的关系至关重要。这些组件共同构成了当下一些最先进图像生成系统的基础。本文将为初学者提供一个详细的概述&#xff0c;帮助您理解这些概念以及它们是…

mp4文件可以转成mp3音频吗

现在是个非常流行刷短视频一个年代&#xff0c;刷短视似乎成了人们休闲娱乐的一种方式&#xff0c;在日常刷短视频过程中&#xff0c;肯定会有很多同学被短视频 bgm 神曲洗脑&#xff0c;比如很多被网红翻唱带火的歌曲&#xff0c;例如其中"不负人间”&#xff0c;就是其中…

Python 散点图的绘制(Seaborn篇-03)

Python 散点图的绘制(Seaborn篇-03)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

【温故而知新】HTML5拖放/地理定位/浏览器支持

文章目录 一、概念二、拖放三、地理定位&#xff08;Geolocation&#xff09;四、浏览器支持 一、概念 HTML5是HTML的最新版本&#xff0c;它引入了许多新的元素和功能&#xff0c;以适应现代网页开发的需求。以下是HTML5的一些主要特点&#xff1a; 新增语义元素&#xff1a…

go获取文件md5值不正确的问题记录

一次偶然的操作&#xff0c;发现了一些端倪&#xff0c;获取md5时如下是常规操作&#xff1a; md5hash : md5.New()file, _ : os.Open(filename)defer file.Close()_, err : io.Copy(md5hash, file) // file 为*os.File类型&#xff0c;即读取文件后的文件对象if err ! nil {r…

2024年1月19日Arxiv最热NLP大模型论文:Self-Rewarding Language Models

超越人类反馈限制&#xff0c;Meta自我奖励语言模型刷新AlpacaEval 2.0排行榜 引言&#xff1a;超越人类的AI代理——自我奖励语言模型的探索 在人工智能的发展历程中&#xff0c;我们一直在探索如何打造出能够超越人类智慧的AI代理。这些代理不仅需要能够理解和执行人类的指…

BuildRoot配置RTL8822CE WIFIBT模块(BT部分)

BuildRoot配置RTL8822CE WIFI&BT模块&#xff08;WIFI部分&#xff09;-CSDN博客 WIFI部分更新一下&#xff1a; ①、rkwifibt.mk 查看了output/rockchip_rk3399_tinkerboard2/build/的两个目录都有wifi相关的ko(后面make clean之后剩下linux-headers-custom路径的)&…

使用函数计算,数禾如何实现高效的数据处理?

作者&#xff1a;邱鑫鑫&#xff0c;王彬&#xff0c;牟柏旭 公司背景和业务 数禾科技以大数据和技术为驱动&#xff0c;为金融机构提供高效的智能零售金融解决方案&#xff0c;服务银行、信托、消费金融公司、保险、小贷公司等持牌金融机构&#xff0c;业务涵盖消费信贷、小…

菜鸟关于做前、后端的整理(html、js),以及疑问

涉及到后端的接口py&#xff0c;前端html和js 这三部分就按照如下格式放到server项目主路径下&#xff0c;这样后端机可以作为一个前端server main.pystaticmain.jsmain.htmlhtml 首先是html要设定网页的显示 <!DOCTYPE html> <html> <head><title>…

电力能源实景三维可视化合集,智慧电网数字孪生

电力能源是现代社会发展和运行的基石&#xff0c;渗透于工业、商业、农业、家庭生活等方方面面&#xff0c;它为经济、生活质量、环境保护和社会发展提供了巨大的机会和潜力。图扑软件应用自研 HT for Web 强大的渲染引擎&#xff0c;助力现代化的电力能源数字孪生场景&#xf…

【Vue】vue项目中Uncaught runtime errors:怎样关闭

vue项目中Uncaught runtime errors:怎样关闭 一、背景描述二、报错原因三、解决方案3.1 只显示错误信息不全屏覆盖3.2 取消全屏覆盖 四、参考资料 一、背景描述 项目本来运行的好好&#xff0c;换了个新的浏览器&#xff0c;新的Chrome浏览器版本号是116.0.5845.97&#xff08…

视频增强修复Topaz Video AI

Topaz Video AI是一款强大的视频增强软件&#xff0c;利用人工智能技术对数千个视频进行训练&#xff0c;结合多个输入视频的帧信息来提高素材的分辨率。该软件可将视频的分辨率提高到最高8K&#xff0c;并保持真实的细节和运动一致性。同时&#xff0c;它还能自动修复视频中的…

HCIA-HarmonyOS设备开发认证-序

序 最近涉及到HarmonyOS鸿蒙系统设备开发&#xff0c;在网络上已经有很多相关资料&#xff0c;视频教程&#xff0c;我也移植了公司的一个stm32G474板卡&#xff0c;运行LiteOS-m L0系统。 一面看资料一面移植&#xff0c;遇到不少坑&#xff0c;当看到运行的LOGO时&#xff0…

【ARMv8M Cortex-M33 系列 7.4 -- 如何使能 usagefault | memmange fault | bus fault 中断】

请阅读【嵌入式开发学习必备专栏 之 ARM Cortex-Mx专栏】 文章目录 背景异常使能配置 背景 由于文章【ARMv8M Cortex-M33 系列 7.2 – HardFault 问题定位 1】 中提到了HardFault 的发生是由于其它异常所升级导致的&#xff0c;所以就需要调查下如何是能其它异常中断。 异常使…

vue同时触发两个函数

1:同时触发两个函数 在 Vue 中&#xff0c;你可以在一个点击事件中同时触发多个方法。方法调用使用分号来分隔。 click"changeColor(); changeBgc()" 这样&#xff0c;当你点击这个元素时&#xff0c;changeColor()和 changeBgc() 两个方法都会被依次执行。 2&…

protobuf学习日记 | 认识protobuf中的类型

目录 前言 一、标量数据类型 二、protobuf中的 “数组” 三、特殊类型 1、枚举类型 &#xff08;1&#xff09;类型讲解 &#xff08;2&#xff09;升级通讯录 2、Any类型 &#xff08;1&#xff09;类型讲解 &#xff08;2&#xff09;升级通讯录 3、oneof类型 …