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

这篇具有很好参考价值的文章主要介绍了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;

    @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中配置如下内容:
具体操作如下图所示:
android 开发 W/TextToSpeech: speak failed: not bound to TTS engine,android,android-studio
具体代码:

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

若进行英语播报,进行到此处问题即可解决。若是需要进行中文播报,需继续,进行步骤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

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
android 开发 W/TextToSpeech: speak failed: not bound to TTS engine,android,android-studio文章来源地址https://www.toymoban.com/news/detail-808262.html

到了这里,关于android 开发 W/TextToSpeech: speak failed: not bound to TTS engine的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

    PHP Warning \\\'yiibaseErrorException\\\' with message \\\'file_get_contents(https://img12.360buyimg.com/n5/s1200x800_jfs/t1/69307/10/5911/292411/5d3e610cEce4e6f5a/b69fbf56874af00d.jpg): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found 上面问题很多种处理方案;比如使用curl等可以参考其他使用产景 定时任务脚本中存在一

    2024年02月05日
    浏览(50)
  • Nginx报错Failed to restart nginx.service: Unit not found.

    报错截图:在经过编译安装依赖包等一系列操作后nginx -t后发现配置文件没有问题后发现nginx服务找不到但是nginx版本是已经安装好的  解决方法: 1、在根目录下执行 插入代码 2、使用下面命令进入目录 3、依次执行下列命令 4、开启nginx服务并且查看 出现如下页面说明nginx服

    2024年02月12日
    浏览(41)
  • Linux解决 Failed to restart NetworkManager.service: Unit not found问题

    如果你遇到了“Failed to restart NetworkManager.service: Unit not found.”的错误信息,不要担心!这个问题很常见,并且很容易解决。下面是解决这个问题的步骤,让我来一步一步地教给你。 步骤概览 以下是解决问题的步骤概览: 步骤 描述 步骤 1 检查NetworkManager是否已安装 步骤 2 安

    2024年02月06日
    浏览(50)
  • 【异常解决】(一)解决docker报错failed to compute cache key: “...“ not found

    本文章仅做记录异常用途 使用.net core右键LY.ProductSchedularService.Api自动生成dockerfile 并使用 构建镜像时,报错提示: failed to compute cache key: “/App/LY/NetCore/LY.Common/LY.Common.csproj” not found: not found DockerFile如下 原因分析: Dockerfile不能跟LY.ProductSchedularService.Api项目同级的,因为该项

    2024年02月11日
    浏览(46)
  • Docker启动rabbitmq失败Failed to create thread: Operation not permitted (1)

    Docker启动容器后ps查看不到,如rabbitmq Failed to create thread: Operation not permitted (1) 1、搜索镜像 2、拉取镜像 3、启动容器 4、查看运行中容器 5、查看容器 6、查看容器日志,报错 Failed to create thread: Operation not permitted (1) Aborted (core dumped) --docker内的用户权限受限 7、解决办法: 启动

    2024年02月05日
    浏览(69)
  • Failed to load resource: net::ERR_FILE_NOT_FOUND问题解决

    publicPath 是告诉 webpack 打包后的文件在浏览器中的访问路径。当你设置 publicPath: \\\'./\\\' 时,实际上是将构建后的资源相对于当前路径进行引用。 相对路径引用: 默认情况下,Vue CLI 生成的项目会把所有静态资源引用路径设置为绝对路径,即 /static/... 。这适用于大多数情况,尤其

    2024年02月20日
    浏览(50)
  • Docker安装Failed to start docker.service: Unit docker.service not found.

    CentOS安装Docker,启动时候报错 Failed to start docker.service: Unit docker.service not found. (如下:),原因是CentOS默认使用podman代替docker,所以需要将podman卸载. 一、解决办法: 输入 yum erase podman buildah 卸载podaman,之后输入y,等待卸载直到出现“完毕”。 解决了这个问题之后便可以安装了

    2024年02月12日
    浏览(49)
  • Mysql问题:Failed to stop mysqld.service: Unit mysqld.service not loaded

    1 环境 :ubuntu 2 问题描述 : 停止mysql服务,输入命令: 出现如下报错: 3 解决 : 输入命令: 执行结果: 停止mysql服务,再次输入命令: 4 验证 : 查询mysql进程,输入命令: 执行结果: 没有mysql进程,说明mysql已经关闭。

    2024年02月16日
    浏览(50)
  • vscode远程调试报错could not establish connection to xhr failed解决方案

    windows系统使用vscode远程调试插件ssh连接linux服务器时提示报错 网络不通或者其他原因导致 ~/.vscode-server/bin/${commit_id} 目录下的文件 vscode-server-linux-x64.tar.gz 不完整,或者文件为0. 其中commit_id可以在vscode的ssh连接日志中找到,点击途中箭头的位置可以看到ssh连接日志。 1. 清理

    2024年02月16日
    浏览(43)
  • error: src refspec master does not match anyerror: failed to push some refs to 解决方案

         是本地仓库add后未commit的原因 中间如果出现报错,先不要处理,只要走完这4步,基本上没有问题。 我在处理时,在走某个步骤时出现了报错,我也是一步步走的。最后项目成功提交至服务器 第1步:先添加文件 第2步:远程初始化 第3步:添加至远程 第4步:提交 其实

    2024年02月03日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包