导致TTS初始化失败的原因有哪些?

2024-04-13

在以下场景中观察到 TTS 初始化错误,该错误过于随机。

  • TTS 引擎已安装,语音集已存在,并且可以从辅助功能选项中播放示例 tts。

  • TTS 初始化在先前初始化和播放的同一设备上随机失败。

  • 在不同的设备(一加、华硕、三星)和各种 Android 操作系统版本中观察到此问题。

代码片段:

公共类 TTSHandler 实现 OnInitListener {

public EPUBReader context;
private TextToSpeech tts;
private HashMap<String, String> ttsMap;
private boolean isTtsPlaying = false,shouldResume = false,initialised = false,
            ttsModeEnabled = false;
private String textToRead;
private GoogleVersionPreferences mSharedPreferences;
private AudioManager mAudioManager;


@SuppressWarnings("deprecation")
public TTSHandler(EPUBReader context){

    this.context = context;
    tts = new TextToSpeech(context,this);

}

@Override
public void onInit(int status) {
    Log.d("TTS", "onInit called");
    if(status == TextToSpeech.SUCCESS){

        initialised = true;
        Log.d("TTS", "initialised success: status = "+status);
        initTTSComponents();

    }else{
        initialised = false;
        Log.d("TTS", " initialised failed: status ="+status);
    }

}

/**
 * called form JavascriptInterface
 * @param text is the sentence to be read
 */
public void readText(String text){

    if(text!=null){
        textToRead = text;
    }
    ttsMap = new HashMap<String, String>();
    ttsMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, textToRead);
    //for Next/Prev
    isTtsPlaying = true; 
    context.runOnUiThread(new Runnable(){
        @Override
        public void run() {
            context.toggleTtsIcons();
        }

    });

    tts.speak(textToRead,0, ttsMap);

}

/**
 * called to play,pause or resume tts play. 
 */
public void playPauseReading(){
    context.lockOrientationChange();
    AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    int volume = audio.getStreamVolume(AudioManager.STREAM_MUSIC);

    if(isTtsPlaying){

        isTtsPlaying = false;
        shouldResume = true;
        tts.stop();

    }else{

        isTtsPlaying = true;

        if(shouldResume){
            shouldResume = false;
            requestAudioFocusForTTS();
            JavaScriptInterface.loadJavascript("javascript:resumeUsingTts()", context.getEPUBReaderFragment().getWebview());
        }else{
            requestAudioFocusForTTS();
            if(volume <= 1){
                Toast.makeText(context,context.getResources().getString(R.string.tts_volume_alert), 300).show();
            }
            int dir = mSharedPreferences.getEpubNavigationSetting(context.bookId);
            JavaScriptInterface.loadJavascript("javascript:playFromRange("+dir+")", context.getEPUBReaderFragment().getWebview());

        }
    }
    context.toggleTtsIcons();
}

/**
 * called to stop playing tts 
 * highlight will be removed and we will hide the tts controls
 */
public void stopReading(){

    if(tts !=null && ttsModeEnabled){
        isTtsPlaying = false;
        shouldResume = false;
        ttsModeEnabled = false;
        tts.stop();
        Toast.makeText(context,context.getResources().getString(R.string.tts_stop) , 300).show();
        JavaScriptInterface.loadJavascript("javascript:stopUsingTts()", 
                context.getEPUBReaderFragment().getWebview());
        abandonAudioFocus();
        context.runOnUiThread(new Runnable(){

            @Override
            public void run() {
                context.toggleControlPanel(false);
                context.unlockOrientationChange();
                context.invalidateOptionsMenu();
            }

        });


    }
}


/**
 * To check the whether tts is playing or not 
 * @return
 */
public boolean isReading(){
    if(tts.isSpeaking()){
        return true;
    }
        return false;
}

/**
 *  called from javascriptInterface at the end of a chapter
 *  
 */
public void stopReadingOnEndOfChapter(){

    Log.d("TTS", "stopReadingOnEndOfChapter");
    shouldResume = false;
    isTtsPlaying = false;
    ttsModeEnabled = false;
    abandonAudioFocus();
    context.runOnUiThread(new Runnable(){

        @Override
        public void run() {
            context.toggleControlPanel(false);
            context.unlockOrientationChange();
            context.invalidateOptionsMenu();
            Toast.makeText(context,context.getResources().getString(R.string.end_of_chapter) , 300).show();

        }});


}

/**
 * called from javascriptInterface to disable tts mode when the chapter doesnt have any text content.
 */
public void stopOnNoContent(){

    Toast.makeText(context,context.getResources().getString(R.string.tts_no_content) , 300).show();
    shouldResume = false;
    isTtsPlaying = false;
    ttsModeEnabled = false;
    abandonAudioFocus();
    context.runOnUiThread(new Runnable(){

        @Override
        public void run() {
            context.toggleControlPanel(false);
            context.unlockOrientationChange();
            context.invalidateOptionsMenu();

        }});
}

/**
 * called from javascript to stop tts while user taps on links
 */
public void stopTtsOnLinks(){

    if(isReading() || shouldResume)
        Toast.makeText(context,context.getResources().getString(R.string.tts_stop) , 300).show();

    shouldResume = false;
    isTtsPlaying = false;
    ttsModeEnabled = false;
    tts.stop();
    context.toggleControlPanel(false);
    context.unlockOrientationChange();
    abandonAudioFocus();

}

/**
 * Will release the resources used by the TTS engine 
 */
public void shutDownTTS(){
    if(tts !=null){
        tts.shutdown();
    }
}

/**
 * called from EPUBReader to set the speech rate
 * @param speechRate
 */
public void setSpeechRate(int value){

    switch(value){
        case 0:
            tts.setSpeechRate((float)0.1);
            break;
        case 1:
            tts.setSpeechRate((float)0.5);
            break;
        case 2:
            tts.setSpeechRate((float)1);
            break;
        case 3:
            tts.setSpeechRate((float)1.5);
            break;
        case 4:
            tts.setSpeechRate((float)2);
            break;

    }

}

/**
 * called form EPUBReader to start playing the next line 
 */
public void playNext(){
    isTtsPlaying = false;
    tts.stop();
    JavaScriptInterface.loadJavascript("javascript:readNext()",context.getEPUBReaderFragment().getWebview());
}

/**
 * called form EPUBReader to start playing the previous line
 */
public void playPrevious(){
    isTtsPlaying = false;
    tts.stop();
    JavaScriptInterface.loadJavascript("javascript:playPrevious()",context.getEPUBReaderFragment().getWebview());
}

/**
 * if TTS engine is initialised successfully,
 *  we will set the listener and other components.
 */
private void initTTSComponents(){

    mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    tts.setSpeechRate(1);
    mSharedPreferences = GoogleVersionPreferences.getGoogleAppVersion(context);

    tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {

            @Override
            public void onStart(String utteranceId) {
                Log.d("TTS", "onStart:"+utteranceId);
            }

            @Override
            public void onError(String utteranceId) {
                Log.d("TTS", "onError ID:"+utteranceId);

            }

            @Override
            public void onDone(String utteranceId) {
                Log.d("BUG", "onDone, isTtsPlaying:"+isTtsPlaying);
                if(isTtsPlaying){
                    JavaScriptInterface.loadJavascript("javascript:readNext();",
                            ((EPUBReader) context).getEPUBReaderFragment().getWebview());
                }
            }

        });

}

/**
 * Requests audio focus so that when TTS starts 
 * other audio apps will be paused/ducked as per the app.
 */
private void requestAudioFocusForTTS(){

    mAudioManager.requestAudioFocus(null,AudioManager.STREAM_MUSIC , AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE);
}

/**
 *Will abandon the received audio Focus so that the 
 *previous app can attain it.
 */
private void abandonAudioFocus(){

    mAudioManager.abandonAudioFocus(null);
}




/**
 * getters and setters
 * @param value
 */
public void setisTtsPlaying(boolean value){
    isTtsPlaying = value;
}

public boolean isTtsPlaying(){
    return isTtsPlaying;
}

public void setshouldResume(boolean value){
     shouldResume = value;
}

public boolean shouldResume(){
    return shouldResume;
}

public boolean isTtsInitialised(){
    return initialised;
}

public boolean ttsModeEnabled(){
    return ttsModeEnabled;
}

public void setttsModeEnabled(boolean value){
    ttsModeEnabled = value;
}

}

注意:收集的日志:

对于三星设备(TabS 10.5 操作系统:5.0.2): E/SamsungTTS(20259): onLoadLanguage() - SamsungTTS 尚未准备好。

对于一加一(操作系统:6.0.1):

08-08 18:54:53.112:W/TextToSpeech(22946):停止失败:TTS 引擎连接未完全建立 08-08 18:56:15.869:I / TextToSpeech(22946):成功绑定到com.google.android.tts 08-08 18:56:16.060:I / TextToSpeech(22946):连接到ComponentInfo {com.google.android.tts/com.google.android.tts.service.GoogleTTSService}


我的 TTS 初始化失败,因为我使用的是 Android 11 模拟器,并且需要在 Android 清单中提及这一点

<queries>
        <intent>
            <action android:name="android.intent.action.TTS_SERVICE" />
        </intent>
</queries>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

导致TTS初始化失败的原因有哪些? 的相关文章

  • 有关 paddingStart 使用的冲突 lint 消息

    API 17 RTL 支持发布后 我将以下内容添加到我的清单中 android supportsRtl true 这导致 Lint 在我的视图中有 paddingLeft Right 的地方正确地向我发出这些警告 考虑添加 android
  • 删除视图并重新创建它

    有没有办法删除设置的视图 setContentView R layout set map center mapView MapView findViewById R id mapview 如果我再次调用此视图 则会收到一条错误消息 java
  • Android中如何将文件写入raw文件夹?

    我认为这是一个非常基本的问题 我目前正在编写这样的文件 File output new File exampleout mid 现在 我想将文件写入 myproject res raw 我读到我可以通过将完整的网址放在 中来做到这一点 但
  • 通过我的应用程序以编程方式插入新联系人,而不使用 Intent

    我正在使用一个应用程序 与手机联系人进行交互 我想将新联系人添加到我的手机联系人列表中 我已经尝试过以下代码 但它不起作用 void addContact Context ctx PreviewContactModel model Arra
  • Android/Java 创建辅助类来创建图表

    Goal 创建用于图形生成的辅助类 背景 我有 3 个片段 每个片段收集一些传感器数据 加速度计 陀螺仪 旋转 并使用 GraphView 绘制图表 以下是其中一个片段的代码 该代码当前工作正常 public class Gyroscope
  • 有没有办法替代Android中的标准Log?

    有没有办法以某种方式拦截对 android 中标准 Log 的调用并执行其他操作 在桌面 Java 中 人们通常会得到一些记录器 因此有多种方法可以安装不同的日志处理程序 实现 但是 Android似乎对Log有静态调用 我找不到任何有关替
  • Android Studio:Android 设备监视器未显示我的设备

    我的真实设备是索尼 Xperia c6502安卓版本4 3 我确定我将其连接到我的计算机然后打开开发者选项 USB调试 on 在 SDK 管理器中 Google USB 驱动程序已安装 I downloaded Xperia Z Drive
  • 错误 libGL.so:无法使用 Android 模拟器打开共享对象文件

    我试图在 Ubuntu 12 04 64 位 中运行 android 模拟器 但是 我收到以下错误 Starting emulator for AVD emulatr Failed to load libGL so error libGL
  • 仅在 Android 应用程序中使用 XHDPI 可绘制对象?

    如果您计划在不久的将来支持 LDPI MDPI HPDI 或许还有 XHDPI 那么是否可以在项目中仅包含 XHDPI 可绘制对象并让设备将其缩放到所需的分辨率 我已经测试过在 Photoshop 中将可绘制对象的大小调整为 MDPI 和
  • opencv人脸检测示例

    当我在设备上运行应用程序时 应用程序崩溃并显示以下按摩 java lang UnsatisfiedLinkError 无法加载 detector based tracker findLibrary 返回 null 我正在使用 OpenCV
  • cordova插件条码扫描仪打不开扫描

    我的条形码扫描仪插件有问题 我不是天才 我不太了解如何编写网络应用程序 我使用phonegap和cordova 并且尝试制作一个网络应用程序 在单击链接后扫描条形码 我之前已经使用此命令行安装了该插件 cordova plugin add
  • Proguard - 找不到任何超级类

    我收到此错误 Unexpected error while performing partial evaluation Class org apache log4j chainsaw Main Method
  • 如何从webkit浏览器中检测Android版本和品牌?

    如何通过webkit浏览器检测Android版本和品牌 可靠吗 我相信你可以检查用户代理 但是 我认为它不安全 因为有很多方法可以用来欺骗用户代理 在谷歌上搜索这个问题给了我们很多答案 它甚至可以在默认浏览器上运行 您只需输入 about
  • Android 发布到 facebook 墙,stream.publish 几天来就中断了

    我有很多使用 FB android sdk 发布的应用程序 github com facebook facebook android sdk 我所有使用 FB 的应用程序几天后就停止工作了 这必然是 FB 方面的更改或错误 因为我的应用程序
  • 与 Dagger 一起使用时,Espresso 生成 FileNotFoundException

    我一直在研究旧版 Android 应用程序 尝试为其添加测试和适当的架构 该应用程序有一个主要LaunchActivity它在启动时运行一系列检查 最初 该活动使用 Dagger 来 注入依赖项 活动将使用它来运行检查 但效果相当糟糕 我转
  • 确定视图是否在屏幕上 - Android

    我对这个有点困惑 首先也是最重要的是 以下链接很有用 但是我提出了一些可见性问题 链接 检查视图可见性 https stackoverflow com questions 4628800 android how to check if a
  • 为什么 ExpandableListView 更改 ChildView 设置(Android)?

    我对使用 ExpandableListView 有疑问 就我而言 我有两个组视图和两个子视图 而子视图由一个带有多个按钮 文本视图等的相对布局组成 例如 当首先扩展第二组并对视图持有者进行一些更改并随后扩展第一组时 先前所做的更改也会自动应
  • Android UnityPlayerActivity 操作栏

    我正在构建一个 Android 应用程序 其中包含 Unity 3d 交互体验 我已将 Unity 项目导入 Android Studio 但启动时该 Activity 是全屏的 并且不显示 Android 操作栏 我怎样才能做到这一点 整
  • 当我使用 ListView 时,ListTile OnTap 正在工作。但是当我使用 ListWheelScrollView 时它不起作用

    当我使用 ListView 时 ListTile OnTap 正在工作 但是当我使用 ListWheelScrollView 时它不起作用 我的意思是它不会被窃听 观点发生变化 但我似乎无法点击它 我在很多地方和链接中寻找解决方案 但仍然找
  • 画布:尝试使用回收的位图错误

    我是一个相当新的程序员 所以任何建议将不胜感激 我有一个类 每次调用它时都会在循环中运行 AsyncTask AsyncTask 看起来像这样 public class LoadImageTask extends AsyncTask

随机推荐