问题
笔者使用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; @Override protected 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() { @Override public void onClick(View v) { // 在这里添加进行语音播报的代码 speakOut("Your text to be spoken"); } }); } // 初始化TextToSpeech引擎的回调 @Override public 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引擎 @Override protected 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中配置如下内容:
具体操作如下图所示:
具体代码:
若进行英语播报,进行到此处问题即可解决。若是需要进行中文播报,需继续,进行步骤2的配置。
步骤2、修改上述代码:
尤其为onInit函数中代码内容:
// 初始化TextToSpeech引擎的回调 @Override public 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 @Override protected 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() { @Override public void onClick(View v) { System.out.println("点击按钮"); // Do nothing if paused if (paused) { return; } // 在这里添加进行语音播报的代码 speakOut("点击按钮语音播报内容"); } }); } // 初始化TextToSpeech引擎的回调 @Override public 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引擎 @Override protected 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
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
猜你喜欢
- 11天前(三亚海棠湾君悦度假酒店)三亚海棠湾君悦酒店暑期夏令营悦趣海岛游招募中
- 11天前(2020海丝之路文化博览会)2023海丝之路文化和旅游博览会开幕
- 11天前(上海文旅产业发展高峰论坛)《上海打造文旅元宇宙新赛道行动方案》发布
- 11天前(瑞虎7plus2021款)重塑10万级SUV价值标杆,全新一代瑞虎7PLUS冠军版给你惊喜
- 11天前(福朋喜来登酒店宴会厅)福朋喜来登品牌亮相北部湾城市群 阳江中心福朋喜来登酒店开业
- 11天前(东北地区全域旅游)东北三省一区宣传贯彻研学旅游行业标准
- 11天前(甘肃文化旅游宣传片)甘肃文旅推介走进重庆
- 11天前(中国最好的避暑山庄)2025中国十大避暑山庄评选揭晓,澳涞山庄夺魁
- 11天前(中国旅游集团旗下酒店)中国旅游集团酒店控股有限公司战略投资雅阁酒店集团
- 11天前(锦江 iu)锦江荟APP原生鸿蒙版正式上线打造全场景旅行服务新体验
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章